| OLD | NEW |
| (Empty) |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_ | |
| 6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_ | |
| 7 | |
| 8 #include "mojo/public/cpp/bindings/lib/template_util.h" | |
| 9 #include "mojo/public/cpp/bindings/struct_ptr.h" | |
| 10 #include "mojo/public/cpp/system/core.h" | |
| 11 | |
| 12 namespace mojo { | |
| 13 class String; | |
| 14 | |
| 15 template <typename T> | |
| 16 class Array; | |
| 17 | |
| 18 template <typename K, typename V> | |
| 19 class Map; | |
| 20 | |
| 21 namespace internal { | |
| 22 template <typename T> | |
| 23 class Array_Data; | |
| 24 | |
| 25 #pragma pack(push, 1) | |
| 26 | |
| 27 struct StructHeader { | |
| 28 uint32_t num_bytes; | |
| 29 uint32_t num_fields; | |
| 30 }; | |
| 31 static_assert(sizeof(StructHeader) == 8, "Bad sizeof(StructHeader)"); | |
| 32 | |
| 33 struct ArrayHeader { | |
| 34 uint32_t num_bytes; | |
| 35 uint32_t num_elements; | |
| 36 }; | |
| 37 static_assert(sizeof(ArrayHeader) == 8, "Bad_sizeof(ArrayHeader)"); | |
| 38 | |
| 39 template <typename T> | |
| 40 union StructPointer { | |
| 41 uint64_t offset; | |
| 42 T* ptr; | |
| 43 }; | |
| 44 static_assert(sizeof(StructPointer<char>) == 8, "Bad_sizeof(StructPointer)"); | |
| 45 | |
| 46 template <typename T> | |
| 47 union ArrayPointer { | |
| 48 uint64_t offset; | |
| 49 Array_Data<T>* ptr; | |
| 50 }; | |
| 51 static_assert(sizeof(ArrayPointer<char>) == 8, "Bad_sizeof(ArrayPointer)"); | |
| 52 | |
| 53 union StringPointer { | |
| 54 uint64_t offset; | |
| 55 Array_Data<char>* ptr; | |
| 56 }; | |
| 57 static_assert(sizeof(StringPointer) == 8, "Bad_sizeof(StringPointer)"); | |
| 58 | |
| 59 #pragma pack(pop) | |
| 60 | |
| 61 template <typename T> | |
| 62 void ResetIfNonNull(T* ptr) { | |
| 63 if (ptr) | |
| 64 *ptr = T(); | |
| 65 } | |
| 66 | |
| 67 template <typename T> | |
| 68 T FetchAndReset(T* ptr) { | |
| 69 T temp = *ptr; | |
| 70 *ptr = T(); | |
| 71 return temp; | |
| 72 } | |
| 73 | |
| 74 template <typename H> | |
| 75 struct IsHandle { | |
| 76 enum { value = IsBaseOf<Handle, H>::value }; | |
| 77 }; | |
| 78 | |
| 79 template <typename T, bool move_only = IsMoveOnlyType<T>::value> | |
| 80 struct WrapperTraits; | |
| 81 | |
| 82 template <typename T> | |
| 83 struct WrapperTraits<T, false> { | |
| 84 typedef T DataType; | |
| 85 }; | |
| 86 template <typename H> | |
| 87 struct WrapperTraits<ScopedHandleBase<H>, true> { | |
| 88 typedef H DataType; | |
| 89 }; | |
| 90 template <typename S> | |
| 91 struct WrapperTraits<StructPtr<S>, true> { | |
| 92 typedef typename S::Data_* DataType; | |
| 93 }; | |
| 94 template <typename S> | |
| 95 struct WrapperTraits<InlinedStructPtr<S>, true> { | |
| 96 typedef typename S::Data_* DataType; | |
| 97 }; | |
| 98 template <typename S> | |
| 99 struct WrapperTraits<S, true> { | |
| 100 typedef typename S::Data_* DataType; | |
| 101 }; | |
| 102 | |
| 103 template <typename T, typename Enable = void> | |
| 104 struct ValueTraits { | |
| 105 static bool Equals(const T& a, const T& b) { return a == b; } | |
| 106 }; | |
| 107 | |
| 108 template <typename T> | |
| 109 struct ValueTraits< | |
| 110 T, | |
| 111 typename EnableIf<IsSpecializationOf<Array, T>::value || | |
| 112 IsSpecializationOf<Map, T>::value || | |
| 113 IsSpecializationOf<StructPtr, T>::value || | |
| 114 IsSpecializationOf<InlinedStructPtr, T>::value>::type> { | |
| 115 static bool Equals(const T& a, const T& b) { return a.Equals(b); } | |
| 116 }; | |
| 117 | |
| 118 template <typename T> | |
| 119 struct ValueTraits<ScopedHandleBase<T>> { | |
| 120 static bool Equals(const ScopedHandleBase<T>& a, | |
| 121 const ScopedHandleBase<T>& b) { | |
| 122 return a.get().value() == b.get().value(); | |
| 123 } | |
| 124 }; | |
| 125 | |
| 126 } // namespace internal | |
| 127 } // namespace mojo | |
| 128 | |
| 129 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_ | |
| OLD | NEW |