|  | // 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/bindings/lib/template_util.h" | 
|  | #include "mojo/public/cpp/bindings/struct_ptr.h" | 
|  | #include "mojo/public/cpp/system/core.h" | 
|  |  | 
|  | namespace mojo { | 
|  | class String; | 
|  |  | 
|  | template <typename T> | 
|  | class Array; | 
|  |  | 
|  | template <typename K, typename V> | 
|  | class Map; | 
|  |  | 
|  | namespace internal { | 
|  | template <typename T> | 
|  | class Array_Data; | 
|  |  | 
|  | #pragma pack(push, 1) | 
|  |  | 
|  | struct StructHeader { | 
|  | uint32_t num_bytes; | 
|  | uint32_t version; | 
|  | }; | 
|  | static_assert(sizeof(StructHeader) == 8, "Bad sizeof(StructHeader)"); | 
|  |  | 
|  | struct ArrayHeader { | 
|  | uint32_t num_bytes; | 
|  | uint32_t num_elements; | 
|  | }; | 
|  | static_assert(sizeof(ArrayHeader) == 8, "Bad_sizeof(ArrayHeader)"); | 
|  |  | 
|  | template <typename T> | 
|  | union StructPointer { | 
|  | uint64_t offset; | 
|  | T* ptr; | 
|  | }; | 
|  | static_assert(sizeof(StructPointer<char>) == 8, "Bad_sizeof(StructPointer)"); | 
|  |  | 
|  | template <typename T> | 
|  | union ArrayPointer { | 
|  | uint64_t offset; | 
|  | Array_Data<T>* ptr; | 
|  | }; | 
|  | static_assert(sizeof(ArrayPointer<char>) == 8, "Bad_sizeof(ArrayPointer)"); | 
|  |  | 
|  | union StringPointer { | 
|  | uint64_t offset; | 
|  | Array_Data<char>* ptr; | 
|  | }; | 
|  | static_assert(sizeof(StringPointer) == 8, "Bad_sizeof(StringPointer)"); | 
|  |  | 
|  | struct Interface_Data { | 
|  | MessagePipeHandle handle; | 
|  | uint32_t version; | 
|  | }; | 
|  | static_assert(sizeof(Interface_Data) == 8, "Bad_sizeof(Interface_Data)"); | 
|  |  | 
|  | template <typename T> | 
|  | union UnionPointer { | 
|  | uint64_t offset; | 
|  | T* ptr; | 
|  | }; | 
|  | static_assert(sizeof(UnionPointer<char>) == 8, "Bad_sizeof(UnionPointer)"); | 
|  |  | 
|  | #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 H> | 
|  | struct IsHandle { | 
|  | enum { value = IsBaseOf<Handle, H>::value }; | 
|  | }; | 
|  |  | 
|  | template <typename T> | 
|  | struct IsUnionDataType { | 
|  | template <typename U> | 
|  | static YesType Test(const typename U::MojomUnionDataType*); | 
|  |  | 
|  | template <typename U> | 
|  | static NoType Test(...); | 
|  |  | 
|  | static const bool value = | 
|  | sizeof(Test<T>(0)) == sizeof(YesType) && !IsConst<T>::value; | 
|  | }; | 
|  |  | 
|  | template <typename T, bool move_only = IsMoveOnlyType<T>::value> | 
|  | struct WrapperTraits; | 
|  |  | 
|  | template <typename T> | 
|  | struct WrapperTraits<T, false> { | 
|  | typedef T DataType; | 
|  | }; | 
|  | template <typename H> | 
|  | struct WrapperTraits<ScopedHandleBase<H>, true> { | 
|  | typedef H DataType; | 
|  | }; | 
|  | template <typename S> | 
|  | struct WrapperTraits<StructPtr<S>, true> { | 
|  | typedef typename S::Data_* DataType; | 
|  | }; | 
|  | template <typename S> | 
|  | struct WrapperTraits<InlinedStructPtr<S>, true> { | 
|  | typedef typename S::Data_* DataType; | 
|  | }; | 
|  | template <typename S> | 
|  | struct WrapperTraits<S, true> { | 
|  | typedef typename S::Data_* DataType; | 
|  | }; | 
|  |  | 
|  | template <typename T, typename Enable = void> | 
|  | struct ValueTraits { | 
|  | static bool Equals(const T& a, const T& b) { return a == b; } | 
|  | }; | 
|  |  | 
|  | template <typename T> | 
|  | struct ValueTraits< | 
|  | T, | 
|  | typename EnableIf<IsSpecializationOf<Array, T>::value || | 
|  | IsSpecializationOf<Map, T>::value || | 
|  | IsSpecializationOf<StructPtr, T>::value || | 
|  | IsSpecializationOf<InlinedStructPtr, T>::value>::type> { | 
|  | static bool Equals(const T& a, const T& b) { return a.Equals(b); } | 
|  | }; | 
|  |  | 
|  | template <typename T> | 
|  | struct ValueTraits<ScopedHandleBase<T>> { | 
|  | static bool Equals(const ScopedHandleBase<T>& a, | 
|  | const ScopedHandleBase<T>& b) { | 
|  | return a.get().value() == b.get().value(); | 
|  | } | 
|  | }; | 
|  |  | 
|  | }  // namespace internal | 
|  | }  // namespace mojo | 
|  |  | 
|  | #endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_ |