OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_ARRAY_SERIALIZATION_H_ | 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_SERIALIZATION_H_ |
6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_SERIALIZATION_H_ | 6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_SERIALIZATION_H_ |
7 | 7 |
8 #include <string.h> // For |memcpy()|. | 8 #include <string.h> // For |memcpy()|. |
9 | 9 |
10 #include <vector> | 10 #include <vector> |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 } | 111 } |
112 static void DeserializeElements( | 112 static void DeserializeElements( |
113 Array_Data<H>* input, Array<ScopedHandleBase<H> >* output) { | 113 Array_Data<H>* input, Array<ScopedHandleBase<H> >* output) { |
114 Array<ScopedHandleBase<H> > result(input->size()); | 114 Array<ScopedHandleBase<H> > result(input->size()); |
115 for (size_t i = 0; i < input->size(); ++i) | 115 for (size_t i = 0; i < input->size(); ++i) |
116 result.at(i) = MakeScopedHandle(FetchAndReset(&input->at(i))); | 116 result.at(i) = MakeScopedHandle(FetchAndReset(&input->at(i))); |
117 output->Swap(&result); | 117 output->Swap(&result); |
118 } | 118 } |
119 }; | 119 }; |
120 | 120 |
121 template <typename S> struct ArraySerializer<S, typename S::Data_*, true> { | 121 template <typename S> |
| 122 struct ArraySerializer<S, |
| 123 typename internal::EnableIf< |
| 124 internal::IsPointer< |
| 125 typename internal::WrapperTraits< |
| 126 S>::DataType>::value, |
| 127 typename internal::WrapperTraits< |
| 128 S>::DataType>::type, |
| 129 true> { |
| 130 typedef typename internal::RemovePointer< |
| 131 typename internal::WrapperTraits<S>::DataType>::type S_Data; |
122 static size_t GetSerializedSize(const Array<S>& input) { | 132 static size_t GetSerializedSize(const Array<S>& input) { |
123 size_t size = sizeof(Array_Data<typename S::Data_*>) + | 133 size_t size = sizeof(Array_Data<S_Data*>) + |
124 input.size() * sizeof(internal::StructPointer<typename S::Data_>); | 134 input.size() * sizeof(internal::StructPointer<S_Data>); |
125 for (size_t i = 0; i < input.size(); ++i) | 135 for (size_t i = 0; i < input.size(); ++i) |
126 size += GetSerializedSize_(input[i]); | 136 size += GetSerializedSize_(input[i]); |
127 return size; | 137 return size; |
128 } | 138 } |
129 template <bool element_is_nullable, typename ElementValidateParams> | 139 template <bool element_is_nullable, typename ElementValidateParams> |
130 static void SerializeElements(Array<S> input, | 140 static void SerializeElements(Array<S> input, |
131 Buffer* buf, | 141 Buffer* buf, |
132 Array_Data<typename S::Data_*>* output) { | 142 Array_Data<S_Data*>* output) { |
133 for (size_t i = 0; i < input.size(); ++i) { | 143 for (size_t i = 0; i < input.size(); ++i) { |
134 typename S::Data_* element; | 144 S_Data* element; |
135 SerializeCaller<S, ElementValidateParams>::Run( | 145 SerializeCaller<S, ElementValidateParams>::Run( |
136 input[i].Pass(), buf, &element); | 146 input[i].Pass(), buf, &element); |
137 output->at(i) = element; | 147 output->at(i) = element; |
138 MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING( | 148 MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING( |
139 !element_is_nullable && !element, | 149 !element_is_nullable && !element, |
140 VALIDATION_ERROR_UNEXPECTED_NULL_POINTER, | 150 VALIDATION_ERROR_UNEXPECTED_NULL_POINTER, |
141 MakeMessageWithArrayIndex( | 151 MakeMessageWithArrayIndex( |
142 "null in array expecting valid pointers", input.size(), i)); | 152 "null in array expecting valid pointers", input.size(), i)); |
143 } | 153 } |
144 } | 154 } |
145 static void DeserializeElements( | 155 static void DeserializeElements( |
146 Array_Data<typename S::Data_*>* input, Array<S>* output) { | 156 Array_Data<S_Data*>* input, Array<S>* output) { |
147 Array<S> result(input->size()); | 157 Array<S> result(input->size()); |
148 for (size_t i = 0; i < input->size(); ++i) { | 158 for (size_t i = 0; i < input->size(); ++i) { |
149 S element; | 159 S element; |
150 Deserialize_(input->at(i), &element); | 160 Deserialize_(input->at(i), &element); |
151 result[i] = element.Pass(); | 161 result[i] = element.Pass(); |
152 } | 162 } |
153 output->Swap(&result); | 163 output->Swap(&result); |
154 } | 164 } |
155 | 165 |
156 private: | 166 private: |
157 template <typename T, typename Params> | 167 template <typename T, typename Params> |
158 struct SerializeCaller { | 168 struct SerializeCaller { |
159 static void Run(T input, Buffer* buf, typename T::Data_** output) { | 169 static void Run( |
| 170 T input, |
| 171 Buffer* buf, |
| 172 typename internal::WrapperTraits<T>::DataType* output) { |
160 MOJO_COMPILE_ASSERT((IsSame<Params, NoValidateParams>::value), | 173 MOJO_COMPILE_ASSERT((IsSame<Params, NoValidateParams>::value), |
161 Struct_type_should_not_have_array_validate_params); | 174 Struct_type_should_not_have_array_validate_params); |
162 | 175 |
163 Serialize_(input.Pass(), buf, output); | 176 Serialize_(input.Pass(), buf, output); |
164 } | 177 } |
165 }; | 178 }; |
166 | 179 |
167 template <typename T, typename Params> | 180 template <typename T, typename Params> |
168 struct SerializeCaller<Array<T>, Params> { | 181 struct SerializeCaller<Array<T>, Params> { |
169 static void Run(Array<T> input, | 182 static void Run(Array<T> input, |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 if (input) { | 266 if (input) { |
254 internal::ArraySerializer<E, F>::DeserializeElements(input, output); | 267 internal::ArraySerializer<E, F>::DeserializeElements(input, output); |
255 } else { | 268 } else { |
256 output->reset(); | 269 output->reset(); |
257 } | 270 } |
258 } | 271 } |
259 | 272 |
260 } // namespace mojo | 273 } // namespace mojo |
261 | 274 |
262 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_SERIALIZATION_H_ | 275 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_SERIALIZATION_H_ |
OLD | NEW |