Chromium Code Reviews| 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/system/core.h" | 9 #include "mojo/public/cpp/system/core.h" |
| 9 | 10 |
| 10 namespace mojo { | 11 namespace mojo { |
| 11 template <typename S> class InterfaceHandle; | 12 class String; |
| 12 | 13 |
| 13 namespace internal { | 14 namespace internal { |
| 14 template <typename T> class Array_Data; | 15 template <typename T> class Array_Data; |
| 15 | 16 |
| 16 #pragma pack(push, 1) | 17 #pragma pack(push, 1) |
| 17 | 18 |
| 18 struct StructHeader { | 19 struct StructHeader { |
| 19 uint32_t num_bytes; | 20 uint32_t num_bytes; |
| 20 uint32_t num_fields; | 21 uint32_t num_fields; |
| 21 }; | 22 }; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 55 *ptr = T(); | 56 *ptr = T(); |
| 56 } | 57 } |
| 57 | 58 |
| 58 template <typename T> | 59 template <typename T> |
| 59 T FetchAndReset(T* ptr) { | 60 T FetchAndReset(T* ptr) { |
| 60 T temp = *ptr; | 61 T temp = *ptr; |
| 61 *ptr = T(); | 62 *ptr = T(); |
| 62 return temp; | 63 return temp; |
| 63 } | 64 } |
| 64 | 65 |
| 65 template <typename T> | 66 template <typename T> struct IsHandle { |
| 66 class WrapperHelper { | 67 static const bool value = false; |
| 67 public: | 68 }; |
| 68 static const T Wrap(const typename T::Data* data) { | 69 template <> struct IsHandle<Handle> { |
| 69 return T(typename T::Wrap(), const_cast<typename T::Data*>(data)); | 70 static const bool value = true; |
| 70 } | 71 }; |
| 71 static typename T::Data* Unwrap(const T& object) { | 72 template <> struct IsHandle<DataPipeConsumerHandle> { |
|
yzshen1
2014/05/27 22:16:59
It might make sense to define IsHandle<> with the
| |
| 72 return const_cast<typename T::Data*>(object.data_); | 73 static const bool value = true; |
| 73 } | 74 }; |
| 75 template <> struct IsHandle<DataPipeProducerHandle> { | |
| 76 static const bool value = true; | |
| 77 }; | |
| 78 template <> struct IsHandle<MessagePipeHandle> { | |
| 79 static const bool value = true; | |
| 80 }; | |
| 81 template <> struct IsHandle<SharedBufferHandle> { | |
| 82 static const bool value = true; | |
| 74 }; | 83 }; |
| 75 | 84 |
| 76 template <typename Data> | 85 template <typename T, bool kMoveOnly = IsMoveOnlyType<T>::value> |
| 77 inline const typename Data::Wrapper Wrap(const Data* data) { | 86 struct WrapperTraits; |
| 78 return WrapperHelper<typename Data::Wrapper>::Wrap(data); | |
| 79 } | |
| 80 | 87 |
| 81 template <typename T> | 88 template <typename T> struct WrapperTraits<T, false> { |
| 82 inline typename T::Data* Unwrap(const T& object) { | 89 typedef T DataType; |
| 83 return WrapperHelper<T>::Unwrap(object); | |
| 84 } | |
| 85 | |
| 86 template <typename T> struct TypeTraits { | |
| 87 static const bool kIsHandle = false; | |
| 88 static const bool kIsObject = true; | |
| 89 }; | 90 }; |
| 90 template <> struct TypeTraits<bool> { | 91 template <typename H> struct WrapperTraits<ScopedHandleBase<H>, true> { |
| 91 static const bool kIsHandle = false; | 92 typedef H DataType; |
| 92 static const bool kIsObject = false; | |
| 93 }; | 93 }; |
| 94 template <> struct TypeTraits<char> { | 94 template <typename S> struct WrapperTraits<S, true> { |
| 95 static const bool kIsHandle = false; | 95 typedef typename S::Data_* DataType; |
| 96 static const bool kIsObject = false; | |
| 97 }; | 96 }; |
| 98 template <> struct TypeTraits<int8_t> { | |
| 99 static const bool kIsHandle = false; | |
| 100 static const bool kIsObject = false; | |
| 101 }; | |
| 102 template <> struct TypeTraits<int16_t> { | |
| 103 static const bool kIsHandle = false; | |
| 104 static const bool kIsObject = false; | |
| 105 }; | |
| 106 template <> struct TypeTraits<int32_t> { | |
| 107 static const bool kIsHandle = false; | |
| 108 static const bool kIsObject = false; | |
| 109 }; | |
| 110 template <> struct TypeTraits<int64_t> { | |
| 111 static const bool kIsHandle = false; | |
| 112 static const bool kIsObject = false; | |
| 113 }; | |
| 114 template <> struct TypeTraits<uint8_t> { | |
| 115 static const bool kIsHandle = false; | |
| 116 static const bool kIsObject = false; | |
| 117 }; | |
| 118 template <> struct TypeTraits<uint16_t> { | |
| 119 static const bool kIsHandle = false; | |
| 120 static const bool kIsObject = false; | |
| 121 }; | |
| 122 template <> struct TypeTraits<uint32_t> { | |
| 123 static const bool kIsHandle = false; | |
| 124 static const bool kIsObject = false; | |
| 125 }; | |
| 126 template <> struct TypeTraits<uint64_t> { | |
| 127 static const bool kIsHandle = false; | |
| 128 static const bool kIsObject = false; | |
| 129 }; | |
| 130 template <> struct TypeTraits<float> { | |
| 131 static const bool kIsHandle = false; | |
| 132 static const bool kIsObject = false; | |
| 133 }; | |
| 134 template <> struct TypeTraits<double> { | |
| 135 static const bool kIsHandle = false; | |
| 136 static const bool kIsObject = false; | |
| 137 }; | |
| 138 template <> struct TypeTraits<Handle> { | |
| 139 static const bool kIsHandle = true; | |
| 140 static const bool kIsObject = false; | |
| 141 }; | |
| 142 template <> struct TypeTraits<DataPipeConsumerHandle> { | |
| 143 static const bool kIsHandle = true; | |
| 144 static const bool kIsObject = false; | |
| 145 }; | |
| 146 template <> struct TypeTraits<DataPipeProducerHandle> { | |
| 147 static const bool kIsHandle = true; | |
| 148 static const bool kIsObject = false; | |
| 149 }; | |
| 150 template <> struct TypeTraits<MessagePipeHandle> { | |
| 151 static const bool kIsHandle = true; | |
| 152 static const bool kIsObject = false; | |
| 153 }; | |
| 154 template <typename S> struct TypeTraits<InterfaceHandle<S> > { | |
| 155 static const bool kIsHandle = true; | |
| 156 static const bool kIsObject = false; | |
| 157 }; | |
| 158 | |
| 159 template <typename T> class ObjectTraits {}; | |
| 160 | 97 |
| 161 } // namespace internal | 98 } // namespace internal |
| 162 } // namespace mojo | 99 } // namespace mojo |
| 163 | 100 |
| 164 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_ | 101 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_ |
| OLD | NEW |