| 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 <stddef.h> | 8 #include <stddef.h> |
| 9 #include <string.h> // For |memcpy()|. | 9 #include <string.h> // For |memcpy()|. |
| 10 | 10 |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 }; | 288 }; |
| 289 }; | 289 }; |
| 290 | 290 |
| 291 // Handles serialization and deserialization of arrays of unions. | 291 // Handles serialization and deserialization of arrays of unions. |
| 292 template <typename MojomType, typename MaybeConstUserType> | 292 template <typename MojomType, typename MaybeConstUserType> |
| 293 struct ArraySerializer<MojomType, | 293 struct ArraySerializer<MojomType, |
| 294 MaybeConstUserType, | 294 MaybeConstUserType, |
| 295 ArraySerializerType::UNION> { | 295 ArraySerializerType::UNION> { |
| 296 using UserType = typename std::remove_const<MaybeConstUserType>::type; | 296 using UserType = typename std::remove_const<MaybeConstUserType>::type; |
| 297 using Data = typename MojomType::Data_; | 297 using Data = typename MojomType::Data_; |
| 298 using Element = typename MojomType::Element; |
| 298 using Traits = ArrayTraits<UserType>; | 299 using Traits = ArrayTraits<UserType>; |
| 299 | 300 |
| 300 static_assert(std::is_same<typename MojomType::Element, | 301 static_assert(std::is_same<typename MojomType::Element, |
| 301 typename Traits::Element>::value, | 302 typename Traits::Element>::value, |
| 302 "Incorrect array serializer"); | 303 "Incorrect array serializer"); |
| 303 | 304 |
| 304 static size_t GetSerializedSize(MaybeConstUserType& input, | 305 static size_t GetSerializedSize(MaybeConstUserType& input, |
| 305 SerializationContext* context) { | 306 SerializationContext* context) { |
| 306 size_t element_count = Traits::GetSize(input); | 307 size_t element_count = Traits::GetSize(input); |
| 307 size_t size = sizeof(Data); | 308 size_t size = sizeof(Data); |
| 308 for (size_t i = 0; i < element_count; ++i) { | 309 for (size_t i = 0; i < element_count; ++i) { |
| 309 // Call GetSerializedSize_ with |inlined| set to false, so that it will | 310 // Call with |inlined| set to false, so that it will account for both the |
| 310 // account for both the data in the union and the space in the array used | 311 // data in the union and the space in the array used to hold the union. |
| 311 // to hold the union. | 312 size += |
| 312 size += GetSerializedSize_(Traits::GetAt(input, i), false, context); | 313 PrepareToSerialize<Element>(Traits::GetAt(input, i), false, context); |
| 313 } | 314 } |
| 314 return size; | 315 return size; |
| 315 } | 316 } |
| 316 | 317 |
| 317 static void SerializeElements(MaybeConstUserType& input, | 318 static void SerializeElements(MaybeConstUserType& input, |
| 318 Buffer* buf, | 319 Buffer* buf, |
| 319 Data* output, | 320 Data* output, |
| 320 const ArrayValidateParams* validate_params, | 321 const ArrayValidateParams* validate_params, |
| 321 SerializationContext* context) { | 322 SerializationContext* context) { |
| 322 size_t size = Traits::GetSize(input); | 323 size_t size = Traits::GetSize(input); |
| 323 for (size_t i = 0; i < size; ++i) { | 324 for (size_t i = 0; i < size; ++i) { |
| 324 typename Data::Element* result = output->storage() + i; | 325 typename Data::Element* result = output->storage() + i; |
| 325 SerializeUnion_(std::move(Traits::GetAt(input, i)), buf, &result, true, | 326 Serialize<Element>(Traits::GetAt(input, i), buf, &result, true, context); |
| 326 context); | |
| 327 MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING( | 327 MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING( |
| 328 !validate_params->element_is_nullable && output->at(i).is_null(), | 328 !validate_params->element_is_nullable && output->at(i).is_null(), |
| 329 VALIDATION_ERROR_UNEXPECTED_NULL_POINTER, | 329 VALIDATION_ERROR_UNEXPECTED_NULL_POINTER, |
| 330 MakeMessageWithArrayIndex("null in array expecting valid unions", | 330 MakeMessageWithArrayIndex("null in array expecting valid unions", |
| 331 size, i)); | 331 size, i)); |
| 332 } | 332 } |
| 333 } | 333 } |
| 334 | 334 |
| 335 static bool DeserializeElements(Data* input, | 335 static bool DeserializeElements(Data* input, |
| 336 UserType* output, | 336 UserType* output, |
| 337 SerializationContext* context) { | 337 SerializationContext* context) { |
| 338 bool success = true; | 338 bool success = true; |
| 339 Traits::Resize(*output, input->size()); | 339 Traits::Resize(*output, input->size()); |
| 340 for (size_t i = 0; i < input->size(); ++i) { | 340 for (size_t i = 0; i < input->size(); ++i) { |
| 341 // Note that we rely on complete deserialization taking place in order to | 341 // Note that we rely on complete deserialization taking place in order to |
| 342 // transfer ownership of all encoded handles. Therefore we don't | 342 // transfer ownership of all encoded handles. Therefore we don't |
| 343 // short-circuit on failure here. | 343 // short-circuit on failure here. |
| 344 if (!Deserialize_(&input->at(i), &Traits::GetAt(*output, i), context)) | 344 if (!Deserialize<Element>(&input->at(i), &Traits::GetAt(*output, i), |
| 345 context)) { |
| 345 success = false; | 346 success = false; |
| 347 } |
| 346 } | 348 } |
| 347 return success; | 349 return success; |
| 348 } | 350 } |
| 349 }; | 351 }; |
| 350 | 352 |
| 351 template <typename Element, typename MaybeConstUserType> | 353 template <typename Element, typename MaybeConstUserType> |
| 352 struct Serializer<Array<Element>, MaybeConstUserType> { | 354 struct Serializer<Array<Element>, MaybeConstUserType> { |
| 353 using UserType = typename std::remove_const<MaybeConstUserType>::type; | 355 using UserType = typename std::remove_const<MaybeConstUserType>::type; |
| 354 using Impl = ArraySerializer<Array<Element>, MaybeConstUserType>; | 356 using Impl = ArraySerializer<Array<Element>, MaybeConstUserType>; |
| 355 using Traits = ArrayTraits<UserType>; | 357 using Traits = ArrayTraits<UserType>; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 return Impl::DeserializeElements(input, output, context); | 393 return Impl::DeserializeElements(input, output, context); |
| 392 Traits::SetToNull(*output); | 394 Traits::SetToNull(*output); |
| 393 return true; | 395 return true; |
| 394 } | 396 } |
| 395 }; | 397 }; |
| 396 | 398 |
| 397 } // namespace internal | 399 } // namespace internal |
| 398 } // namespace mojo | 400 } // namespace mojo |
| 399 | 401 |
| 400 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_SERIALIZATION_H_ | 402 #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_SERIALIZATION_H_ |
| OLD | NEW |