1 #ifndef ANDROID_PDX_RPC_SERIALIZATION_H_ 2 #define ANDROID_PDX_RPC_SERIALIZATION_H_ 3 4 #include <cstdint> 5 #include <cstring> 6 #include <iterator> 7 #include <map> 8 #include <numeric> 9 #include <sstream> 10 #include <string> 11 #include <tuple> 12 #include <type_traits> 13 #include <unordered_map> 14 #include <utility> 15 #include <vector> 16 17 #include <pdx/channel_handle.h> 18 #include <pdx/file_handle.h> 19 #include <pdx/message_reader.h> 20 #include <pdx/message_writer.h> 21 #include <pdx/trace.h> 22 #include <pdx/utility.h> 23 24 #include "array_wrapper.h" 25 #include "default_initialization_allocator.h" 26 #include "encoding.h" 27 #include "pointer_wrapper.h" 28 #include "string_wrapper.h" 29 #include "variant.h" 30 31 namespace android { 32 namespace pdx { 33 namespace rpc { 34 35 // Automatic serialization/deserialization library based on MessagePack 36 // (http://msgpack.org). This library provides top level Serialize() and 37 // Deserialize() functions to encode/decode a variety of data types. 38 // 39 // The following data types are supported: 40 // * Standard signed integer types: int8_t, int16_t, int32_t, and int64_t. 41 // * Regular signed integer types equivalent to the standard types: 42 // signed char, short, int, long, and long long. 43 // * Standard unsigned integer types: uint8_t, uint16_t, uint32_t, and 44 // uint64_t. 45 // * Regular unsigned integer types equivalent to the standard types: 46 // unsigned char, unsigned short, unsigned int, unsigned long, 47 // and unsigned long long. 48 // * char without signed/unsigned qualifiers. 49 // * bool. 50 // * std::vector with value type of any supported type, including nesting. 51 // * std::string. 52 // * std::tuple with elements of any supported type, including nesting. 53 // * std::pair with elements of any supported type, including nesting. 54 // * std::map with keys and values of any supported type, including nesting. 55 // * std::unordered_map with keys and values of any supported type, including 56 // nesting. 57 // * std::array with values of any supported type, including nesting. 58 // * ArrayWrapper of any supported basic type. 59 // * BufferWrapper of any POD type. 60 // * StringWrapper of any supported char type. 61 // * User types with correctly defined SerializableMembers member type. 62 // 63 // Planned support for: 64 // * std::basic_string with all supported char types. 65 66 // Counting template for managing template recursion. 67 template <std::size_t N> 68 struct Index {}; 69 70 // Forward declaration of traits type to access types with a SerializedMembers 71 // member type. 72 template <typename T> 73 class SerializableTraits; 74 75 template <typename T, typename... MemberPointers> 76 struct SerializableMembersType; 77 78 // Utility to deduce the template type from a derived type. 79 template <template <typename...> class TT, typename... Ts> 80 std::true_type DeduceTemplateType(const TT<Ts...>*); 81 template <template <typename...> class TT> 82 std::false_type DeduceTemplateType(...); 83 84 // Utility determining whether template type TT<...> is a base of type T. 85 template <template <typename...> class TT, typename T> 86 using IsTemplateBaseOf = decltype(DeduceTemplateType<TT>(std::declval<T*>())); 87 88 // Utility type for SFINAE in HasHasSerializableMembers. 89 template <typename... Ts> 90 using TrySerializableMembersType = void; 91 92 // Determines whether type T has a member type named SerializableMembers of 93 // template type SerializableMembersType. 94 template <typename, typename = void> 95 struct HasSerializableMembers : std::false_type {}; 96 template <typename T> 97 struct HasSerializableMembers< 98 T, TrySerializableMembersType<typename T::SerializableMembers>> 99 : std::integral_constant< 100 bool, IsTemplateBaseOf<SerializableMembersType, 101 typename T::SerializableMembers>::value> {}; 102 103 // Utility to simplify overload enable expressions for types with correctly 104 // defined SerializableMembers. 105 template <typename T> 106 using EnableIfHasSerializableMembers = 107 typename std::enable_if<HasSerializableMembers<T>::value>::type; 108 109 // Utility to simplify overload enable expressions for enum types. 110 template <typename T, typename ReturnType = void> 111 using EnableIfEnum = 112 typename std::enable_if<std::is_enum<T>::value, ReturnType>::type; 113 114 /////////////////////////////////////////////////////////////////////////////// 115 // Error Reporting // 116 /////////////////////////////////////////////////////////////////////////////// 117 118 // Error codes returned by the deserialization code. 119 enum class ErrorCode { 120 NO_ERROR = 0, 121 UNEXPECTED_ENCODING, 122 UNEXPECTED_TYPE_SIZE, 123 INSUFFICIENT_BUFFER, 124 INSUFFICIENT_DESTINATION_SIZE, 125 GET_FILE_DESCRIPTOR_FAILED, 126 GET_CHANNEL_HANDLE_FAILED, 127 INVALID_VARIANT_ELEMENT, 128 }; 129 130 // Type for errors returned by the deserialization code. 131 class ErrorType { 132 public: 133 ErrorType() : error_code_(ErrorCode::NO_ERROR) {} 134 135 // ErrorType constructor for generic error codes. Explicitly not explicit, 136 // implicit conversion from ErrorCode to ErrorType is desirable behavior. 137 // NOLINTNEXTLINE(runtime/explicit) 138 ErrorType(ErrorCode error_code) : error_code_(error_code) {} 139 140 // ErrorType constructor for encoding type errors. 141 ErrorType(ErrorCode error_code, EncodingClass encoding_class, 142 EncodingType encoding_type) 143 : error_code_(error_code) { 144 unexpected_encoding_.encoding_class = encoding_class; 145 unexpected_encoding_.encoding_type = encoding_type; 146 } 147 148 // Evaluates to true if the ErrorType represents an error. 149 explicit operator bool() const { return error_code_ != ErrorCode::NO_ERROR; } 150 151 operator ErrorCode() const { return error_code_; } 152 ErrorCode error_code() const { return error_code_; } 153 154 // Accessors for extra info about unexpected encoding errors. 155 EncodingClass encoding_class() const { 156 return unexpected_encoding_.encoding_class; 157 } 158 EncodingType encoding_type() const { 159 return unexpected_encoding_.encoding_type; 160 } 161 162 operator std::string() const { 163 std::ostringstream stream; 164 165 switch (error_code_) { 166 case ErrorCode::NO_ERROR: 167 return "NO_ERROR"; 168 case ErrorCode::UNEXPECTED_ENCODING: 169 stream << "UNEXPECTED_ENCODING: " << static_cast<int>(encoding_class()) 170 << ", " << static_cast<int>(encoding_type()); 171 return stream.str(); 172 case ErrorCode::UNEXPECTED_TYPE_SIZE: 173 return "UNEXPECTED_TYPE_SIZE"; 174 case ErrorCode::INSUFFICIENT_BUFFER: 175 return "INSUFFICIENT_BUFFER"; 176 case ErrorCode::INSUFFICIENT_DESTINATION_SIZE: 177 return "INSUFFICIENT_DESTINATION_SIZE"; 178 default: 179 return "[Unknown Error]"; 180 } 181 } 182 183 private: 184 ErrorCode error_code_; 185 186 // Union of extra information for different error code types. 187 union { 188 // UNEXPECTED_ENCODING. 189 struct { 190 EncodingClass encoding_class; 191 EncodingType encoding_type; 192 } unexpected_encoding_; 193 }; 194 }; 195 196 /////////////////////////////////////////////////////////////////////////////// 197 // Object Size // 198 /////////////////////////////////////////////////////////////////////////////// 199 200 inline constexpr std::size_t GetSerializedSize(const bool& b) { 201 return GetEncodingSize(EncodeType(b)); 202 } 203 204 // Overloads of GetSerializedSize() for standard integer types. 205 inline constexpr std::size_t GetSerializedSize(const char& c) { 206 return GetEncodingSize(EncodeType(c)); 207 } 208 inline constexpr std::size_t GetSerializedSize(const std::uint8_t& i) { 209 return GetEncodingSize(EncodeType(i)); 210 } 211 inline constexpr std::size_t GetSerializedSize(const std::int8_t& i) { 212 return GetEncodingSize(EncodeType(i)); 213 } 214 inline constexpr std::size_t GetSerializedSize(const std::uint16_t& i) { 215 return GetEncodingSize(EncodeType(i)); 216 } 217 inline constexpr std::size_t GetSerializedSize(const std::int16_t& i) { 218 return GetEncodingSize(EncodeType(i)); 219 } 220 inline constexpr std::size_t GetSerializedSize(const std::uint32_t& i) { 221 return GetEncodingSize(EncodeType(i)); 222 } 223 inline constexpr std::size_t GetSerializedSize(const std::int32_t& i) { 224 return GetEncodingSize(EncodeType(i)); 225 } 226 inline constexpr std::size_t GetSerializedSize(const std::uint64_t& i) { 227 return GetEncodingSize(EncodeType(i)); 228 } 229 inline constexpr std::size_t GetSerializedSize(const std::int64_t& i) { 230 return GetEncodingSize(EncodeType(i)); 231 } 232 233 inline constexpr std::size_t GetSerializedSize(const float& f) { 234 return GetEncodingSize(EncodeType(f)); 235 } 236 inline constexpr std::size_t GetSerializedSize(const double& d) { 237 return GetEncodingSize(EncodeType(d)); 238 } 239 240 // Overload for enum types. 241 template <typename T> 242 inline EnableIfEnum<T, std::size_t> GetSerializedSize(T v) { 243 return GetSerializedSize(static_cast<std::underlying_type_t<T>>(v)); 244 } 245 246 // Forward declaration for nested definitions. 247 inline std::size_t GetSerializedSize(const EmptyVariant&); 248 template <typename... Types> 249 inline std::size_t GetSerializedSize(const Variant<Types...>&); 250 template <typename T, typename Enabled = EnableIfHasSerializableMembers<T>> 251 inline constexpr std::size_t GetSerializedSize(const T&); 252 template <typename T> 253 inline constexpr std::size_t GetSerializedSize(const PointerWrapper<T>&); 254 inline constexpr std::size_t GetSerializedSize(const std::string&); 255 template <typename T> 256 inline constexpr std::size_t GetSerializedSize(const StringWrapper<T>&); 257 template <typename T> 258 inline constexpr std::size_t GetSerializedSize(const BufferWrapper<T>&); 259 template <FileHandleMode Mode> 260 inline constexpr std::size_t GetSerializedSize(const FileHandle<Mode>&); 261 template <ChannelHandleMode Mode> 262 inline constexpr std::size_t GetSerializedSize(const ChannelHandle<Mode>&); 263 template <typename T, typename Allocator> 264 inline std::size_t GetSerializedSize(const std::vector<T, Allocator>& v); 265 template <typename Key, typename T, typename Compare, typename Allocator> 266 inline std::size_t GetSerializedSize( 267 const std::map<Key, T, Compare, Allocator>& m); 268 template <typename Key, typename T, typename Hash, typename KeyEqual, 269 typename Allocator> 270 inline std::size_t GetSerializedSize( 271 const std::unordered_map<Key, T, Hash, KeyEqual, Allocator>&); 272 template <typename T> 273 inline std::size_t GetSerializedSize(const ArrayWrapper<T>&); 274 template <typename T, std::size_t Size> 275 inline std::size_t GetSerializedSize(const std::array<T, Size>& v); 276 template <typename T, typename U> 277 inline std::size_t GetSerializedSize(const std::pair<T, U>& p); 278 template <typename... T> 279 inline std::size_t GetSerializedSize(const std::tuple<T...>& tuple); 280 281 // Overload for empty variant type. 282 inline std::size_t GetSerializedSize(const EmptyVariant& empty) { 283 return GetEncodingSize(EncodeType(empty)); 284 } 285 286 // Overload for Variant types. 287 template <typename... Types> 288 inline std::size_t GetSerializedSize(const Variant<Types...>& variant) { 289 return GetEncodingSize(EncodeType(variant)) + 290 GetSerializedSize(variant.index()) + 291 variant.Visit( 292 [](const auto& value) { return GetSerializedSize(value); }); 293 } 294 295 // Overload for structs/classes with SerializableMembers defined. 296 template <typename T, typename Enabled> 297 inline constexpr std::size_t GetSerializedSize(const T& value) { 298 return SerializableTraits<T>::GetSerializedSize(value); 299 } 300 301 // Overload for PointerWrapper. 302 template <typename T> 303 inline constexpr std::size_t GetSerializedSize(const PointerWrapper<T>& p) { 304 return GetSerializedSize(p.Dereference()); 305 } 306 307 // Overload for std::string. 308 inline constexpr std::size_t GetSerializedSize(const std::string& s) { 309 return GetEncodingSize(EncodeType(s)) + 310 s.length() * sizeof(std::string::value_type); 311 } 312 313 // Overload for StringWrapper. 314 template <typename T> 315 inline constexpr std::size_t GetSerializedSize(const StringWrapper<T>& s) { 316 return GetEncodingSize(EncodeType(s)) + 317 s.length() * sizeof(typename StringWrapper<T>::value_type); 318 } 319 320 // Overload for BufferWrapper types. 321 template <typename T> 322 inline constexpr std::size_t GetSerializedSize(const BufferWrapper<T>& b) { 323 return GetEncodingSize(EncodeType(b)) + 324 b.size() * sizeof(typename BufferWrapper<T>::value_type); 325 } 326 327 // Overload for FileHandle. FileHandle is encoded as a FIXEXT2, with a type code 328 // of "FileHandle" and a signed 16-bit offset into the pushed fd array. Empty 329 // FileHandles are encoded with an array index of -1. 330 template <FileHandleMode Mode> 331 inline constexpr std::size_t GetSerializedSize(const FileHandle<Mode>& fd) { 332 return GetEncodingSize(EncodeType(fd)) + sizeof(std::int16_t); 333 } 334 335 // Overload for ChannelHandle. ChannelHandle is encoded as a FIXEXT4, with a 336 // type code of "ChannelHandle" and a signed 32-bit offset into the pushed 337 // channel array. Empty ChannelHandles are encoded with an array index of -1. 338 template <ChannelHandleMode Mode> 339 inline constexpr std::size_t GetSerializedSize( 340 const ChannelHandle<Mode>& channel_handle) { 341 return GetEncodingSize(EncodeType(channel_handle)) + sizeof(std::int32_t); 342 } 343 344 // Overload for standard vector types. 345 template <typename T, typename Allocator> 346 inline std::size_t GetSerializedSize(const std::vector<T, Allocator>& v) { 347 return std::accumulate(v.begin(), v.end(), GetEncodingSize(EncodeType(v)), 348 [](const std::size_t& sum, const T& object) { 349 return sum + GetSerializedSize(object); 350 }); 351 } 352 353 // Overload for standard map types. 354 template <typename Key, typename T, typename Compare, typename Allocator> 355 inline std::size_t GetSerializedSize( 356 const std::map<Key, T, Compare, Allocator>& v) { 357 return std::accumulate( 358 v.begin(), v.end(), GetEncodingSize(EncodeType(v)), 359 [](const std::size_t& sum, const std::pair<Key, T>& object) { 360 return sum + GetSerializedSize(object.first) + 361 GetSerializedSize(object.second); 362 }); 363 } 364 365 // Overload for standard unordered_map types. 366 template <typename Key, typename T, typename Hash, typename KeyEqual, 367 typename Allocator> 368 inline std::size_t GetSerializedSize( 369 const std::unordered_map<Key, T, Hash, KeyEqual, Allocator>& v) { 370 return std::accumulate( 371 v.begin(), v.end(), GetEncodingSize(EncodeType(v)), 372 [](const std::size_t& sum, const std::pair<Key, T>& object) { 373 return sum + GetSerializedSize(object.first) + 374 GetSerializedSize(object.second); 375 }); 376 } 377 378 // Overload for ArrayWrapper types. 379 template <typename T> 380 inline std::size_t GetSerializedSize(const ArrayWrapper<T>& v) { 381 return std::accumulate(v.begin(), v.end(), GetEncodingSize(EncodeType(v)), 382 [](const std::size_t& sum, const T& object) { 383 return sum + GetSerializedSize(object); 384 }); 385 } 386 387 // Overload for std::array types. 388 template <typename T, std::size_t Size> 389 inline std::size_t GetSerializedSize(const std::array<T, Size>& v) { 390 return std::accumulate(v.begin(), v.end(), GetEncodingSize(EncodeType(v)), 391 [](const std::size_t& sum, const T& object) { 392 return sum + GetSerializedSize(object); 393 }); 394 } 395 396 // Overload for std::pair. 397 template <typename T, typename U> 398 inline std::size_t GetSerializedSize(const std::pair<T, U>& p) { 399 return GetEncodingSize(EncodeType(p)) + GetSerializedSize(p.first) + 400 GetSerializedSize(p.second); 401 } 402 403 // Stops template recursion when the last tuple element is reached. 404 template <typename... T> 405 inline std::size_t GetTupleSize(const std::tuple<T...>&, Index<0>) { 406 return 0; 407 } 408 409 // Gets the size of each element in a tuple recursively. 410 template <typename... T, std::size_t index> 411 inline std::size_t GetTupleSize(const std::tuple<T...>& tuple, Index<index>) { 412 return GetTupleSize(tuple, Index<index - 1>()) + 413 GetSerializedSize(std::get<index - 1>(tuple)); 414 } 415 416 // Overload for tuple types. Gets the size of the tuple, recursing 417 // through the elements. 418 template <typename... T> 419 inline std::size_t GetSerializedSize(const std::tuple<T...>& tuple) { 420 return GetEncodingSize(EncodeType(tuple)) + 421 GetTupleSize(tuple, Index<sizeof...(T)>()); 422 } 423 424 // Stops template recursion when the last member of a Serializable 425 // type is reached. 426 template <typename Members, typename T> 427 inline std::size_t GetMemberSize(const T&, Index<0>) { 428 return 0; 429 } 430 431 // Gets the size of each member of a Serializable type recursively. 432 template <typename Members, typename T, std::size_t index> 433 inline std::size_t GetMemberSize(const T& object, Index<index>) { 434 return GetMemberSize<Members>(object, Index<index - 1>()) + 435 GetSerializedSize(Members::template At<index - 1>::Resolve(object)); 436 } 437 438 // Gets the size of a type using the given SerializableMembersType 439 // type. 440 template <typename Members, typename T> 441 inline std::size_t GetMembersSize(const T& object) { 442 return GetMemberSize<Members>(object, Index<Members::MemberCount>()); 443 } 444 445 /////////////////////////////////////////////////////////////////////////////// 446 // Object Serialization // 447 /////////////////////////////////////////////////////////////////////////////// 448 449 // 450 // SerializeRaw() converts a primitive array or type into a raw byte string. 451 // These functions are named differently from SerializeObject() expressly to 452 // avoid catch-all specialization of that template, which can be difficult to 453 // detect otherwise. 454 // 455 456 inline void WriteRawData(void*& dest, const void* src, size_t size) { 457 memcpy(dest, src, size); 458 dest = static_cast<uint8_t*>(dest) + size; 459 } 460 461 // Serializes a primitive array into a raw byte string. 462 template <typename T, 463 typename = typename std::enable_if<std::is_pod<T>::value>::type> 464 inline void SerializeRaw(const T& value, void*& buffer) { 465 WriteRawData(buffer, &value, sizeof(value)); 466 } 467 468 inline void SerializeEncoding(EncodingType encoding, void*& buffer) { 469 SerializeRaw(encoding, buffer); 470 } 471 472 inline void SerializeType(const bool& value, void*& buffer) { 473 const EncodingType encoding = EncodeType(value); 474 SerializeEncoding(encoding, buffer); 475 } 476 477 // Serializes the type code, extended type code, and size for 478 // extension types. 479 inline void SerializeExtEncoding(EncodingType encoding, 480 EncodingExtType ext_type, std::size_t size, 481 void*& buffer) { 482 SerializeEncoding(encoding, buffer); 483 if (encoding == ENCODING_TYPE_EXT8) { 484 std::uint8_t length = size; 485 SerializeRaw(length, buffer); 486 } else if (encoding == ENCODING_TYPE_EXT16) { 487 std::uint16_t length = size; 488 SerializeRaw(length, buffer); 489 } else if (encoding == ENCODING_TYPE_EXT32) { 490 std::uint32_t length = size; 491 SerializeRaw(length, buffer); 492 } else /* if (IsFixextEncoding(encoding) */ { 493 // Encoding byte contains the fixext length, nothing else to do. 494 } 495 SerializeRaw(ext_type, buffer); 496 } 497 498 // Serializes the type code for file descriptor types. 499 template <FileHandleMode Mode> 500 inline void SerializeType(const FileHandle<Mode>& value, void*& buffer) { 501 SerializeExtEncoding(EncodeType(value), ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 2, 502 buffer); 503 } 504 505 // Serializes the type code for channel handle types. 506 template <ChannelHandleMode Mode> 507 inline void SerializeType(const ChannelHandle<Mode>& handle, void*& buffer) { 508 SerializeExtEncoding(EncodeType(handle), ENCODING_EXT_TYPE_CHANNEL_HANDLE, 4, 509 buffer); 510 } 511 512 // Serializes type code for variant types. 513 template <typename... Types> 514 inline void SerializeType(const Variant<Types...>& value, void*& buffer) { 515 const EncodingType encoding = EncodeType(value); 516 SerializeEncoding(encoding, buffer); 517 } 518 519 // Serializes the type code for string types. 520 template <typename StringType> 521 inline void SerializeStringType(const StringType& value, void*& buffer) { 522 const EncodingType encoding = EncodeType(value); 523 SerializeEncoding(encoding, buffer); 524 if (encoding == ENCODING_TYPE_STR8) { 525 std::uint8_t length = value.length(); 526 SerializeRaw(length, buffer); 527 } else if (encoding == ENCODING_TYPE_STR16) { 528 std::uint16_t length = value.length(); 529 SerializeRaw(length, buffer); 530 } else if (encoding == ENCODING_TYPE_STR32) { 531 std::uint32_t length = value.length(); 532 SerializeRaw(length, buffer); 533 } else /* if (IsFixstrEncoding(encoding) */ { 534 // Encoding byte contains the fixstr length, nothing else to do. 535 } 536 } 537 538 // Serializes the type code for std::string and StringWrapper. These types are 539 // interchangeable and must serialize to the same format. 540 inline void SerializeType(const std::string& value, void*& buffer) { 541 SerializeStringType(value, buffer); 542 } 543 template <typename T> 544 inline void SerializeType(const StringWrapper<T>& value, void*& buffer) { 545 SerializeStringType(value, buffer); 546 } 547 548 // Serializes the type code for bin types. 549 inline void SerializeBinEncoding(EncodingType encoding, std::size_t size, 550 void*& buffer) { 551 SerializeEncoding(encoding, buffer); 552 if (encoding == ENCODING_TYPE_BIN8) { 553 std::uint8_t length = size; 554 SerializeRaw(length, buffer); 555 } else if (encoding == ENCODING_TYPE_BIN16) { 556 std::uint16_t length = size; 557 SerializeRaw(length, buffer); 558 } else if (encoding == ENCODING_TYPE_BIN32) { 559 std::uint32_t length = size; 560 SerializeRaw(length, buffer); 561 } else { 562 // Invalid encoding for BIN type. 563 } 564 } 565 566 // Serializes the type code for BufferWrapper types. 567 template <typename T> 568 inline void SerializeType(const BufferWrapper<T>& value, void*& buffer) { 569 const EncodingType encoding = EncodeType(value); 570 SerializeBinEncoding( 571 encoding, value.size() * sizeof(typename BufferWrapper<T>::value_type), 572 buffer); 573 } 574 575 // Serializes the array encoding type and length. 576 inline void SerializeArrayEncoding(EncodingType encoding, std::size_t size, 577 void*& buffer) { 578 SerializeEncoding(encoding, buffer); 579 if (encoding == ENCODING_TYPE_ARRAY16) { 580 std::uint16_t length = size; 581 SerializeRaw(length, buffer); 582 } else if (encoding == ENCODING_TYPE_ARRAY32) { 583 std::uint32_t length = size; 584 SerializeRaw(length, buffer); 585 } else /* if (IsFixarrayEncoding(encoding) */ { 586 // Encoding byte contains the fixarray length, nothing else to do. 587 } 588 } 589 590 // Serializes the map encoding type and length. 591 inline void SerializeMapEncoding(EncodingType encoding, std::size_t size, 592 void*& buffer) { 593 SerializeEncoding(encoding, buffer); 594 if (encoding == ENCODING_TYPE_MAP16) { 595 std::uint16_t length = size; 596 SerializeRaw(length, buffer); 597 } else if (encoding == ENCODING_TYPE_MAP32) { 598 std::uint32_t length = size; 599 SerializeRaw(length, buffer); 600 } else /* if (IsFixmapEncoding(encoding) */ { 601 // Encoding byte contains the fixmap length, nothing else to do. 602 } 603 } 604 605 // Serializes the type code for array types. 606 template <typename ArrayType> 607 inline void SerializeArrayType(const ArrayType& value, std::size_t size, 608 void*& buffer) { 609 const EncodingType encoding = EncodeType(value); 610 SerializeArrayEncoding(encoding, size, buffer); 611 } 612 613 // Serializes the type code for map types. 614 template <typename MapType> 615 inline void SerializeMapType(const MapType& value, std::size_t size, 616 void*& buffer) { 617 const EncodingType encoding = EncodeType(value); 618 SerializeMapEncoding(encoding, size, buffer); 619 } 620 621 // Serializes the type code for std::vector and ArrayWrapper. These types are 622 // interchangeable and must serialize to the same format. 623 template <typename T, typename Allocator> 624 inline void SerializeType(const std::vector<T, Allocator>& value, 625 void*& buffer) { 626 SerializeArrayType(value, value.size(), buffer); 627 } 628 template <typename T> 629 inline void SerializeType(const ArrayWrapper<T>& value, void*& buffer) { 630 SerializeArrayType(value, value.size(), buffer); 631 } 632 633 // Serializes the type code for std::array. This type serializes to the same 634 // format as std::vector and ArrayWrapper and is interchangeable in certain 635 // situations. 636 template <typename T, std::size_t Size> 637 inline void SerializeType(const std::array<T, Size>& value, void*& buffer) { 638 SerializeArrayType(value, Size, buffer); 639 } 640 641 // Serializes the type code for std::map types. 642 template <typename Key, typename T, typename Compare, typename Allocator> 643 inline void SerializeType(const std::map<Key, T, Compare, Allocator>& value, 644 void*& buffer) { 645 SerializeMapType(value, value.size(), buffer); 646 } 647 648 // Serializes the type code for std::unordered_map types. 649 template <typename Key, typename T, typename Hash, typename KeyEqual, 650 typename Allocator> 651 inline void SerializeType( 652 const std::unordered_map<Key, T, Hash, KeyEqual, Allocator>& value, 653 void*& buffer) { 654 SerializeMapType(value, value.size(), buffer); 655 } 656 657 // Serializes the type code for std::pair types. 658 template <typename T, typename U> 659 inline void SerializeType(const std::pair<T, U>& value, void*& buffer) { 660 SerializeArrayType(value, 2, buffer); 661 } 662 663 // Serializes the type code for std::tuple types. 664 template <typename... T> 665 inline void SerializeType(const std::tuple<T...>& value, void*& buffer) { 666 SerializeArrayType(value, sizeof...(T), buffer); 667 } 668 669 // Specialization of SerializeObject for boolean type. 670 inline void SerializeObject(const bool& value, MessageWriter* /*writer*/, 671 void*& buffer) { 672 SerializeType(value, buffer); 673 // Encoding contains the boolean value, nothing else to do. 674 } 675 676 // Overloads of SerializeObject for float and double types. 677 inline void SerializeObject(const float& value, MessageWriter* /*writer*/, 678 void*& buffer) { 679 const EncodingType encoding = EncodeType(value); 680 SerializeEncoding(encoding, buffer); 681 SerializeRaw(value, buffer); 682 } 683 684 inline void SerializeObject(const double& value, MessageWriter* /*writer*/, 685 void*& buffer) { 686 const EncodingType encoding = EncodeType(value); 687 SerializeEncoding(encoding, buffer); 688 SerializeRaw(value, buffer); 689 } 690 691 // Overloads of SerializeObject() for standard integer types. 692 inline void SerializeObject(const char& value, MessageWriter* /*writer*/, 693 void*& buffer) { 694 const EncodingType encoding = EncodeType(value); 695 SerializeEncoding(encoding, buffer); 696 if (encoding == ENCODING_TYPE_UINT8) { 697 SerializeRaw(value, buffer); 698 } else /* if (IsUnsignedFixintEncoding(encoding) */ { 699 // Encoding byte contains the value, nothing else to do. 700 } 701 } 702 703 inline void SerializeObject(const int8_t& value, MessageWriter* /*writer*/, 704 void*& buffer) { 705 const EncodingType encoding = EncodeType(value); 706 SerializeEncoding(encoding, buffer); 707 if (encoding == ENCODING_TYPE_INT8) { 708 SerializeRaw(value, buffer); 709 } else /* if (IsFixintEncoding(encoding) */ { 710 // Encoding byte contains the value, nothing else to do. 711 } 712 } 713 714 inline void SerializeObject(const uint8_t& value, MessageWriter* /*writer*/, 715 void*& buffer) { 716 const EncodingType encoding = EncodeType(value); 717 SerializeEncoding(encoding, buffer); 718 if (encoding == ENCODING_TYPE_UINT8) { 719 SerializeRaw(value, buffer); 720 } else /* if (IsUnsignedFixintEncoding(encoding) */ { 721 // Encoding byte contains the value, nothing else to do. 722 } 723 } 724 725 inline void SerializeObject(const int16_t& value, MessageWriter* /*writer*/, 726 void*& buffer) { 727 const EncodingType encoding = EncodeType(value); 728 SerializeEncoding(encoding, buffer); 729 if (encoding == ENCODING_TYPE_INT8) { 730 const int8_t byte = value; 731 SerializeRaw(byte, buffer); 732 } else if (encoding == ENCODING_TYPE_INT16) { 733 SerializeRaw(value, buffer); 734 } else /* if (IsFixintEncoding(encoding) */ { 735 // Encoding byte contains the value, nothing else to do. 736 } 737 } 738 739 inline void SerializeObject(const uint16_t& value, MessageWriter* /*writer*/, 740 void*& buffer) { 741 const EncodingType encoding = EncodeType(value); 742 SerializeEncoding(encoding, buffer); 743 if (encoding == ENCODING_TYPE_UINT8) { 744 const uint8_t byte = value; 745 SerializeRaw(byte, buffer); 746 } else if (encoding == ENCODING_TYPE_UINT16) { 747 SerializeRaw(value, buffer); 748 } else /* if (IsUnsignedFixintEncoding(encoding) */ { 749 // Encoding byte contains the value, nothing else to do. 750 } 751 } 752 753 inline void SerializeObject(const int32_t& value, MessageWriter* /*writer*/, 754 void*& buffer) { 755 const EncodingType encoding = EncodeType(value); 756 SerializeEncoding(encoding, buffer); 757 if (encoding == ENCODING_TYPE_INT8) { 758 const int8_t byte = value; 759 SerializeRaw(byte, buffer); 760 } else if (encoding == ENCODING_TYPE_INT16) { 761 const int16_t half = value; 762 SerializeRaw(half, buffer); 763 } else if (encoding == ENCODING_TYPE_INT32) { 764 SerializeRaw(value, buffer); 765 } else /* if (IsFixintEncoding(encoding) */ { 766 // Encoding byte contains the value, nothing else to do. 767 } 768 } 769 770 inline void SerializeObject(const uint32_t& value, MessageWriter* /*writer*/, 771 void*& buffer) { 772 const EncodingType encoding = EncodeType(value); 773 SerializeEncoding(encoding, buffer); 774 if (encoding == ENCODING_TYPE_UINT8) { 775 const uint8_t byte = value; 776 SerializeRaw(byte, buffer); 777 } else if (encoding == ENCODING_TYPE_UINT16) { 778 const uint16_t half = value; 779 SerializeRaw(half, buffer); 780 } else if (encoding == ENCODING_TYPE_UINT32) { 781 SerializeRaw(value, buffer); 782 } else /* if (IsUnsignedFixintEncoding(encoding) */ { 783 // Encoding byte contains the value, nothing else to do. 784 } 785 } 786 787 inline void SerializeObject(const int64_t& value, MessageWriter* /*writer*/, 788 void*& buffer) { 789 const EncodingType encoding = EncodeType(value); 790 SerializeEncoding(encoding, buffer); 791 if (encoding == ENCODING_TYPE_INT8) { 792 const int8_t byte = value; 793 SerializeRaw(byte, buffer); 794 } else if (encoding == ENCODING_TYPE_INT16) { 795 const int16_t half = value; 796 SerializeRaw(half, buffer); 797 } else if (encoding == ENCODING_TYPE_INT32) { 798 const int32_t word = value; 799 SerializeRaw(word, buffer); 800 } else if (encoding == ENCODING_TYPE_INT64) { 801 SerializeRaw(value, buffer); 802 } else /* if (IsFixintEncoding(encoding) */ { 803 // Encoding byte contains the value, nothing else to do. 804 } 805 } 806 807 inline void SerializeObject(const uint64_t& value, MessageWriter* /*writer*/, 808 void*& buffer) { 809 const EncodingType encoding = EncodeType(value); 810 SerializeEncoding(encoding, buffer); 811 if (encoding == ENCODING_TYPE_UINT8) { 812 const uint8_t byte = value; 813 SerializeRaw(byte, buffer); 814 } else if (encoding == ENCODING_TYPE_UINT16) { 815 const uint16_t half = value; 816 SerializeRaw(half, buffer); 817 } else if (encoding == ENCODING_TYPE_UINT32) { 818 const uint32_t word = value; 819 SerializeRaw(word, buffer); 820 } else if (encoding == ENCODING_TYPE_UINT64) { 821 SerializeRaw(value, buffer); 822 } else /* if (IsUnsignedFixintEncoding(encoding) */ { 823 // Encoding byte contains the value, nothing else to do. 824 } 825 } 826 827 // Serialize enum types. 828 template <typename T> 829 inline EnableIfEnum<T> SerializeObject(const T& value, MessageWriter* writer, 830 void*& buffer) { 831 SerializeObject(static_cast<std::underlying_type_t<T>>(value), writer, 832 buffer); 833 } 834 835 // Forward declaration for nested definitions. 836 inline void SerializeObject(const EmptyVariant&, MessageWriter*, void*&); 837 template <typename... Types> 838 inline void SerializeObject(const Variant<Types...>&, MessageWriter*, void*&); 839 template <typename T, typename Enabled = EnableIfHasSerializableMembers<T>> 840 inline void SerializeObject(const T&, MessageWriter*, void*&); 841 template <typename T> 842 inline void SerializeObject(const PointerWrapper<T>&, MessageWriter*, void*&); 843 template <FileHandleMode Mode> 844 inline void SerializeObject(const FileHandle<Mode>&, MessageWriter*, void*&); 845 template <ChannelHandleMode Mode> 846 inline void SerializeObject(const ChannelHandle<Mode>&, MessageWriter*, void*&); 847 template <typename T, typename Allocator> 848 inline void SerializeObject(const BufferWrapper<std::vector<T, Allocator>>&, MessageWriter*, void*&); 849 template <typename T> 850 inline void SerializeObject(const BufferWrapper<T*>&, MessageWriter*, void*&); 851 inline void SerializeObject(const std::string&, MessageWriter*, void*&); 852 template <typename T> 853 inline void SerializeObject(const StringWrapper<T>&, MessageWriter*, void*&); 854 template <typename T, typename Allocator> 855 inline void SerializeObject(const std::vector<T, Allocator>&, MessageWriter*, void*&); 856 template <typename T> 857 inline void SerializeObject(const ArrayWrapper<T>&, MessageWriter*, void*&); 858 template <typename T, std::size_t Size> 859 inline void SerializeObject(const std::array<T, Size>&, MessageWriter*, void*&); 860 template <typename Key, typename T, typename Compare, typename Allocator> 861 inline void SerializeObject(const std::map<Key, T, Compare, Allocator>&, MessageWriter*, void*&); 862 template <typename Key, typename T, typename Hash, typename KeyEqual, 863 typename Allocator> 864 inline void SerializeObject( 865 const std::unordered_map<Key, T, Hash, KeyEqual, Allocator>&, MessageWriter*, void*&); 866 template <typename T, typename U> 867 inline void SerializeObject(const std::pair<T, U>&, MessageWriter*, void*&); 868 template <typename... T> 869 inline void SerializeObject(const std::tuple<T...>&, MessageWriter*, void*&); 870 871 // Overload for empty variant type. 872 inline void SerializeObject(const EmptyVariant& empty, 873 MessageWriter* /*writer*/, void*& buffer) { 874 const EncodingType encoding = EncodeType(empty); 875 SerializeEncoding(encoding, buffer); 876 } 877 878 // Overload for Variant types. 879 template <typename... Types> 880 inline void SerializeObject(const Variant<Types...>& variant, 881 MessageWriter* writer, void*& buffer) { 882 SerializeType(variant, buffer); 883 SerializeObject(variant.index(), writer, buffer); 884 return variant.Visit([writer, &buffer](const auto& value) { 885 return SerializeObject(value, writer, buffer); 886 }); 887 } 888 889 // Overload for serializable structure/class types. 890 template <typename T, typename Enabled> 891 inline void SerializeObject(const T& value, MessageWriter* writer, 892 void*& buffer) { 893 SerializableTraits<T>::SerializeObject(value, writer, buffer); 894 } 895 896 // Serializes the payload of a PointerWrapper. 897 template <typename T> 898 inline void SerializeObject(const PointerWrapper<T>& pointer, 899 MessageWriter* writer, void*& buffer) { 900 SerializeObject(pointer.Dereference(), writer, buffer); 901 } 902 903 // Serializes the payload of file descriptor types. 904 template <FileHandleMode Mode> 905 inline void SerializeObject(const FileHandle<Mode>& fd, MessageWriter* writer, 906 void*& buffer) { 907 SerializeType(fd, buffer); 908 const Status<FileReference> status = 909 writer->GetOutputResourceMapper()->PushFileHandle(fd); 910 FileReference value = status ? status.get() : -status.error(); 911 SerializeRaw(value, buffer); 912 } 913 914 // Serializes the payload of channel handle types. 915 template <ChannelHandleMode Mode> 916 inline void SerializeObject(const ChannelHandle<Mode>& handle, 917 MessageWriter* writer, void*& buffer) { 918 SerializeType(handle, buffer); 919 const Status<ChannelReference> status = 920 writer->GetOutputResourceMapper()->PushChannelHandle(handle); 921 ChannelReference value = status ? status.get() : -status.error(); 922 SerializeRaw(value, buffer); 923 } 924 925 // Serializes the payload of BufferWrapper types. 926 template <typename T, typename Allocator> 927 inline void SerializeObject(const BufferWrapper<std::vector<T, Allocator>>& b, 928 MessageWriter* /*writer*/, void*& buffer) { 929 const auto value_type_size = 930 sizeof(typename BufferWrapper<std::vector<T, Allocator>>::value_type); 931 SerializeType(b, buffer); 932 WriteRawData(buffer, b.data(), b.size() * value_type_size); 933 } 934 template <typename T> 935 inline void SerializeObject(const BufferWrapper<T*>& b, 936 MessageWriter* /*writer*/, void*& buffer) { 937 const auto value_type_size = sizeof(typename BufferWrapper<T*>::value_type); 938 SerializeType(b, buffer); 939 WriteRawData(buffer, b.data(), b.size() * value_type_size); 940 } 941 942 // Serializes the payload of string types. 943 template <typename StringType> 944 inline void SerializeString(const StringType& s, void*& buffer) { 945 const auto value_type_size = sizeof(typename StringType::value_type); 946 SerializeType(s, buffer); 947 WriteRawData(buffer, s.data(), s.length() * value_type_size); 948 } 949 950 // Overload of SerializeObject() for std::string and StringWrapper. These types 951 // are interchangeable and must serialize to the same format. 952 inline void SerializeObject(const std::string& s, MessageWriter* /*writer*/, 953 void*& buffer) { 954 SerializeString(s, buffer); 955 } 956 template <typename T> 957 inline void SerializeObject(const StringWrapper<T>& s, 958 MessageWriter* /*writer*/, void*& buffer) { 959 SerializeString(s, buffer); 960 } 961 962 // Serializes the payload of array types. 963 template <typename ArrayType> 964 inline void SerializeArray(const ArrayType& v, MessageWriter* writer, 965 void*& buffer) { 966 SerializeType(v, buffer); 967 for (const auto& element : v) 968 SerializeObject(element, writer, buffer); 969 } 970 971 // Serializes the payload for map types. 972 template <typename MapType> 973 inline void SerializeMap(const MapType& v, MessageWriter* writer, 974 void*& buffer) { 975 SerializeType(v, buffer); 976 for (const auto& element : v) { 977 SerializeObject(element.first, writer, buffer); 978 SerializeObject(element.second, writer, buffer); 979 } 980 } 981 982 // Overload of SerializeObject() for std::vector and ArrayWrapper types. These 983 // types are interchangeable and must serialize to the same format. 984 template <typename T, typename Allocator> 985 inline void SerializeObject(const std::vector<T, Allocator>& v, 986 MessageWriter* writer, void*& buffer) { 987 SerializeArray(v, writer, buffer); 988 } 989 template <typename T> 990 inline void SerializeObject(const ArrayWrapper<T>& v, MessageWriter* writer, 991 void*& buffer) { 992 SerializeArray(v, writer, buffer); 993 } 994 995 // Overload of SerializeObject() for std::array types. These types serialize to 996 // the same format at std::vector and ArrayWrapper and are interchangeable in 997 // certain situations. 998 template <typename T, std::size_t Size> 999 inline void SerializeObject(const std::array<T, Size>& v, MessageWriter* writer, 1000 void*& buffer) { 1001 SerializeArray(v, writer, buffer); 1002 } 1003 1004 // Overload of SerializeObject() for std::map types. 1005 template <typename Key, typename T, typename Compare, typename Allocator> 1006 inline void SerializeObject(const std::map<Key, T, Compare, Allocator>& v, 1007 MessageWriter* writer, void*& buffer) { 1008 SerializeMap(v, writer, buffer); 1009 } 1010 1011 // Overload of SerializeObject() for std::unordered_map types. 1012 template <typename Key, typename T, typename Hash, typename KeyEqual, 1013 typename Allocator> 1014 inline void SerializeObject( 1015 const std::unordered_map<Key, T, Hash, KeyEqual, Allocator>& v, 1016 MessageWriter* writer, void*& buffer) { 1017 SerializeMap(v, writer, buffer); 1018 } 1019 1020 // Overload of SerializeObject() for std:pair types. 1021 template <typename T, typename U> 1022 inline void SerializeObject(const std::pair<T, U>& pair, MessageWriter* writer, 1023 void*& buffer) { 1024 SerializeType(pair, buffer); 1025 SerializeObject(pair.first, writer, buffer); 1026 SerializeObject(pair.second, writer, buffer); 1027 } 1028 1029 // Stops template recursion when the last tuple element is reached. 1030 template <typename... T> 1031 inline void SerializeTuple(const std::tuple<T...>&, MessageWriter*, void*&, 1032 Index<0>) {} 1033 1034 // Serializes each element of a tuple recursively. 1035 template <typename... T, std::size_t index> 1036 inline void SerializeTuple(const std::tuple<T...>& tuple, MessageWriter* writer, 1037 void*& buffer, Index<index>) { 1038 SerializeTuple(tuple, writer, buffer, Index<index - 1>()); 1039 SerializeObject(std::get<index - 1>(tuple), writer, buffer); 1040 } 1041 1042 // Overload of SerializeObject() for tuple types. 1043 template <typename... T> 1044 inline void SerializeObject(const std::tuple<T...>& tuple, 1045 MessageWriter* writer, void*& buffer) { 1046 SerializeType(tuple, buffer); 1047 SerializeTuple(tuple, writer, buffer, Index<sizeof...(T)>()); 1048 } 1049 1050 // Stops template recursion when the last member pointer is reached. 1051 template <typename Members, typename T> 1052 inline void SerializeMember(const T&, MessageWriter*, void*&, Index<0>) {} 1053 1054 // Serializes each member pointer recursively. 1055 template <typename Members, typename T, std::size_t index> 1056 inline void SerializeMember(const T& object, MessageWriter* writer, 1057 void*& buffer, Index<index>) { 1058 SerializeMember<Members>(object, writer, buffer, Index<index - 1>()); 1059 SerializeObject(Members::template At<index - 1>::Resolve(object), writer, 1060 buffer); 1061 } 1062 1063 // Serializes the members of a type using the given SerializableMembersType 1064 // type. 1065 template <typename Members, typename T> 1066 inline void SerializeMembers(const T& object, MessageWriter* writer, 1067 void*& buffer) { 1068 SerializeMember<Members>(object, writer, buffer, 1069 Index<Members::MemberCount>()); 1070 } 1071 1072 // Top level serialization function that replaces the buffer's contents. 1073 template <typename T> 1074 inline void Serialize(const T& object, MessageWriter* writer) { 1075 PDX_TRACE_NAME("Serialize"); 1076 const std::size_t size = GetSerializedSize(object); 1077 1078 // Reserve the space needed for the object(s). 1079 void* buffer = writer->GetNextWriteBufferSection(size); 1080 SerializeObject(object, writer, buffer); 1081 } 1082 1083 /////////////////////////////////////////////////////////////////////////////// 1084 // Object Deserialization // 1085 /////////////////////////////////////////////////////////////////////////////// 1086 1087 inline ErrorType ReadRawDataFromNextSection(void* dest, MessageReader* reader, 1088 const void*& start, 1089 const void*& end, size_t size) { 1090 while (AdvancePointer(start, size) > end) { 1091 auto remaining_size = PointerDistance(end, start); 1092 if (remaining_size > 0) { 1093 memcpy(dest, start, remaining_size); 1094 dest = AdvancePointer(dest, remaining_size); 1095 size -= remaining_size; 1096 } 1097 reader->ConsumeReadBufferSectionData(AdvancePointer(start, remaining_size)); 1098 std::tie(start, end) = reader->GetNextReadBufferSection(); 1099 if (start == end) 1100 return ErrorCode::INSUFFICIENT_BUFFER; 1101 } 1102 memcpy(dest, start, size); 1103 start = AdvancePointer(start, size); 1104 return ErrorCode::NO_ERROR; 1105 } 1106 1107 inline ErrorType ReadRawData(void* dest, MessageReader* /*reader*/, 1108 const void*& start, const void*& end, 1109 size_t size) { 1110 if (PDX_UNLIKELY(AdvancePointer(start, size) > end)) { 1111 // TODO(avakulenko): Enabling reading from next sections of input buffer 1112 // (using ReadRawDataFromNextSection) screws up clang compiler optimizations 1113 // (probably inefficient inlining) making the whole deserialization 1114 // code path about twice as slow. Investigate and enable more generic 1115 // deserialization code, but right now we don't really need/support this 1116 // scenario, so I keep this commented out for the time being... 1117 1118 // return ReadRawDataFromNextSection(dest, reader, start, end, size); 1119 return ErrorCode::INSUFFICIENT_BUFFER; 1120 } 1121 memcpy(dest, start, size); 1122 start = AdvancePointer(start, size); 1123 return ErrorCode::NO_ERROR; 1124 } 1125 1126 // Deserializes a primitive object from raw bytes. 1127 template <typename T, 1128 typename = typename std::enable_if<std::is_pod<T>::value>::type> 1129 inline ErrorType DeserializeRaw(T* value, MessageReader* reader, 1130 const void*& start, const void*& end) { 1131 return ReadRawData(value, reader, start, end, sizeof(T)); 1132 } 1133 1134 // Utility to deserialize POD types when the serialized type is different 1135 // (smaller) than the target real type. This happens when values are serialized 1136 // into more compact encodings. 1137 template <typename SerializedType, typename RealType> 1138 ErrorType DeserializeValue(RealType* real_value, MessageReader* reader, 1139 const void*& start, const void*& end) { 1140 SerializedType serialized_value; 1141 if (const auto error = 1142 DeserializeRaw(&serialized_value, reader, start, end)) { 1143 return error; 1144 } else { 1145 *real_value = serialized_value; 1146 return ErrorCode::NO_ERROR; 1147 } 1148 } 1149 1150 inline ErrorType DeserializeEncoding(EncodingType* encoding, 1151 MessageReader* reader, const void*& start, 1152 const void*& end) { 1153 return DeserializeRaw(encoding, reader, start, end); 1154 } 1155 1156 // Overload to deserialize bool type. 1157 inline ErrorType DeserializeObject(bool* value, MessageReader* reader, 1158 const void*& start, const void*& end) { 1159 EncodingType encoding; 1160 if (const auto error = DeserializeEncoding(&encoding, reader, start, end)) { 1161 return error; 1162 } else if (IsBoolEncoding(encoding)) { 1163 *value = (encoding == ENCODING_TYPE_TRUE); 1164 return ErrorCode::NO_ERROR; 1165 } else { 1166 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_BOOL, 1167 encoding); 1168 } 1169 } 1170 1171 // Specializations to deserialize float and double types. 1172 inline ErrorType DeserializeObject(float* value, MessageReader* reader, 1173 const void*& start, const void*& end) { 1174 EncodingType encoding; 1175 if (const auto error = DeserializeEncoding(&encoding, reader, start, end)) { 1176 return error; 1177 } else if (IsFloat32Encoding(encoding)) { 1178 return DeserializeValue<float>(value, reader, start, end); 1179 } else { 1180 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_FLOAT, 1181 encoding); 1182 } 1183 } 1184 1185 inline ErrorType DeserializeObject(double* value, MessageReader* reader, 1186 const void*& start, const void*& end) { 1187 EncodingType encoding; 1188 if (const auto error = DeserializeEncoding(&encoding, reader, start, end)) { 1189 return error; 1190 } else if (IsFloat32Encoding(encoding)) { 1191 return DeserializeValue<float>(value, reader, start, end); 1192 } else if (IsFloat64Encoding(encoding)) { 1193 return DeserializeValue<double>(value, reader, start, end); 1194 } else { 1195 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_FLOAT, 1196 encoding); 1197 } 1198 } 1199 1200 // Specializations to deserialize standard integer types. 1201 inline ErrorType DeserializeObject(char* value, MessageReader* reader, 1202 const void*& start, const void*& end) { 1203 EncodingType encoding; 1204 if (const auto error = DeserializeEncoding(&encoding, reader, start, end)) { 1205 return error; 1206 } else if (IsUnsignedFixintEncoding(encoding)) { 1207 *value = static_cast<char>(encoding); 1208 return ErrorCode::NO_ERROR; 1209 } else if (IsUInt8Encoding(encoding)) { 1210 return DeserializeValue<char>(value, reader, start, end); 1211 } else { 1212 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_UINT, 1213 encoding); 1214 } 1215 } 1216 1217 inline ErrorType DeserializeObject(std::int8_t* value, MessageReader* reader, 1218 const void*& start, const void*& end) { 1219 EncodingType encoding; 1220 if (const auto error = DeserializeEncoding(&encoding, reader, start, end)) { 1221 return error; 1222 } else if (IsFixintEncoding(encoding)) { 1223 *value = static_cast<std::int8_t>(encoding); 1224 return ErrorCode::NO_ERROR; 1225 } else if (IsInt8Encoding(encoding)) { 1226 return DeserializeValue<std::int8_t>(value, reader, start, end); 1227 } else { 1228 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_INT, 1229 encoding); 1230 } 1231 } 1232 1233 inline ErrorType DeserializeObject(std::uint8_t* value, MessageReader* reader, 1234 const void*& start, const void*& end) { 1235 EncodingType encoding; 1236 if (const auto error = DeserializeEncoding(&encoding, reader, start, end)) { 1237 return error; 1238 } else if (IsUnsignedFixintEncoding(encoding)) { 1239 *value = encoding; 1240 return ErrorCode::NO_ERROR; 1241 } else if (IsUInt8Encoding(encoding)) { 1242 return DeserializeValue<std::uint8_t>(value, reader, start, end); 1243 } else { 1244 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_UINT, 1245 encoding); 1246 } 1247 } 1248 1249 inline ErrorType DeserializeObject(std::int16_t* value, MessageReader* reader, 1250 const void*& start, const void*& end) { 1251 EncodingType encoding; 1252 if (const auto error = DeserializeEncoding(&encoding, reader, start, end)) { 1253 return error; 1254 } else if (IsFixintEncoding(encoding)) { 1255 *value = static_cast<std::int8_t>(encoding); 1256 return ErrorCode::NO_ERROR; 1257 } else if (IsInt8Encoding(encoding)) { 1258 return DeserializeValue<std::int8_t>(value, reader, start, end); 1259 } else if (IsInt16Encoding(encoding)) { 1260 return DeserializeValue<std::int16_t>(value, reader, start, end); 1261 } else { 1262 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_INT, 1263 encoding); 1264 } 1265 } 1266 1267 inline ErrorType DeserializeObject(std::uint16_t* value, MessageReader* reader, 1268 const void*& start, const void*& end) { 1269 EncodingType encoding; 1270 if (const auto error = DeserializeEncoding(&encoding, reader, start, end)) { 1271 return error; 1272 } else if (IsUnsignedFixintEncoding(encoding)) { 1273 *value = encoding; 1274 return ErrorCode::NO_ERROR; 1275 } else if (IsUInt8Encoding(encoding)) { 1276 return DeserializeValue<std::uint8_t>(value, reader, start, end); 1277 } else if (IsUInt16Encoding(encoding)) { 1278 return DeserializeValue<std::uint16_t>(value, reader, start, end); 1279 } else { 1280 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_UINT, 1281 encoding); 1282 } 1283 } 1284 1285 inline ErrorType DeserializeObject(std::int32_t* value, MessageReader* reader, 1286 const void*& start, const void*& end) { 1287 EncodingType encoding; 1288 if (const auto error = DeserializeEncoding(&encoding, reader, start, end)) { 1289 return error; 1290 } else if (IsFixintEncoding(encoding)) { 1291 *value = static_cast<std::int8_t>(encoding); 1292 return ErrorCode::NO_ERROR; 1293 } else if (IsInt8Encoding(encoding)) { 1294 return DeserializeValue<std::int8_t>(value, reader, start, end); 1295 } else if (IsInt16Encoding(encoding)) { 1296 return DeserializeValue<std::int16_t>(value, reader, start, end); 1297 } else if (IsInt32Encoding(encoding)) { 1298 return DeserializeValue<std::int32_t>(value, reader, start, end); 1299 } else { 1300 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_INT, 1301 encoding); 1302 } 1303 } 1304 1305 inline ErrorType DeserializeObject(std::uint32_t* value, MessageReader* reader, 1306 const void*& start, const void*& end) { 1307 EncodingType encoding; 1308 if (const auto error = DeserializeEncoding(&encoding, reader, start, end)) { 1309 return error; 1310 } else if (IsUnsignedFixintEncoding(encoding)) { 1311 *value = encoding; 1312 return ErrorCode::NO_ERROR; 1313 } else if (IsUInt8Encoding(encoding)) { 1314 return DeserializeValue<std::uint8_t>(value, reader, start, end); 1315 } else if (IsUInt16Encoding(encoding)) { 1316 return DeserializeValue<std::uint16_t>(value, reader, start, end); 1317 } else if (IsUInt32Encoding(encoding)) { 1318 return DeserializeValue<std::uint32_t>(value, reader, start, end); 1319 } else { 1320 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_UINT, 1321 encoding); 1322 } 1323 } 1324 1325 inline ErrorType DeserializeObject(std::int64_t* value, MessageReader* reader, 1326 const void*& start, const void*& end) { 1327 EncodingType encoding; 1328 if (const auto error = DeserializeEncoding(&encoding, reader, start, end)) { 1329 return error; 1330 } else if (IsFixintEncoding(encoding)) { 1331 *value = static_cast<std::int8_t>(encoding); 1332 return ErrorCode::NO_ERROR; 1333 } else if (IsInt8Encoding(encoding)) { 1334 return DeserializeValue<std::int8_t>(value, reader, start, end); 1335 } else if (IsInt16Encoding(encoding)) { 1336 return DeserializeValue<std::int16_t>(value, reader, start, end); 1337 } else if (IsInt32Encoding(encoding)) { 1338 return DeserializeValue<std::int32_t>(value, reader, start, end); 1339 } else if (IsInt64Encoding(encoding)) { 1340 return DeserializeValue<std::int64_t>(value, reader, start, end); 1341 } else { 1342 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_INT, 1343 encoding); 1344 } 1345 } 1346 1347 inline ErrorType DeserializeObject(std::uint64_t* value, MessageReader* reader, 1348 const void*& start, const void*& end) { 1349 EncodingType encoding; 1350 if (const auto error = DeserializeEncoding(&encoding, reader, start, end)) { 1351 return error; 1352 } else if (IsUnsignedFixintEncoding(encoding)) { 1353 *value = encoding; 1354 return ErrorCode::NO_ERROR; 1355 } else if (IsUInt8Encoding(encoding)) { 1356 return DeserializeValue<std::uint8_t>(value, reader, start, end); 1357 } else if (IsUInt16Encoding(encoding)) { 1358 return DeserializeValue<std::uint16_t>(value, reader, start, end); 1359 } else if (IsUInt32Encoding(encoding)) { 1360 return DeserializeValue<std::uint32_t>(value, reader, start, end); 1361 } else if (IsUInt64Encoding(encoding)) { 1362 return DeserializeValue<std::uint64_t>(value, reader, start, end); 1363 } else { 1364 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_UINT, 1365 encoding); 1366 } 1367 } 1368 1369 template <typename T> 1370 inline EnableIfEnum<T, ErrorType> DeserializeObject(T* value, 1371 MessageReader* reader, 1372 const void*& start, 1373 const void*& end) { 1374 std::underlying_type_t<T> enum_value; 1375 ErrorType error = DeserializeObject(&enum_value, reader, start, end); 1376 if (!error) 1377 *value = static_cast<T>(enum_value); 1378 return error; 1379 } 1380 1381 // Forward declarations for nested definitions. 1382 template <typename T, typename Enabled = EnableIfHasSerializableMembers<T>> 1383 inline ErrorType DeserializeObject(T*, MessageReader*, const void*&, 1384 const void*&); 1385 template <typename T> 1386 inline ErrorType DeserializeObject(PointerWrapper<T>*, MessageReader*, 1387 const void*&, const void*&); 1388 inline ErrorType DeserializeObject(LocalHandle*, MessageReader*, const void*&, 1389 const void*&); 1390 inline ErrorType DeserializeObject(LocalChannelHandle*, MessageReader*, 1391 const void*&, const void*&); 1392 template <typename T, typename Allocator> 1393 inline ErrorType DeserializeObject(BufferWrapper<std::vector<T, Allocator>>*, 1394 MessageReader*, const void*&, const void*&); 1395 template <typename T> 1396 inline ErrorType DeserializeObject(BufferWrapper<T*>*, MessageReader*, 1397 const void*&, const void*&); 1398 inline ErrorType DeserializeObject(std::string*, MessageReader*, const void*&, 1399 const void*&); 1400 template <typename T> 1401 inline ErrorType DeserializeObject(StringWrapper<T>*, MessageReader*, 1402 const void*&, const void*&); 1403 template <typename T, typename U> 1404 inline ErrorType DeserializeObject(std::pair<T, U>*, MessageReader*, 1405 const void*&, const void*&); 1406 template <typename... T> 1407 inline ErrorType DeserializeObject(std::tuple<T...>*, MessageReader*, 1408 const void*&, const void*&); 1409 template <typename T, typename Allocator> 1410 inline ErrorType DeserializeObject(std::vector<T, Allocator>*, MessageReader*, 1411 const void*&, const void*&); 1412 template <typename Key, typename T, typename Compare, typename Allocator> 1413 inline ErrorType DeserializeObject(std::map<Key, T, Compare, Allocator>*, 1414 MessageReader*, const void*&, const void*&); 1415 template <typename Key, typename T, typename Hash, typename KeyEqual, 1416 typename Allocator> 1417 inline ErrorType DeserializeObject( 1418 std::unordered_map<Key, T, Hash, KeyEqual, Allocator>*, MessageReader*, 1419 const void*&, const void*&); 1420 template <typename T> 1421 inline ErrorType DeserializeObject(ArrayWrapper<T>*, MessageReader*, 1422 const void*&, const void*&); 1423 template <typename T, std::size_t Size> 1424 inline ErrorType DeserializeObject(std::array<T, Size>*, MessageReader*, 1425 const void*&, const void*&); 1426 template <typename T, typename U> 1427 inline ErrorType DeserializeObject(std::pair<T, U>*, MessageReader*, 1428 const void*&, const void*&); 1429 template <typename... T> 1430 inline ErrorType DeserializeObject(std::tuple<T...>*, MessageReader*, 1431 const void*&, const void*&); 1432 inline ErrorType DeserializeObject(EmptyVariant*, 1433 MessageReader*, const void*&, 1434 const void*&); 1435 template <typename... Types> 1436 inline ErrorType DeserializeObject(Variant<Types...>*, 1437 MessageReader*, const void*&, 1438 const void*&); 1439 1440 // Deserializes a Serializable type. 1441 template <typename T, typename Enable> 1442 inline ErrorType DeserializeObject(T* value, MessageReader* reader, 1443 const void*& start, const void*& end) { 1444 return SerializableTraits<T>::DeserializeObject(value, reader, start, end); 1445 } 1446 1447 // Deserializes a PointerWrapper. 1448 template <typename T> 1449 inline ErrorType DeserializeObject(PointerWrapper<T>* pointer, 1450 MessageReader* reader, const void*& start, 1451 const void*& end) { 1452 return DeserializeObject(&pointer->Dereference(), reader, start, end); 1453 } 1454 1455 // Deserializes the type code and size for extension types. 1456 inline ErrorType DeserializeExtType(EncodingType* encoding, 1457 EncodingExtType* type, std::size_t* size, 1458 MessageReader* reader, const void*& start, 1459 const void*& end) { 1460 if (const auto error = DeserializeEncoding(encoding, reader, start, end)) { 1461 return error; 1462 } else if (IsFixextEncoding(*encoding)) { 1463 *size = GetFixextSize(*encoding); 1464 } else if (*encoding == ENCODING_TYPE_EXT8) { 1465 if (const auto error = 1466 DeserializeValue<std::uint8_t>(size, reader, start, end)) 1467 return error; 1468 } else if (*encoding == ENCODING_TYPE_EXT16) { 1469 if (const auto error = 1470 DeserializeValue<std::uint16_t>(size, reader, start, end)) 1471 return error; 1472 } else if (*encoding == ENCODING_TYPE_EXT32) { 1473 if (const auto error = 1474 DeserializeValue<std::uint32_t>(size, reader, start, end)) 1475 return error; 1476 } else { 1477 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_EXTENSION, 1478 *encoding); 1479 } 1480 1481 // The extension type code follows the encoding and size. 1482 return DeserializeRaw(type, reader, start, end); 1483 } 1484 1485 // Deserializes a file handle and performs handle space translation, if 1486 // required. 1487 inline ErrorType DeserializeObject(LocalHandle* value, MessageReader* reader, 1488 const void*& start, const void*& end) { 1489 EncodingType encoding; 1490 EncodingExtType type; 1491 std::size_t size; 1492 1493 if (const auto error = 1494 DeserializeExtType(&encoding, &type, &size, reader, start, end)) { 1495 return error; 1496 } else if (size != 2) { 1497 return ErrorType(ErrorCode::UNEXPECTED_TYPE_SIZE, ENCODING_CLASS_EXTENSION, 1498 encoding); 1499 } else if (type == ENCODING_EXT_TYPE_FILE_DESCRIPTOR) { 1500 // Read the encoded file descriptor value. 1501 FileReference ref; 1502 if (const auto error = DeserializeRaw(&ref, reader, start, end)) { 1503 return error; 1504 } 1505 1506 return reader->GetInputResourceMapper()->GetFileHandle(ref, value) 1507 ? ErrorCode::NO_ERROR 1508 : ErrorCode::GET_FILE_DESCRIPTOR_FAILED; 1509 } else { 1510 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_EXTENSION, 1511 encoding); 1512 } 1513 } 1514 1515 inline ErrorType DeserializeObject(LocalChannelHandle* value, 1516 MessageReader* reader, const void*& start, 1517 const void*& end) { 1518 EncodingType encoding; 1519 EncodingExtType type; 1520 std::size_t size; 1521 1522 if (const auto error = 1523 DeserializeExtType(&encoding, &type, &size, reader, start, end)) { 1524 return error; 1525 } else if (size != 4) { 1526 return ErrorType(ErrorCode::UNEXPECTED_TYPE_SIZE, ENCODING_CLASS_EXTENSION, 1527 encoding); 1528 } else if (type == ENCODING_EXT_TYPE_CHANNEL_HANDLE) { 1529 // Read the encoded channel handle value. 1530 ChannelReference ref; 1531 if (const auto error = DeserializeRaw(&ref, reader, start, end)) { 1532 return error; 1533 } 1534 return reader->GetInputResourceMapper()->GetChannelHandle(ref, value) 1535 ? ErrorCode::NO_ERROR 1536 : ErrorCode::GET_CHANNEL_HANDLE_FAILED; 1537 } else { 1538 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_EXTENSION, 1539 encoding); 1540 } 1541 } 1542 1543 // Deserializes the type code and size for bin types. 1544 inline ErrorType DeserializeBinType(EncodingType* encoding, std::size_t* size, 1545 MessageReader* reader, const void*& start, 1546 const void*& end) { 1547 if (const auto error = DeserializeEncoding(encoding, reader, start, end)) { 1548 return error; 1549 } else if (*encoding == ENCODING_TYPE_BIN8) { 1550 return DeserializeValue<std::uint8_t>(size, reader, start, end); 1551 } else if (*encoding == ENCODING_TYPE_BIN16) { 1552 return DeserializeValue<std::uint16_t>(size, reader, start, end); 1553 } else if (*encoding == ENCODING_TYPE_BIN32) { 1554 return DeserializeValue<std::uint32_t>(size, reader, start, end); 1555 } else { 1556 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_BINARY, 1557 *encoding); 1558 } 1559 } 1560 1561 // Overload of DeserializeObject() for BufferWrapper types. 1562 template <typename T, typename Allocator> 1563 inline ErrorType DeserializeObject( 1564 BufferWrapper<std::vector<T, Allocator>>* value, MessageReader* reader, 1565 const void*& start, const void*& end) { 1566 const auto value_type_size = 1567 sizeof(typename BufferWrapper<std::vector<T, Allocator>>::value_type); 1568 EncodingType encoding; 1569 std::size_t size; 1570 1571 if (const auto error = 1572 DeserializeBinType(&encoding, &size, reader, start, end)) 1573 return error; 1574 1575 // Try to resize the BufferWrapper to the size of the payload. 1576 value->resize(size / value_type_size); 1577 1578 if (size > value->size() * value_type_size || size % value_type_size != 0) { 1579 return ErrorCode::INSUFFICIENT_DESTINATION_SIZE; 1580 } else if (size == 0U) { 1581 return ErrorCode::NO_ERROR; 1582 } else { 1583 return ReadRawData(value->data(), reader, start, end, size); 1584 } 1585 } 1586 template <typename T> 1587 inline ErrorType DeserializeObject(BufferWrapper<T*>* value, 1588 MessageReader* reader, const void*& start, 1589 const void*& end) { 1590 const auto value_type_size = sizeof(typename BufferWrapper<T*>::value_type); 1591 EncodingType encoding; 1592 std::size_t size; 1593 1594 if (const auto error = 1595 DeserializeBinType(&encoding, &size, reader, start, end)) 1596 return error; 1597 1598 // Try to resize the BufferWrapper to the size of the payload. 1599 value->resize(size / value_type_size); 1600 1601 if (size > value->size() * value_type_size || size % value_type_size != 0) { 1602 return ErrorCode::INSUFFICIENT_DESTINATION_SIZE; 1603 } else if (size == 0U) { 1604 return ErrorCode::NO_ERROR; 1605 } else { 1606 return ReadRawData(value->data(), reader, start, end, size); 1607 } 1608 } 1609 1610 // Deserializes the type code and size for string types. 1611 inline ErrorType DeserializeStringType(EncodingType* encoding, 1612 std::size_t* size, MessageReader* reader, 1613 const void*& start, const void*& end) { 1614 if (const auto error = DeserializeEncoding(encoding, reader, start, end)) { 1615 return error; 1616 } else if (IsFixstrEncoding(*encoding)) { 1617 *size = GetFixstrSize(*encoding); 1618 return ErrorCode::NO_ERROR; 1619 } else if (*encoding == ENCODING_TYPE_STR8) { 1620 return DeserializeValue<std::uint8_t>(size, reader, start, end); 1621 } else if (*encoding == ENCODING_TYPE_STR16) { 1622 return DeserializeValue<std::uint16_t>(size, reader, start, end); 1623 } else if (*encoding == ENCODING_TYPE_STR32) { 1624 return DeserializeValue<std::uint32_t>(size, reader, start, end); 1625 } else { 1626 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_STRING, 1627 *encoding); 1628 } 1629 } 1630 1631 // Overload of DeserializeObject() for std::string types. 1632 inline ErrorType DeserializeObject(std::string* value, MessageReader* reader, 1633 const void*& start, const void*& end) { 1634 EncodingType encoding; 1635 std::size_t size; 1636 1637 if (const auto error = 1638 DeserializeStringType(&encoding, &size, reader, start, end)) { 1639 return error; 1640 } else if (size == 0U) { 1641 value->clear(); 1642 return ErrorCode::NO_ERROR; 1643 } else { 1644 value->resize(size); 1645 return ReadRawData(&(*value)[0], reader, start, end, size); 1646 } 1647 } 1648 1649 // Overload of DeserializeObject() for StringWrapper types. 1650 template <typename T> 1651 inline ErrorType DeserializeObject(StringWrapper<T>* value, 1652 MessageReader* reader, const void*& start, 1653 const void*& end) { 1654 const auto value_type_size = sizeof(typename StringWrapper<T>::value_type); 1655 EncodingType encoding; 1656 std::size_t size; 1657 1658 if (const auto error = 1659 DeserializeStringType(&encoding, &size, reader, start, end)) 1660 return error; 1661 1662 // Try to resize the StringWrapper to the size of the payload 1663 // string. 1664 value->resize(size / value_type_size); 1665 1666 if (size > value->length() * value_type_size || size % value_type_size != 0) { 1667 return ErrorCode::INSUFFICIENT_DESTINATION_SIZE; 1668 } else if (size == 0U) { 1669 return ErrorCode::NO_ERROR; 1670 } else { 1671 return ReadRawData(value->data(), reader, start, end, size); 1672 } 1673 } 1674 1675 // Deserializes the type code and size of array types. 1676 inline ErrorType DeserializeArrayType(EncodingType* encoding, std::size_t* size, 1677 MessageReader* reader, const void*& start, 1678 const void*& end) { 1679 if (const auto error = DeserializeEncoding(encoding, reader, start, end)) { 1680 return error; 1681 } else if (IsFixarrayEncoding(*encoding)) { 1682 *size = GetFixarraySize(*encoding); 1683 return ErrorCode::NO_ERROR; 1684 } else if (*encoding == ENCODING_TYPE_ARRAY16) { 1685 return DeserializeValue<std::uint16_t>(size, reader, start, end); 1686 } else if (*encoding == ENCODING_TYPE_ARRAY32) { 1687 return DeserializeValue<std::uint32_t>(size, reader, start, end); 1688 } else { 1689 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_ARRAY, 1690 *encoding); 1691 } 1692 } 1693 1694 // Deserializes the type code and size of map types. 1695 inline ErrorType DeserializeMapType(EncodingType* encoding, std::size_t* size, 1696 MessageReader* reader, const void*& start, 1697 const void*& end) { 1698 if (const auto error = DeserializeEncoding(encoding, reader, start, end)) { 1699 return error; 1700 } else if (IsFixmapEncoding(*encoding)) { 1701 *size = GetFixmapSize(*encoding); 1702 return ErrorCode::NO_ERROR; 1703 } else if (*encoding == ENCODING_TYPE_MAP16) { 1704 return DeserializeValue<std::uint16_t>(size, reader, start, end); 1705 } else if (*encoding == ENCODING_TYPE_MAP32) { 1706 return DeserializeValue<std::uint32_t>(size, reader, start, end); 1707 } else { 1708 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_MAP, 1709 *encoding); 1710 } 1711 } 1712 1713 // Overload for std::vector types. 1714 template <typename T, typename Allocator> 1715 inline ErrorType DeserializeObject(std::vector<T, Allocator>* value, 1716 MessageReader* reader, const void*& start, 1717 const void*& end) { 1718 EncodingType encoding; 1719 std::size_t size; 1720 1721 if (const auto error = 1722 DeserializeArrayType(&encoding, &size, reader, start, end)) 1723 return error; 1724 1725 std::vector<T, Allocator> result(size); 1726 for (std::size_t i = 0; i < size; i++) { 1727 if (const auto error = DeserializeObject(&result[i], reader, start, end)) 1728 return error; 1729 } 1730 1731 *value = std::move(result); 1732 return ErrorCode::NO_ERROR; 1733 1734 // TODO(eieio): Consider the benefits and trade offs of this alternative. 1735 #if 0 1736 value->resize(size); 1737 for (std::size_t i = 0; i < size; i++) { 1738 if (const auto error = DeserializeObject(&(*value)[i], reader, start, end)) 1739 return error; 1740 } 1741 return ErrorCode::NO_ERROR; 1742 #endif 1743 } 1744 1745 // Deserializes an EmptyVariant value. 1746 inline ErrorType DeserializeObject(EmptyVariant* /*empty*/, 1747 MessageReader* reader, const void*& start, 1748 const void*& end) { 1749 EncodingType encoding; 1750 1751 if (const auto error = DeserializeEncoding(&encoding, reader, start, end)) { 1752 return error; 1753 } else if (encoding != ENCODING_TYPE_NIL) { 1754 return ErrorType(ErrorCode::UNEXPECTED_ENCODING, ENCODING_CLASS_MAP, 1755 encoding); 1756 } else { 1757 return ErrorCode::NO_ERROR; 1758 } 1759 } 1760 1761 // Deserializes a Variant type. 1762 template <typename... Types> 1763 inline ErrorType DeserializeObject(Variant<Types...>* variant, 1764 MessageReader* reader, const void*& start, 1765 const void*& end) { 1766 EncodingType encoding; 1767 std::size_t size; 1768 1769 if (const auto error = 1770 DeserializeMapType(&encoding, &size, reader, start, end)) { 1771 return error; 1772 } 1773 1774 if (size != 1) 1775 return ErrorType(ErrorCode::UNEXPECTED_TYPE_SIZE, ENCODING_CLASS_MAP, 1776 encoding); 1777 1778 std::int32_t type; 1779 if (const auto error = DeserializeObject(&type, reader, start, end)) { 1780 return error; 1781 } else if (type < Variant<Types...>::kEmptyIndex || 1782 type >= static_cast<std::int32_t>(sizeof...(Types))) { 1783 return ErrorCode::INVALID_VARIANT_ELEMENT; 1784 } else { 1785 variant->Become(type); 1786 return variant->Visit([reader, &start, &end](auto&& value) { 1787 return DeserializeObject(&value, reader, start, end); 1788 }); 1789 } 1790 } 1791 1792 // Deserializes map types. 1793 template <typename MapType> 1794 inline ErrorType DeserializeMap(MapType* value, MessageReader* reader, 1795 const void*& start, const void*& end) { 1796 EncodingType encoding; 1797 std::size_t size; 1798 1799 if (const auto error = 1800 DeserializeMapType(&encoding, &size, reader, start, end)) 1801 return error; 1802 1803 MapType result; 1804 for (std::size_t i = 0; i < size; i++) { 1805 std::pair<typename MapType::key_type, typename MapType::mapped_type> 1806 element; 1807 if (const auto error = 1808 DeserializeObject(&element.first, reader, start, end)) 1809 return error; 1810 if (const auto error = 1811 DeserializeObject(&element.second, reader, start, end)) 1812 return error; 1813 result.emplace(std::move(element)); 1814 } 1815 1816 *value = std::move(result); 1817 return ErrorCode::NO_ERROR; 1818 } 1819 1820 // Overload for std::map types. 1821 template <typename Key, typename T, typename Compare, typename Allocator> 1822 inline ErrorType DeserializeObject(std::map<Key, T, Compare, Allocator>* value, 1823 MessageReader* reader, const void*& start, 1824 const void*& end) { 1825 return DeserializeMap(value, reader, start, end); 1826 } 1827 1828 // Overload for std::unordered_map types. 1829 template <typename Key, typename T, typename Hash, typename KeyEqual, 1830 typename Allocator> 1831 inline ErrorType DeserializeObject( 1832 std::unordered_map<Key, T, Hash, KeyEqual, Allocator>* value, 1833 MessageReader* reader, const void*& start, const void*& end) { 1834 return DeserializeMap(value, reader, start, end); 1835 } 1836 1837 // Overload for ArrayWrapper types. 1838 template <typename T> 1839 inline ErrorType DeserializeObject(ArrayWrapper<T>* value, 1840 MessageReader* reader, const void*& start, 1841 const void*& end) { 1842 EncodingType encoding; 1843 std::size_t size; 1844 1845 if (const auto error = 1846 DeserializeArrayType(&encoding, &size, reader, start, end)) { 1847 return error; 1848 } 1849 1850 // Try to resize the wrapper. 1851 value->resize(size); 1852 1853 // Make sure there is enough space in the ArrayWrapper for the 1854 // payload. 1855 if (size > value->capacity()) 1856 return ErrorCode::INSUFFICIENT_DESTINATION_SIZE; 1857 1858 for (std::size_t i = 0; i < size; i++) { 1859 if (const auto error = DeserializeObject(&(*value)[i], reader, start, end)) 1860 return error; 1861 } 1862 1863 return ErrorCode::NO_ERROR; 1864 } 1865 1866 // Overload for std::array types. 1867 template <typename T, std::size_t Size> 1868 inline ErrorType DeserializeObject(std::array<T, Size>* value, 1869 MessageReader* reader, const void*& start, 1870 const void*& end) { 1871 EncodingType encoding; 1872 std::size_t size; 1873 1874 if (const auto error = 1875 DeserializeArrayType(&encoding, &size, reader, start, end)) { 1876 return error; 1877 } 1878 1879 if (size != Size) 1880 return ErrorCode::INSUFFICIENT_DESTINATION_SIZE; 1881 1882 for (std::size_t i = 0; i < size; i++) { 1883 if (const auto error = DeserializeObject(&(*value)[i], reader, start, end)) 1884 return error; 1885 } 1886 1887 return ErrorCode::NO_ERROR; 1888 } 1889 1890 // Deserializes std::pair types. 1891 template <typename T, typename U> 1892 inline ErrorType DeserializeObject(std::pair<T, U>* value, 1893 MessageReader* reader, const void*& start, 1894 const void*& end) { 1895 EncodingType encoding; 1896 std::size_t size; 1897 1898 if (const auto error = 1899 DeserializeArrayType(&encoding, &size, reader, start, end)) { 1900 return error; 1901 } else if (size != 2) { 1902 return ErrorCode::UNEXPECTED_TYPE_SIZE; 1903 } else if (const auto error = 1904 DeserializeObject(&value->first, reader, start, end)) { 1905 return error; 1906 } else if (const auto error = 1907 DeserializeObject(&value->second, reader, start, end)) { 1908 return error; 1909 } else { 1910 return ErrorCode::NO_ERROR; 1911 } 1912 } 1913 1914 // Stops template recursion when the last tuple element is reached. 1915 template <typename... T> 1916 inline ErrorType DeserializeTuple(std::tuple<T...>*, MessageReader*, 1917 const void*&, const void*, Index<0>) { 1918 return ErrorCode::NO_ERROR; 1919 } 1920 1921 // Deserializes each element of a tuple recursively. 1922 template <typename... T, std::size_t index> 1923 inline ErrorType DeserializeTuple(std::tuple<T...>* tuple, 1924 MessageReader* reader, const void*& start, 1925 const void*& end, Index<index>) { 1926 if (const auto error = 1927 DeserializeTuple(tuple, reader, start, end, Index<index - 1>())) 1928 return error; 1929 else 1930 return DeserializeObject(&std::get<index - 1>(*tuple), reader, start, end); 1931 } 1932 1933 // Overload for standard tuple types. 1934 template <typename... T> 1935 inline ErrorType DeserializeObject(std::tuple<T...>* value, 1936 MessageReader* reader, const void*& start, 1937 const void*& end) { 1938 EncodingType encoding; 1939 std::size_t size; 1940 1941 if (const auto error = 1942 DeserializeArrayType(&encoding, &size, reader, start, end)) { 1943 return error; 1944 } else if (size != sizeof...(T)) { 1945 return ErrorCode::UNEXPECTED_TYPE_SIZE; 1946 } else { 1947 return DeserializeTuple(value, reader, start, end, Index<sizeof...(T)>()); 1948 } 1949 } 1950 1951 // Stops template recursion when the last member of a Serializable type is 1952 // reached. 1953 template <typename Members, typename T> 1954 inline ErrorType DeserializeMember(T*, MessageReader*, const void*&, 1955 const void*, Index<0>) { 1956 return ErrorCode::NO_ERROR; 1957 } 1958 1959 // Deserializes each member of a Serializable type recursively. 1960 template <typename Members, typename T, std::size_t index> 1961 inline ErrorType DeserializeMember(T* value, MessageReader* reader, 1962 const void*& start, const void*& end, 1963 Index<index>) { 1964 if (const auto error = DeserializeMember<Members>(value, reader, start, end, 1965 Index<index - 1>())) 1966 return error; 1967 else 1968 return DeserializeObject(&Members::template At<index - 1>::Resolve(*value), 1969 reader, start, end); 1970 } 1971 1972 // Deserializes the members of a Serializable type using the given 1973 // SerializableMembersType type. 1974 template <typename Members, typename T> 1975 inline ErrorType DeserializeMembers(T* value, MessageReader* reader, 1976 const void*& start, const void*& end) { 1977 return DeserializeMember<Members>(value, reader, start, end, 1978 Index<Members::MemberCount>()); 1979 } 1980 1981 // Top level deserialization function. 1982 template <typename T> 1983 inline ErrorType Deserialize(T* value, MessageReader* reader) { 1984 PDX_TRACE_NAME("Deserialize"); 1985 MessageReader::BufferSection section = reader->GetNextReadBufferSection(); 1986 if (section.first == section.second) 1987 return ErrorCode::INSUFFICIENT_BUFFER; 1988 ErrorType error = 1989 DeserializeObject(value, reader, section.first, section.second); 1990 reader->ConsumeReadBufferSectionData(section.first); 1991 return error; 1992 } 1993 1994 } // namespace rpc 1995 } // namespace pdx 1996 } // namespace android 1997 1998 #endif // ANDROID_PDX_RPC_SERIALIZATION_H_ 1999