| // 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_BINDINGS_LIB_BINDINGS_INTERNAL_H_ |
| #define MOJO_PUBLIC_BINDINGS_LIB_BINDINGS_INTERNAL_H_ |
| |
| #include "mojo/public/system/core_cpp.h" |
| |
| namespace mojo { |
| template <typename T, typename U> class TypeConverter {}; |
| |
| 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<MessagePipeHandle> { |
| static const bool kIsObject = false; |
| }; |
| |
| template <typename T> class ObjectTraits {}; |
| |
| } // namespace internal |
| } // namespace mojo |
| |
| #endif // MOJO_PUBLIC_BINDINGS_LIB_BINDINGS_INTERNAL_H_ |