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