OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_ | 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_ |
6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_ | 6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_ |
7 | 7 |
8 #include "mojo/public/cpp/bindings/lib/template_util.h" | 8 #include "mojo/public/cpp/bindings/lib/template_util.h" |
9 #include "mojo/public/cpp/system/core.h" | 9 #include "mojo/public/cpp/system/core.h" |
10 | 10 |
11 namespace mojo { | 11 namespace mojo { |
12 class String; | 12 class String; |
| 13 template <typename Key, typename Value> class Map; |
13 | 14 |
14 namespace internal { | 15 namespace internal { |
15 template <typename T> class Array_Data; | 16 template <typename T> class Array_Data; |
16 | 17 |
17 #pragma pack(push, 1) | 18 #pragma pack(push, 1) |
18 | 19 |
19 struct StructHeader { | 20 struct StructHeader { |
20 uint32_t num_bytes; | 21 uint32_t num_bytes; |
21 uint32_t num_fields; | 22 uint32_t num_fields; |
22 }; | 23 }; |
(...skipping 18 matching lines...) Expand all Loading... |
41 Array_Data<T>* ptr; | 42 Array_Data<T>* ptr; |
42 }; | 43 }; |
43 MOJO_COMPILE_ASSERT(sizeof(ArrayPointer<char>) == 8, bad_sizeof_ArrayPointer); | 44 MOJO_COMPILE_ASSERT(sizeof(ArrayPointer<char>) == 8, bad_sizeof_ArrayPointer); |
44 | 45 |
45 union StringPointer { | 46 union StringPointer { |
46 uint64_t offset; | 47 uint64_t offset; |
47 Array_Data<char>* ptr; | 48 Array_Data<char>* ptr; |
48 }; | 49 }; |
49 MOJO_COMPILE_ASSERT(sizeof(StringPointer) == 8, bad_sizeof_StringPointer); | 50 MOJO_COMPILE_ASSERT(sizeof(StringPointer) == 8, bad_sizeof_StringPointer); |
50 | 51 |
| 52 template <typename Key, typename Value> |
| 53 struct MapPointerPair { |
| 54 ArrayPointer<Key> keys; |
| 55 ArrayPointer<Value> values; |
| 56 }; |
| 57 MOJO_COMPILE_ASSERT(sizeof(MapPointerPair<char, char>) == 16, |
| 58 bad_sizeof_MapPointerPair); |
| 59 |
51 #pragma pack(pop) | 60 #pragma pack(pop) |
52 | 61 |
53 template <typename T> | 62 template <typename T> |
54 void ResetIfNonNull(T* ptr) { | 63 void ResetIfNonNull(T* ptr) { |
55 if (ptr) | 64 if (ptr) |
56 *ptr = T(); | 65 *ptr = T(); |
57 } | 66 } |
58 | 67 |
59 template <typename T> | 68 template <typename T> |
60 T FetchAndReset(T* ptr) { | 69 T FetchAndReset(T* ptr) { |
61 T temp = *ptr; | 70 T temp = *ptr; |
62 *ptr = T(); | 71 *ptr = T(); |
63 return temp; | 72 return temp; |
64 } | 73 } |
65 | 74 |
66 template <typename H> struct IsHandle { | 75 template <typename H> struct IsHandle { |
67 enum { value = IsBaseOf<Handle, H>::value }; | 76 enum { value = IsBaseOf<Handle, H>::value }; |
68 }; | 77 }; |
69 | 78 |
70 template <typename T, bool move_only = IsMoveOnlyType<T>::value> | 79 template <typename T, bool move_only = IsMoveOnlyType<T>::value> |
71 struct WrapperTraits; | 80 struct WrapperTraits; |
72 | 81 |
73 template <typename T> struct WrapperTraits<T, false> { | 82 template <typename T> struct WrapperTraits<T, false> { |
74 typedef T DataType; | 83 typedef T DataType; |
75 }; | 84 }; |
76 template <typename H> struct WrapperTraits<ScopedHandleBase<H>, true> { | 85 template <typename H> struct WrapperTraits<ScopedHandleBase<H>, true> { |
77 typedef H DataType; | 86 typedef H DataType; |
78 }; | 87 }; |
| 88 template <typename KeyWrapperType, typename ValueWrapperType> |
| 89 struct WrapperTraits<Map<KeyWrapperType, ValueWrapperType>, true> { |
| 90 typedef MapPointerPair< |
| 91 typename WrapperTraits<KeyWrapperType>::DataType, |
| 92 typename WrapperTraits<ValueWrapperType>::DataType> DataType; |
| 93 }; |
79 template <typename S> struct WrapperTraits<S, true> { | 94 template <typename S> struct WrapperTraits<S, true> { |
80 typedef typename S::Data_* DataType; | 95 typedef typename S::Data_* DataType; |
81 }; | 96 }; |
82 | 97 |
83 } // namespace internal | 98 } // namespace internal |
84 } // namespace mojo | 99 } // namespace mojo |
85 | 100 |
86 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_ | 101 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_ |
OLD | NEW |