Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(281)

Side by Side Diff: mojo/public/cpp/bindings/lib/array_serialization.h

Issue 632603002: Mojo C++ bindings: support Arrays that contain Maps. Base URL: https://chromium.googlesource.com/chromium/src.git@4_mojo_map
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | mojo/public/cpp/bindings/lib/bindings_internal.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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>
11 11
12 #include "mojo/public/c/system/macros.h" 12 #include "mojo/public/c/system/macros.h"
13 #include "mojo/public/cpp/bindings/lib/array_internal.h" 13 #include "mojo/public/cpp/bindings/lib/array_internal.h"
14 #include "mojo/public/cpp/bindings/lib/bindings_internal.h"
14 #include "mojo/public/cpp/bindings/lib/string_serialization.h" 15 #include "mojo/public/cpp/bindings/lib/string_serialization.h"
15 #include "mojo/public/cpp/bindings/lib/template_util.h" 16 #include "mojo/public/cpp/bindings/lib/template_util.h"
16 #include "mojo/public/cpp/bindings/lib/validation_errors.h" 17 #include "mojo/public/cpp/bindings/lib/validation_errors.h"
17 18
18 namespace mojo { 19 namespace mojo {
19 20
20 template <typename E> 21 template <typename E>
21 inline size_t GetSerializedSize_(const Array<E>& input); 22 inline size_t GetSerializedSize_(const Array<E>& input);
22 23
23 // Because ValidateParams requires explicit argument specification, the 24 // Because ValidateParams requires explicit argument specification, the
24 // argument-dependent loopup technique used to omit namespace when calling 25 // argument-dependent loopup technique used to omit namespace when calling
25 // Serialize_() doesn't seem to work. Therefore, this function is named 26 // Serialize_() doesn't seem to work. Therefore, this function is named
26 // differently from those Serialize_() overloads. 27 // differently from those Serialize_() overloads.
27 template <typename ValidateParams, typename E, typename F> 28 template <typename ValidateParams, typename E, typename F>
28 inline void SerializeArray_(Array<E> input, internal::Buffer* buf, 29 inline void SerializeArray_(Array<E> input, internal::Buffer* buf,
29 internal::Array_Data<F>** output); 30 internal::Array_Data<F>** output);
30 31
31 template <typename E, typename F> 32 template <typename E, typename F>
32 inline void Deserialize_(internal::Array_Data<F>* data, Array<E>* output); 33 inline void Deserialize_(internal::Array_Data<F>* data, Array<E>* output);
33 34
35 template <typename ValueValidateParams,
36 typename KeyWrapperType,
37 typename ValueWrapperType,
38 typename KeySerializationType,
39 typename ValueSerializationType>
40 inline void SerializeMap_(
41 Map<KeyWrapperType, ValueWrapperType> input,
42 internal::Buffer* buf,
43 internal::MapPointerPair<KeySerializationType,
44 ValueSerializationType>* output);
45
34 namespace internal { 46 namespace internal {
35 47
36 template <typename E, typename F, bool move_only = IsMoveOnlyType<E>::value> 48 template <typename E, typename F, bool move_only = IsMoveOnlyType<E>::value>
37 struct ArraySerializer; 49 struct ArraySerializer;
38 50
39 template <typename E, typename F> struct ArraySerializer<E, F, false> { 51 template <typename E, typename F> struct ArraySerializer<E, F, false> {
40 MOJO_COMPILE_ASSERT(sizeof(E) == sizeof(F), wrong_array_serializer); 52 MOJO_COMPILE_ASSERT(sizeof(E) == sizeof(F), wrong_array_serializer);
41 static size_t GetSerializedSize(const Array<E>& input) { 53 static size_t GetSerializedSize(const Array<E>& input) {
42 return sizeof(Array_Data<F>) + Align(input.size() * sizeof(E)); 54 return sizeof(Array_Data<F>) + Align(input.size() * sizeof(E));
43 } 55 }
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 } 217 }
206 static void DeserializeElements( 218 static void DeserializeElements(
207 Array_Data<String_Data*>* input, Array<String>* output) { 219 Array_Data<String_Data*>* input, Array<String>* output) {
208 Array<String> result(input->size()); 220 Array<String> result(input->size());
209 for (size_t i = 0; i < input->size(); ++i) 221 for (size_t i = 0; i < input->size(); ++i)
210 Deserialize_(input->at(i), &result[i]); 222 Deserialize_(input->at(i), &result[i]);
211 output->Swap(&result); 223 output->Swap(&result);
212 } 224 }
213 }; 225 };
214 226
227 template <typename KeyWrapperType, typename ValueWrapperType,
228 typename KeySerializationType, typename ValueSerializationType>
229 struct ArraySerializer<
230 Map<KeyWrapperType, ValueWrapperType>,
231 MapPointerPair<KeySerializationType, ValueSerializationType>,
232 true> {
233 static size_t GetSerializedSize(
234 const Array<Map<KeyWrapperType, ValueWrapperType>>& input) {
235 size_t size = sizeof(ArrayHeader) +
236 input.size() * sizeof(MapPointerPair<KeySerializationType,
237 ValueSerializationType>);
238 for (size_t i = 0; i < input.size(); ++i)
239 size += GetSerializedSize_(input[i]);
240 return size;
241 }
242
243 template <bool element_is_nullable, typename ElementValidateParams>
244 static void SerializeElements(
245 Array<Map<KeyWrapperType, ValueWrapperType>> input,
246 Buffer* buf,
247 Array_Data<MapPointerPair<KeySerializationType,
248 ValueSerializationType>>* output) {
249 for (size_t i = 0; i < input.size(); ++i) {
250 MapPointerPair<KeySerializationType, ValueSerializationType> element;
251 SerializeMap_<ElementValidateParams>(input[i].Pass(), buf, &element);
252 output->at(i) = element;
253 MOJO_DCHECK(!!element.keys.ptr == !!element.values.ptr);
254 MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
255 !element_is_nullable && !element.keys.ptr,
256 VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
257 MakeMessageWithArrayIndex(
258 "null in array expecting valid pointers", input.size(), i));
259 }
260 }
261
262 static void DeserializeElements(
263 Array_Data<
264 MapPointerPair<KeySerializationType, ValueSerializationType>>* input,
265 Array<Map<KeyWrapperType, ValueWrapperType>>* output) {
266 Array<Map<KeyWrapperType, ValueWrapperType>> result(input->size());
267 for (size_t i = 0; i < input->size(); ++i) {
268 Map<KeyWrapperType, ValueWrapperType> element;
269 Deserialize_(&input->at(i), &element);
270 result[i] = element.Pass();
271 }
272 output->Swap(&result);
273 }
274 };
275
215 } // namespace internal 276 } // namespace internal
216 277
217 template <typename E> 278 template <typename E>
218 inline size_t GetSerializedSize_(const Array<E>& input) { 279 inline size_t GetSerializedSize_(const Array<E>& input) {
219 if (!input) 280 if (!input)
220 return 0; 281 return 0;
221 typedef typename internal::WrapperTraits<E>::DataType F; 282 typedef typename internal::WrapperTraits<E>::DataType F;
222 return internal::ArraySerializer<E, F>::GetSerializedSize(input); 283 return internal::ArraySerializer<E, F>::GetSerializedSize(input);
223 } 284 }
224 285
(...skipping 28 matching lines...) Expand all
253 if (input) { 314 if (input) {
254 internal::ArraySerializer<E, F>::DeserializeElements(input, output); 315 internal::ArraySerializer<E, F>::DeserializeElements(input, output);
255 } else { 316 } else {
256 output->reset(); 317 output->reset();
257 } 318 }
258 } 319 }
259 320
260 } // namespace mojo 321 } // namespace mojo
261 322
262 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_SERIALIZATION_H_ 323 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_SERIALIZATION_H_
OLDNEW
« no previous file with comments | « no previous file | mojo/public/cpp/bindings/lib/bindings_internal.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698