summaryrefslogtreecommitdiffstats
path: root/mojo/public/cpp/bindings/lib/bindings_internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'mojo/public/cpp/bindings/lib/bindings_internal.h')
-rw-r--r--mojo/public/cpp/bindings/lib/bindings_internal.h141
1 files changed, 141 insertions, 0 deletions
diff --git a/mojo/public/cpp/bindings/lib/bindings_internal.h b/mojo/public/cpp/bindings/lib/bindings_internal.h
new file mode 100644
index 0000000..ef6fc47
--- /dev/null
+++ b/mojo/public/cpp/bindings/lib/bindings_internal.h
@@ -0,0 +1,141 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_
+#define MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_
+
+#include "mojo/public/cpp/system/core.h"
+
+namespace mojo {
+namespace internal {
+template <typename T> class Array_Data;
+
+#pragma pack(push, 1)
+
+struct StructHeader {
+ uint32_t num_bytes;
+ uint32_t num_fields;
+};
+MOJO_COMPILE_ASSERT(sizeof(StructHeader) == 8, bad_sizeof_StructHeader);
+
+struct ArrayHeader {
+ uint32_t num_bytes;
+ uint32_t num_elements;
+};
+MOJO_COMPILE_ASSERT(sizeof(ArrayHeader) == 8, bad_sizeof_ArrayHeader);
+
+template <typename T>
+union StructPointer {
+ uint64_t offset;
+ T* ptr;
+};
+MOJO_COMPILE_ASSERT(sizeof(StructPointer<char>) == 8, bad_sizeof_StructPointer);
+
+template <typename T>
+union ArrayPointer {
+ uint64_t offset;
+ Array_Data<T>* ptr;
+};
+MOJO_COMPILE_ASSERT(sizeof(ArrayPointer<char>) == 8, bad_sizeof_ArrayPointer);
+
+union StringPointer {
+ uint64_t offset;
+ Array_Data<char>* ptr;
+};
+MOJO_COMPILE_ASSERT(sizeof(StringPointer) == 8, bad_sizeof_StringPointer);
+
+#pragma pack(pop)
+
+template <typename T>
+void ResetIfNonNull(T* ptr) {
+ if (ptr)
+ *ptr = T();
+}
+
+template <typename T>
+T FetchAndReset(T* ptr) {
+ T temp = *ptr;
+ *ptr = T();
+ return temp;
+}
+
+template <typename T>
+class WrapperHelper {
+ public:
+ static const T Wrap(const typename T::Data* data) {
+ return T(typename T::Wrap(), const_cast<typename T::Data*>(data));
+ }
+ static typename T::Data* Unwrap(const T& object) {
+ return const_cast<typename T::Data*>(object.data_);
+ }
+};
+
+template <typename Data>
+inline const typename Data::Wrapper Wrap(const Data* data) {
+ return WrapperHelper<typename Data::Wrapper>::Wrap(data);
+}
+
+template <typename T>
+inline typename T::Data* Unwrap(const T& object) {
+ return WrapperHelper<T>::Unwrap(object);
+}
+
+template <typename T> struct TypeTraits {
+ static const bool kIsObject = true;
+};
+template <> struct TypeTraits<bool> {
+ static const bool kIsObject = false;
+};
+template <> struct TypeTraits<char> {
+ static const bool kIsObject = false;
+};
+template <> struct TypeTraits<int8_t> {
+ static const bool kIsObject = false;
+};
+template <> struct TypeTraits<int16_t> {
+ static const bool kIsObject = false;
+};
+template <> struct TypeTraits<int32_t> {
+ static const bool kIsObject = false;
+};
+template <> struct TypeTraits<int64_t> {
+ static const bool kIsObject = false;
+};
+template <> struct TypeTraits<uint8_t> {
+ static const bool kIsObject = false;
+};
+template <> struct TypeTraits<uint16_t> {
+ static const bool kIsObject = false;
+};
+template <> struct TypeTraits<uint32_t> {
+ static const bool kIsObject = false;
+};
+template <> struct TypeTraits<uint64_t> {
+ static const bool kIsObject = false;
+};
+template <> struct TypeTraits<float> {
+ static const bool kIsObject = false;
+};
+template <> struct TypeTraits<double> {
+ static const bool kIsObject = false;
+};
+template <> struct TypeTraits<Handle> {
+ static const bool kIsObject = false;
+};
+template <> struct TypeTraits<DataPipeConsumerHandle> {
+ static const bool kIsObject = false;
+};
+template <> struct TypeTraits<DataPipeProducerHandle> {
+ static const bool kIsObject = false;
+};
+template <> struct TypeTraits<MessagePipeHandle> {
+ static const bool kIsObject = false;
+};
+
+template <typename T> class ObjectTraits {};
+
+} // namespace internal
+} // namespace mojo
+
+#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_