9 #ifndef zakero_MessagePack_h
10 #define zakero_MessagePack_h
191 #include <system_error>
196 #include <arpa/inet.h>
223 #define ZAKERO_MESSAGEPACK__ERROR_DATA \
224 X(Error_None , 0 , "No Error" ) \
225 X(Error_Unknown , 1 , "An unknown error has occurred" ) \
226 X(Error_Incomplete , 2 , "The data to deserialize is incomplete" ) \
227 X(Error_Invalid_Format_Type , 3 , "An invalid Format Type was encountered" ) \
228 X(Error_Invalid_Index , 4 , "Invalid starting index to deserialize" ) \
229 X(Error_No_Data , 5 , "No data to deserialize" ) \
230 X(Error_Array_Too_Big , 6 , "The array is too large to serialize" ) \
231 X(Error_Ext_Too_Big , 7 , "The extension is too large to serialize" ) \
232 X(Error_Map_Too_Big , 8 , "The map is too large to serialize" ) \
241 namespace zakero::messagepack
246 :
public std::error_category
251 [[nodiscard]]
const char*
name() const noexcept final override;
252 [[nodiscard]] std::
string message(
int condition) const noexcept final override;
257 #define X(name_, val_, mesg_) \
258 const std::error_code name_(val_, ErrorCategory);
259 ZAKERO_MESSAGEPACK__ERROR_DATA
273 [[]]
size_t append(
const bool) noexcept;
274 [[]]
size_t append(
const int64_t) noexcept;
275 [[]]
size_t append(
const uint64_t) noexcept;
276 [[]]
size_t append(
const float) noexcept;
277 [[]]
size_t append(
const double) noexcept;
278 [[]]
size_t append(
const std::string_view) noexcept;
279 [[]]
size_t append(
const std::vector<uint8_t>&) noexcept;
280 [[]]
size_t append(std::vector<uint8_t>&) noexcept;
281 [[]]
size_t append(
const Array&) noexcept;
282 [[]]
size_t append(
Array&) noexcept;
283 [[]]
size_t append(
const Ext&) noexcept;
284 [[]]
size_t append(
Ext&) noexcept;
285 [[]]
size_t append(
const Map&) noexcept;
286 [[]]
size_t append(
Map&) noexcept;
287 [[]]
size_t append(
const Object&) noexcept;
288 [[]]
size_t append(
Object&) noexcept;
289 [[]]
size_t appendNull() noexcept;
291 [[nodiscard]]
inline Object&
object(
const size_t index) noexcept {
return object_vector[index]; }
292 [[nodiscard]]
inline const Object&
object(
const size_t index)
const noexcept {
return object_vector[index]; }
294 [[]]
inline void clear() noexcept {
return object_vector.clear(); };
295 [[nodiscard]]
inline size_t size() const noexcept {
return object_vector.size(); };
297 std::vector<Object> object_vector = {};
305 std::vector<uint8_t> data = {};
315 [[]] std::error_code set(
const Object&,
const Object&) noexcept;
316 [[nodiscard]]
bool keyExists(
const Object&)
const noexcept;
318 [[nodiscard]]
const Object& at(
const Object&)
const noexcept;
320 [[]]
void erase(
const Object&) noexcept;
321 [[]]
inline void clear() noexcept;
322 [[nodiscard]]
inline size_t size()
const noexcept;
324 std::vector<Object> null_map = {};
325 std::map<bool, Object> bool_map = {};
326 std::map<int64_t, Object> int64_map = {};
327 std::map<uint64_t, Object> uint64_map = {};
328 std::map<float, Object> float_map = {};
329 std::map<double, Object> double_map = {};
330 std::map<std::string, Object> string_map = {};
338 std::variant<std::monostate
345 , std::vector<uint8_t>
352 [[nodiscard]] T&
as() noexcept {
return std::get<T>(value); };
354 [[nodiscard]]
const T&
as() const noexcept {
return std::get<T>(value); };
362 [[nodiscard]] std::vector<uint8_t>&
asBinary() noexcept {
return std::get<std::vector<uint8_t>>(value); };
363 [[nodiscard]]
const std::vector<uint8_t>&
asBinary() const noexcept {
return std::get<std::vector<uint8_t>>(value); };
364 [[nodiscard]]
const std::string&
asString() const noexcept {
return std::get<std::string>(value); };
367 [[nodiscard]] constexpr
bool is() const noexcept {
return std::holds_alternative<T>(value); };
369 [[nodiscard]] constexpr
bool isArray() const noexcept {
return std::holds_alternative<messagepack::Array>(value); };
370 [[nodiscard]] constexpr
bool isBinary() const noexcept {
return std::holds_alternative<std::vector<uint8_t>>(value); };
371 [[nodiscard]] constexpr
bool isExt() const noexcept {
return std::holds_alternative<messagepack::Ext>(value); };
372 [[nodiscard]] constexpr
bool isMap() const noexcept {
return std::holds_alternative<messagepack::Map>(value); };
373 [[nodiscard]] constexpr
bool isNull() const noexcept {
return std::holds_alternative<std::monostate>(value); };
374 [[nodiscard]] constexpr
bool isString() const noexcept {
return std::holds_alternative<std::string>(value); };
380 [[nodiscard]]
bool extensionTimestampCheck(
const Object&) noexcept;
381 [[nodiscard]]
struct timespec extensionTimestampConvert(const Object&) noexcept;
382 [[nodiscard]] Object extensionTimestampConvert(
const struct timespec&) noexcept;
387 [[nodiscard]] Object deserialize(
const std::vector<uint8_t>&) noexcept;
388 [[nodiscard]] Object deserialize(
const std::vector<uint8_t>&, std::error_code&) noexcept;
389 [[nodiscard]] Object deserialize(
const std::vector<uint8_t>&,
size_t&) noexcept;
390 [[nodiscard]] Object deserialize(
const std::vector<uint8_t>&,
size_t&, std::error_code&) noexcept;
392 [[nodiscard]] std::vector<uint8_t> serialize(
const messagepack::Array&, std::error_code&) noexcept;
393 [[nodiscard]] std::vector<uint8_t> serialize(
const messagepack::Ext&) noexcept;
394 [[nodiscard]] std::vector<uint8_t> serialize(
const messagepack::Ext&, std::error_code&) noexcept;
395 [[nodiscard]] std::vector<uint8_t> serialize(
const messagepack::Map&) noexcept;
396 [[nodiscard]] std::vector<uint8_t> serialize(
const messagepack::Map&, std::error_code&) noexcept;
398 [[nodiscard]] std::vector<uint8_t> serialize(
const messagepack::Object&, std::error_code&) noexcept;
420 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION
425 #ifdef ZAKERO__DOXYGEN_DEFINE_DOCS
439 #define ZAKERO_MESSAGEPACK_IMPLEMENTATION
463 #define ZAKERO_MESSAGEPACK__FORMAT_TYPE \
465 X(Fixed_Int_Pos , 0x00 , 0b10000000 , 1 , "positive fixint" ) \
466 X(Fixed_Map , 0x80 , 0b11110000 , 1 , "fixmap" ) \
467 X(Fixed_Array , 0x90 , 0b11110000 , 1 , "fixarray" ) \
468 X(Fixed_Str , 0xa0 , 0b11100000 , 1 , "fixstr" ) \
469 X(Nill , 0xc0 , 0b11111111 , 1 , "nill" ) \
470 X(Never_Used , 0xc1 , 0b11111111 , 1 , "(never used)" ) \
471 X(False , 0xc2 , 0b11111111 , 1 , "false" ) \
472 X(True , 0xc3 , 0b11111111 , 1 , "true" ) \
473 X(Bin8 , 0xc4 , 0b11111111 , 2 , "bin 8" ) \
474 X(Bin16 , 0xc5 , 0b11111111 , 259 , "bin 16" ) \
475 X(Bin32 , 0xc6 , 0b11111111 , 65541 , "bin 32" ) \
476 X(Ext8 , 0xc7 , 0b11111111 , 3 , "ext 8" ) \
477 X(Ext16 , 0xc8 , 0b11111111 , 260 , "ext 16" ) \
478 X(Ext32 , 0xc9 , 0b11111111 , 65542 , "ext 32" ) \
479 X(Float32 , 0xca , 0b11111111 , 5 , "float 32" ) \
480 X(Float64 , 0xcb , 0b11111111 , 9 , "float 64" ) \
481 X(Uint8 , 0xcc , 0b11111111 , 2 , "uint 8" ) \
482 X(Uint16 , 0xcd , 0b11111111 , 3 , "uint 16" ) \
483 X(Uint32 , 0xce , 0b11111111 , 5 , "uint 32" ) \
484 X(Uint64 , 0xcf , 0b11111111 , 9 , "uint 64" ) \
485 X(Int8 , 0xd0 , 0b11111111 , 2 , "int 8" ) \
486 X(Int16 , 0xd1 , 0b11111111 , 3 , "int 16" ) \
487 X(Int32 , 0xd2 , 0b11111111 , 5 , "int 32" ) \
488 X(Int64 , 0xd3 , 0b11111111 , 9 , "int 64" ) \
489 X(Fixed_Ext1 , 0xd4 , 0b11111111 , 3 , "fixext 1" ) \
490 X(Fixed_Ext2 , 0xd5 , 0b11111111 , 4 , "fixext 2" ) \
491 X(Fixed_Ext4 , 0xd6 , 0b11111111 , 6 , "fixext 4" ) \
492 X(Fixed_Ext8 , 0xd7 , 0b11111111 , 10 , "fixext 8" ) \
493 X(Fixed_Ext16 , 0xd8 , 0b11111111 , 18 , "fixext 16" ) \
494 X(Str8 , 0xd9 , 0b11111111 , 34 , "str 8" ) \
495 X(Str16 , 0xda , 0b11111111 , 259 , "str 16" ) \
496 X(Str32 , 0xdb , 0b11111111 , 65541 , "str 32" ) \
497 X(Array16 , 0xdc , 0b11111111 , 19 , "array 16" ) \
498 X(Array32 , 0xdd , 0b11111111 , 65541 , "array 32" ) \
499 X(Map16 , 0xde , 0b11111111 , 35 , "map 16" ) \
500 X(Map32 , 0xdf , 0b11111111 , 327429 , "map 32" ) \
501 X(Fixed_Int_Neg , 0xe0 , 0b11100000 , 1 , "negative fixint" ) \
510 namespace zakero::messagepack
528 enum class Format : uint8_t
530 #define X(type_, id_, mask_, size_, text_) \
533 ZAKERO_MESSAGEPACK__FORMAT_TYPE
557 #define X(type_, id_, mask_, size_, text_) \
558 constexpr uint8_t type_ ## _Mask = mask_; \
560 ZAKERO_MESSAGEPACK__FORMAT_TYPE
571 #define X(type_, id_, mask_, size_, text_) \
572 constexpr uint8_t type_ ## _Value = (uint8_t)~mask_;\
574 ZAKERO_MESSAGEPACK__FORMAT_TYPE
604 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
605 uint8_t& Convert_Byte0 = Convert.uint8_[7];
606 uint8_t& Convert_Byte1 = Convert.uint8_[6];
607 uint8_t& Convert_Byte2 = Convert.uint8_[5];
608 uint8_t& Convert_Byte3 = Convert.uint8_[4];
609 uint8_t& Convert_Byte4 = Convert.uint8_[3];
610 uint8_t& Convert_Byte5 = Convert.uint8_[2];
611 uint8_t& Convert_Byte6 = Convert.uint8_[1];
612 uint8_t& Convert_Byte7 = Convert.uint8_[0];
613 #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
614 uint8_t& Convert_Byte0 = Convert.uint8_[0];
615 uint8_t& Convert_Byte1 = Convert.uint8_[1];
616 uint8_t& Convert_Byte2 = Convert.uint8_[2];
617 uint8_t& Convert_Byte3 = Convert.uint8_[3];
618 uint8_t& Convert_Byte4 = Convert.uint8_[4];
619 uint8_t& Convert_Byte5 = Convert.uint8_[5];
620 uint8_t& Convert_Byte6 = Convert.uint8_[6];
621 uint8_t& Convert_Byte7 = Convert.uint8_[7];
633 constexpr
size_t formatSize(Format
id
638 #define X(type_, id_, mask_, size_, text_) \
639 case Format::type_: return size_;
640 ZAKERO_MESSAGEPACK__FORMAT_TYPE
646 std::error_code serialize_(
const messagepack::Array&, std::vector<uint8_t>&) noexcept;
647 std::error_code serialize_(
const messagepack::Ext&, std::vector<uint8_t>&) noexcept;
648 std::error_code serialize_(
const messagepack::Map&, std::vector<uint8_t>&) noexcept;
658 std::error_code serialize_(
const messagepack::Object&
object
659 , std::vector<uint8_t>& vector
664 vector.push_back((uint8_t)Format::Nill);
669 if(
object.is<bool>())
671 vector.push_back(
object.as<bool>()
672 ? (uint8_t)Format::True
673 : (uint8_t)Format::False
679 if(
object.is<int64_t>())
681 const int64_t value =
object.as<int64_t>();
687 vector.push_back((uint8_t)Format::Fixed_Int_Neg
688 | (uint8_t)(value & Fixed_Int_Neg_Value)
691 else if(value >= std::numeric_limits<int8_t>::min())
693 vector.reserve(vector.size() + 2);
695 vector.push_back((uint8_t)Format::Int8);
696 vector.push_back((int8_t)value);
698 else if(value >= std::numeric_limits<int16_t>::min())
700 vector.reserve(vector.size() + 3);
702 vector.push_back((uint8_t)Format::Int16);
704 Convert.int16 = (int16_t)value;
705 vector.push_back(Convert_Byte1);
706 vector.push_back(Convert_Byte0);
708 else if(value >= std::numeric_limits<int32_t>::min())
710 vector.reserve(vector.size() + 5);
712 vector.push_back((uint8_t)Format::Int32);
714 Convert.int32 = (int32_t)value;
715 vector.push_back(Convert_Byte3);
716 vector.push_back(Convert_Byte2);
717 vector.push_back(Convert_Byte1);
718 vector.push_back(Convert_Byte0);
720 else if(value >= std::numeric_limits<int64_t>::min())
722 vector.reserve(vector.size() + 9);
724 vector.push_back((uint8_t)Format::Int64);
726 Convert.int64 = (int64_t)value;
727 vector.push_back(Convert_Byte7);
728 vector.push_back(Convert_Byte6);
729 vector.push_back(Convert_Byte5);
730 vector.push_back(Convert_Byte4);
731 vector.push_back(Convert_Byte3);
732 vector.push_back(Convert_Byte2);
733 vector.push_back(Convert_Byte1);
734 vector.push_back(Convert_Byte0);
739 if(value <= std::numeric_limits<int8_t>::max())
741 vector.push_back((int8_t)value);
743 else if(value <= std::numeric_limits<int16_t>::max())
745 vector.reserve(vector.size() + 3);
747 vector.push_back((uint8_t)Format::Int16);
749 Convert.int16 = (int16_t)value;
750 vector.push_back(Convert_Byte1);
751 vector.push_back(Convert_Byte0);
753 else if(value <= std::numeric_limits<int32_t>::max())
755 vector.reserve(vector.size() + 5);
757 vector.push_back((uint8_t)Format::Int32);
759 Convert.int32 = (int32_t)value;
760 vector.push_back(Convert_Byte3);
761 vector.push_back(Convert_Byte2);
762 vector.push_back(Convert_Byte1);
763 vector.push_back(Convert_Byte0);
765 else if(value <= std::numeric_limits<int64_t>::max())
767 vector.reserve(vector.size() + 9);
769 vector.push_back((uint8_t)Format::Int64);
771 Convert.int64 = (int64_t)value;
772 vector.push_back(Convert_Byte7);
773 vector.push_back(Convert_Byte6);
774 vector.push_back(Convert_Byte5);
775 vector.push_back(Convert_Byte4);
776 vector.push_back(Convert_Byte3);
777 vector.push_back(Convert_Byte2);
778 vector.push_back(Convert_Byte1);
779 vector.push_back(Convert_Byte0);
786 if(
object.is<uint64_t>())
788 const uint64_t value =
object.as<uint64_t>();
790 if(value <= std::numeric_limits<uint8_t>::max())
792 vector.reserve(vector.size() + 2);
794 vector.push_back((uint8_t)Format::Uint8);
795 vector.push_back((uint8_t)value);
797 else if(value <= std::numeric_limits<uint16_t>::max())
799 vector.reserve(vector.size() + 3);
801 vector.push_back((uint8_t)Format::Uint16);
803 Convert.uint16 = (uint16_t)value;
804 vector.push_back(Convert_Byte1);
805 vector.push_back(Convert_Byte0);
807 else if(value <= std::numeric_limits<uint32_t>::max())
809 vector.reserve(vector.size() + 5);
811 vector.push_back((uint8_t)Format::Uint32);
813 Convert.uint32 = (uint32_t)value;
814 vector.push_back(Convert_Byte3);
815 vector.push_back(Convert_Byte2);
816 vector.push_back(Convert_Byte1);
817 vector.push_back(Convert_Byte0);
821 vector.reserve(vector.size() + 9);
823 vector.push_back((uint8_t)Format::Uint64);
825 Convert.uint64 = value;
826 vector.push_back(Convert_Byte7);
827 vector.push_back(Convert_Byte6);
828 vector.push_back(Convert_Byte5);
829 vector.push_back(Convert_Byte4);
830 vector.push_back(Convert_Byte3);
831 vector.push_back(Convert_Byte2);
832 vector.push_back(Convert_Byte1);
833 vector.push_back(Convert_Byte0);
839 if(
object.is<float>())
841 float value =
object.as<
float>();
843 vector.reserve(vector.size() + 5);
845 vector.push_back((uint8_t)Format::Float32);
847 Convert.float32 = value;
848 vector.push_back(Convert_Byte3);
849 vector.push_back(Convert_Byte2);
850 vector.push_back(Convert_Byte1);
851 vector.push_back(Convert_Byte0);
856 if(
object.is<double>())
858 double value =
object.as<
double>();
860 vector.push_back((uint8_t)Format::Float64);
862 Convert.float64 = value;
863 vector.push_back(Convert_Byte7);
864 vector.push_back(Convert_Byte6);
865 vector.push_back(Convert_Byte5);
866 vector.push_back(Convert_Byte4);
867 vector.push_back(Convert_Byte3);
868 vector.push_back(Convert_Byte2);
869 vector.push_back(Convert_Byte1);
870 vector.push_back(Convert_Byte0);
875 if(
object.isString())
877 const std::string& value =
object.asString();
879 const size_t string_length = value.size();
881 if(string_length <= 31)
883 vector.reserve(string_length + 1);
885 vector.push_back((uint8_t)Format::Fixed_Str
886 | (uint8_t)string_length
889 for(
const auto& c : value)
891 vector.push_back((uint8_t)c);
894 else if(string_length <= std::numeric_limits<uint8_t>::max())
896 vector.reserve(string_length + 2);
898 vector.push_back((uint8_t)Format::Str8);
899 vector.push_back((uint8_t)string_length);
901 for(
const auto& c : value)
903 vector.push_back((uint8_t)c);
906 else if(string_length <= std::numeric_limits<uint16_t>::max())
908 vector.reserve(string_length + 3);
910 vector.push_back((uint8_t)Format::Str16);
912 Convert.uint16 = (uint16_t)string_length;
913 vector.push_back(Convert_Byte1);
914 vector.push_back(Convert_Byte0);
916 for(
const auto& c : value)
918 vector.push_back((uint8_t)c);
921 else if(string_length <= std::numeric_limits<uint32_t>::max())
923 vector.reserve(string_length + 5);
925 vector.push_back((uint8_t)Format::Str32);
927 Convert.uint32 = (uint32_t)string_length;
928 vector.push_back(Convert_Byte3);
929 vector.push_back(Convert_Byte2);
930 vector.push_back(Convert_Byte1);
931 vector.push_back(Convert_Byte0);
933 for(
const auto& c : value)
935 vector.push_back((uint8_t)c);
942 if(
object.isBinary())
944 const std::vector<uint8_t>& value =
object.asBinary();
946 const size_t vector_length = value.size();
948 if(vector_length <= std::numeric_limits<uint8_t>::max())
950 vector.reserve(vector_length + 2);
952 vector.push_back((uint8_t)Format::Bin8);
953 vector.push_back((uint8_t)vector_length);
955 vector.insert(vector.end()
960 else if(vector_length <= std::numeric_limits<uint16_t>::max())
962 vector.reserve(vector_length + 3);
964 vector.push_back((uint8_t)Format::Bin16);
966 Convert.uint16 = (uint16_t)vector_length;
967 vector.push_back(Convert_Byte1);
968 vector.push_back(Convert_Byte0);
970 vector.insert(vector.end()
975 else if(vector_length <= std::numeric_limits<uint32_t>::max())
977 vector.reserve(vector_length + 5);
979 vector.push_back((uint8_t)Format::Bin32);
981 Convert.uint32 = (uint32_t)vector_length;
982 vector.push_back(Convert_Byte3);
983 vector.push_back(Convert_Byte2);
984 vector.push_back(Convert_Byte1);
985 vector.push_back(Convert_Byte0);
987 vector.insert(vector.end()
998 const messagepack::Array& array =
object.asArray();
1000 std::error_code error = serialize_(array, vector);
1007 const messagepack::Ext& ext =
object.asExt();
1009 std::error_code error = serialize_(ext, vector);
1016 const messagepack::Map& map =
object.asMap();
1018 std::error_code error = serialize_(map, vector);
1023 return Error_Invalid_Format_Type;
1035 std::error_code serialize_(
const messagepack::Array& array
1036 , std::vector<uint8_t>& vector
1039 const size_t array_size = array.size();
1043 vector.push_back((uint8_t)Format::Fixed_Array
1044 | (uint8_t)array_size
1047 else if(array_size <= std::numeric_limits<uint16_t>::max())
1049 vector.push_back((uint8_t)Format::Array16);
1051 Convert.uint16 = (uint16_t)array_size;
1052 vector.push_back(Convert_Byte1);
1053 vector.push_back(Convert_Byte0);
1055 else if(array_size <= std::numeric_limits<uint32_t>::max())
1057 vector.push_back((uint8_t)Format::Array32);
1059 Convert.uint32 = (uint32_t)array_size;
1060 vector.push_back(Convert_Byte3);
1061 vector.push_back(Convert_Byte2);
1062 vector.push_back(Convert_Byte1);
1063 vector.push_back(Convert_Byte0);
1067 return Error_Array_Too_Big;
1070 for(
const messagepack::Object&
object : array.object_vector)
1072 std::error_code error = serialize_(
object, vector);
1092 std::error_code serialize_(
const messagepack::Ext& ext
1093 , std::vector<uint8_t>& vector
1096 const size_t data_size = ext.data.size();
1100 vector.push_back((uint8_t)Format::Fixed_Ext1);
1102 else if(data_size == 2)
1104 vector.push_back((uint8_t)Format::Fixed_Ext2);
1106 else if(data_size == 4)
1108 vector.push_back((uint8_t)Format::Fixed_Ext4);
1110 else if(data_size == 8)
1112 vector.push_back((uint8_t)Format::Fixed_Ext8);
1114 else if(data_size == 16)
1116 vector.push_back((uint8_t)Format::Fixed_Ext16);
1118 else if(data_size == 0
1119 || data_size <= std::numeric_limits<uint8_t>::max()
1122 vector.push_back((uint8_t)Format::Ext8);
1123 vector.push_back((uint8_t)data_size);
1125 else if(data_size <= std::numeric_limits<uint16_t>::max())
1127 vector.push_back((uint8_t)Format::Ext16);
1129 Convert.uint64 = data_size;
1130 vector.push_back(Convert_Byte1);
1131 vector.push_back(Convert_Byte0);
1133 else if(data_size <= std::numeric_limits<uint32_t>::max())
1135 vector.push_back((uint8_t)Format::Ext32);
1137 Convert.uint64 = data_size;
1138 vector.push_back(Convert_Byte3);
1139 vector.push_back(Convert_Byte2);
1140 vector.push_back(Convert_Byte1);
1141 vector.push_back(Convert_Byte0);
1145 return Error_Ext_Too_Big;
1149 Convert.int8 = ext.type;
1150 vector.push_back(Convert.uint8);
1154 size_t index = vector.size();
1155 vector.resize(vector.size() + data_size);
1156 memcpy((
void*)(vector.data() + index), (
void*)ext.data.data(), data_size);
1171 std::error_code serialize_(
const messagepack::Map& map
1172 , std::vector<uint8_t>& vector
1175 const size_t map_size = map.size();
1179 vector.push_back((uint8_t)Format::Fixed_Map
1183 else if(map_size <= std::numeric_limits<uint16_t>::max())
1185 vector.push_back((uint8_t)Format::Map16);
1187 Convert.uint16 = (uint16_t)map_size;
1188 vector.push_back(Convert_Byte1);
1189 vector.push_back(Convert_Byte0);
1191 else if(map_size <= std::numeric_limits<uint32_t>::max())
1193 vector.push_back((uint8_t)Format::Map32);
1195 Convert.uint32 = (uint32_t)map_size;
1196 vector.push_back(Convert_Byte3);
1197 vector.push_back(Convert_Byte2);
1198 vector.push_back(Convert_Byte1);
1199 vector.push_back(Convert_Byte0);
1203 return Error_Map_Too_Big;
1206 std::error_code error = Error_None;
1208 if(map.null_map.empty() ==
false)
1210 error = serialize_(Object{}, vector);
1217 error = serialize_(map.null_map[0], vector);
1225 for(
const auto& [key, value] : map.bool_map)
1227 error = serialize_(Object{key}, vector);
1234 error = serialize_(value, vector);
1242 for(
const auto& [key, value] : map.int64_map)
1244 error = serialize_(Object{key}, vector);
1251 error = serialize_(value, vector);
1259 for(
const auto& [key, value] : map.uint64_map)
1261 error = serialize_(Object{key}, vector);
1268 error = serialize_(value, vector);
1276 for(
const auto& [key, value] : map.float_map)
1278 error = serialize_(Object{key}, vector);
1285 error = serialize_(value, vector);
1293 for(
const auto& [key, value] : map.double_map)
1295 error = serialize_(Object{key}, vector);
1302 error = serialize_(value, vector);
1310 for(
const auto& [key, value] : map.string_map)
1312 error = serialize_(Object{key}, vector);
1319 error = serialize_(value, vector);
1358 return "zakero::messagepack";
1372 #define X(name_, val_, mesg_) \
1373 case val_: return mesg_;
1374 ZAKERO_MESSAGEPACK__ERROR_DATA
1378 return "Unknown error condition";
1432 const size_t index = object_vector.size();
1434 object_vector.emplace_back(Object{value});
1440 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
1441 TEST_CASE(
"array/append/bool")
1445 size_t index = array.append(
true);
1448 CHECK(array.size() == 1);
1450 index = array.append(
false);
1453 CHECK(array.size() == 2);
1457 std::vector<uint8_t> data =
serialize(array);
1458 CHECK(data.size() == 3);
1461 CHECK((data[index] & Fixed_Array_Mask) == (uint8_t)Format::Fixed_Array);
1462 CHECK((data[index++] & Fixed_Array_Value) == 2);
1463 CHECK(data[index++] == (uint8_t)Format::True);
1464 CHECK(data[index++] == (uint8_t)Format::False);
1470 CHECK(
object.isArray());
1471 Array& test =
object.asArray();
1472 CHECK(test.size() == 2);
1475 const messagepack::Object&
object = array.object(0);
1476 CHECK(
object.is<bool>());
1477 CHECK(
object.as<bool>() ==
true);
1481 const messagepack::Object&
object = array.object(1);
1482 CHECK(
object.is<bool>());
1483 CHECK(
object.as<bool>() ==
false);
1504 const size_t index = object_vector.size();
1506 object_vector.emplace_back(Object{value});
1512 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
1513 TEST_CASE(
"array/append/int64_t")
1515 const int64_t i8_min = -31;
1516 const int64_t i8_max = 127;
1517 const int64_t i16_min = std::numeric_limits<int16_t>::min();
1518 const int64_t i16_max = std::numeric_limits<int16_t>::max();
1519 const int64_t i32_min = std::numeric_limits<int32_t>::min();
1520 const int64_t i32_max = std::numeric_limits<int32_t>::max();
1521 const int64_t i64_min = std::numeric_limits<int64_t>::min();
1522 const int64_t i64_max = std::numeric_limits<int64_t>::max();
1526 array.append(i8_min); count++;
1527 array.append(i8_max); count++;
1528 array.append(i16_min); count++;
1529 array.append(i16_max); count++;
1530 array.append(i32_min); count++;
1531 array.append(i32_max); count++;
1532 array.append(i64_min); count++;
1533 array.append(i64_max); count++;
1535 CHECK(array.size() == count);
1539 std::vector<uint8_t> data =
serialize(array);
1545 CHECK(
object.isArray());
1546 Array& test =
object.asArray();
1547 CHECK(test.size() == count);
1550 CHECK(test.object(index).is<int64_t>());
1551 CHECK(test.object(index).as<int64_t>() == i8_min);
1554 CHECK(test.object(index).is<int64_t>());
1555 CHECK(test.object(index).as<int64_t>() == i8_max);
1558 CHECK(test.object(index).is<int64_t>());
1559 CHECK(test.object(index).as<int64_t>() == i16_min);
1562 CHECK(test.object(index).is<int64_t>());
1563 CHECK(test.object(index).as<int64_t>() == i16_max);
1566 CHECK(test.object(index).is<int64_t>());
1567 CHECK(test.object(index).as<int64_t>() == i32_min);
1570 CHECK(test.object(index).is<int64_t>());
1571 CHECK(test.object(index).as<int64_t>() == i32_max);
1574 CHECK(test.object(index).is<int64_t>());
1575 CHECK(test.object(index).as<int64_t>() == i64_min);
1578 CHECK(test.object(index).is<int64_t>());
1579 CHECK(test.object(index).as<int64_t>() == i64_max);
1599 const size_t index = object_vector.size();
1601 object_vector.emplace_back(Object{value});
1607 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
1608 TEST_CASE(
"array/append/uint64_t")
1610 const uint64_t u8_min = -31;
1611 const uint64_t u8_max = 127;
1612 const uint64_t u16_min = std::numeric_limits<uint16_t>::min();
1613 const uint64_t u16_max = std::numeric_limits<uint16_t>::max();
1614 const uint64_t u32_min = std::numeric_limits<uint32_t>::min();
1615 const uint64_t u32_max = std::numeric_limits<uint32_t>::max();
1616 const uint64_t u64_min = std::numeric_limits<uint64_t>::min();
1617 const uint64_t u64_max = std::numeric_limits<uint64_t>::max();
1621 array.append(u8_min); count++;
1622 array.append(u8_max); count++;
1623 array.append(u16_min); count++;
1624 array.append(u16_max); count++;
1625 array.append(u32_min); count++;
1626 array.append(u32_max); count++;
1627 array.append(u64_min); count++;
1628 array.append(u64_max); count++;
1630 CHECK(array.size() == count);
1634 std::vector<uint8_t> data =
serialize(array);
1640 CHECK(
object.isArray());
1641 Array& test =
object.asArray();
1642 CHECK(test.size() == count);
1645 CHECK(test.object(index).is<uint64_t>());
1646 CHECK(test.object(index).as<uint64_t>() == u8_min);
1649 CHECK(test.object(index).is<uint64_t>());
1650 CHECK(test.object(index).as<uint64_t>() == u8_max);
1653 CHECK(test.object(index).is<uint64_t>());
1654 CHECK(test.object(index).as<uint64_t>() == u16_min);
1657 CHECK(test.object(index).is<uint64_t>());
1658 CHECK(test.object(index).as<uint64_t>() == u16_max);
1661 CHECK(test.object(index).is<uint64_t>());
1662 CHECK(test.object(index).as<uint64_t>() == u32_min);
1665 CHECK(test.object(index).is<uint64_t>());
1666 CHECK(test.object(index).as<uint64_t>() == u32_max);
1669 CHECK(test.object(index).is<uint64_t>());
1670 CHECK(test.object(index).as<uint64_t>() == u64_min);
1673 CHECK(test.object(index).is<uint64_t>());
1674 CHECK(test.object(index).as<uint64_t>() == u64_max);
1694 const size_t index = object_vector.size();
1696 object_vector.emplace_back(Object{value});
1702 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
1703 TEST_CASE(
"array/append/float")
1705 const float f32_min = std::numeric_limits<float>::min();
1706 const float f32_max = std::numeric_limits<float>::max();
1710 array.append(f32_min); count++;
1711 array.append(f32_max); count++;
1713 CHECK(array.size() == count);
1717 std::vector<uint8_t> data =
serialize(array);
1723 CHECK(
object.isArray());
1724 Array& test =
object.asArray();
1725 CHECK(test.size() == count);
1728 CHECK(test.object(index).is<
float>());
1729 CHECK(test.object(index).as<
float>() == f32_min);
1732 CHECK(test.object(index).is<
float>());
1733 CHECK(test.object(index).as<
float>() == f32_max);
1753 const size_t index = object_vector.size();
1755 object_vector.emplace_back(Object{value});
1761 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
1762 TEST_CASE(
"array/append/double")
1764 const double f64_min = std::numeric_limits<double>::min();
1765 const double f64_max = std::numeric_limits<double>::max();
1769 array.append(f64_min); count++;
1770 array.append(f64_max); count++;
1772 CHECK(array.size() == count);
1776 std::vector<uint8_t> data =
serialize(array);
1782 CHECK(
object.isArray());
1783 Array& test =
object.asArray();
1784 CHECK(test.size() == count);
1787 CHECK(test.object(index).is<
double>());
1788 CHECK(test.object(index).as<
double>() == f64_min);
1791 CHECK(test.object(index).is<
double>());
1792 CHECK(test.object(index).as<
double>() == f64_max);
1812 const size_t index = object_vector.size();
1814 object_vector.emplace_back(Object{std::string(value)});
1820 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
1821 TEST_CASE(
"array/append/string")
1823 const std::string str_0;
1824 const std::string str_f (31,
'_');
1825 const std::string str_8 (32,
'X');
1826 const std::string str_16(std::numeric_limits<uint8_t>::max() + 1 ,
'*');
1827 const std::string str_32(std::numeric_limits<uint16_t>::max() + 1,
'|');
1831 array.append(str_0); count++;
1832 array.append(str_f); count++;
1833 array.append(str_8); count++;
1834 array.append(str_16); count++;
1835 array.append(str_32); count++;
1837 CHECK(array.size() == count);
1841 std::vector<uint8_t> data =
serialize(array);
1847 CHECK(
object.isArray());
1848 Array& test =
object.asArray();
1849 CHECK(test.size() == count);
1852 CHECK(test.object(index).is<std::string>());
1853 CHECK(test.object(index).as<std::string>() == str_0);
1856 CHECK(test.object(index).is<std::string>());
1857 CHECK(test.object(index).as<std::string>() == str_f);
1860 CHECK(test.object(index).is<std::string>());
1861 CHECK(test.object(index).as<std::string>() == str_8);
1864 CHECK(test.object(index).is<std::string>());
1865 CHECK(test.object(index).as<std::string>() == str_16);
1868 CHECK(test.object(index).is<std::string>());
1869 CHECK(test.object(index).as<std::string>() == str_32);
1890 const size_t index = object_vector.size();
1892 object_vector.emplace_back(Object{value});
1898 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
1899 TEST_CASE(
"array/append/binary (copy)")
1901 const std::vector<uint8_t> bin_0;
1902 const std::vector<uint8_t> bin_8 (32,
'X');
1903 const std::vector<uint8_t> bin_16(std::numeric_limits<uint8_t>::max() + 1 ,
'-');
1904 const std::vector<uint8_t> bin_32(std::numeric_limits<uint16_t>::max() + 1,
'|');
1908 array.append(bin_0); count++;
1909 array.append(bin_8); count++;
1910 array.append(bin_16); count++;
1911 array.append(bin_32); count++;
1913 CHECK(array.size() == count);
1917 std::vector<uint8_t> data =
serialize(array);
1923 CHECK(
object.isArray());
1924 Array& test =
object.asArray();
1925 CHECK(test.size() == count);
1928 CHECK(test.object(index).is<std::vector<uint8_t>>());
1929 CHECK(test.object(index).as<std::vector<uint8_t>>() == bin_0);
1932 CHECK(test.object(index).is<std::vector<uint8_t>>());
1933 CHECK(test.object(index).as<std::vector<uint8_t>>() == bin_8);
1936 CHECK(test.object(index).is<std::vector<uint8_t>>());
1937 CHECK(test.object(index).as<std::vector<uint8_t>>() == bin_16);
1940 CHECK(test.object(index).is<std::vector<uint8_t>>());
1941 CHECK(test.object(index).as<std::vector<uint8_t>>() == bin_32);
1962 const size_t index = object_vector.size();
1964 object_vector.emplace_back(Object{std::move(value)});
1970 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
1971 TEST_CASE(
"array/append/binary (move)")
1973 const std::vector<uint8_t> bin_0;
1974 const std::vector<uint8_t> bin_8 (32,
'X');
1975 const std::vector<uint8_t> bin_16(std::numeric_limits<uint8_t>::max() + 1 ,
'-');
1976 const std::vector<uint8_t> bin_32(std::numeric_limits<uint16_t>::max() + 1,
'|');
1979 std::vector<uint8_t> tmp_0(bin_0);
1980 std::vector<uint8_t> tmp_8(bin_8);
1981 std::vector<uint8_t> tmp_16(bin_16);
1982 std::vector<uint8_t> tmp_32(bin_32);
1985 array.append(tmp_0); count++;
1986 array.append(tmp_8); count++;
1987 array.append(tmp_16); count++;
1988 array.append(tmp_32); count++;
1990 CHECK(array.size() == count);
1991 CHECK(tmp_0.empty());
1992 CHECK(tmp_8.empty());
1993 CHECK(tmp_16.empty());
1994 CHECK(tmp_32.empty());
1998 std::vector<uint8_t> data =
serialize(array);
2004 CHECK(
object.isArray());
2005 Array& test =
object.asArray();
2006 CHECK(test.size() == count);
2009 CHECK(test.object(index).is<std::vector<uint8_t>>());
2010 CHECK(test.object(index).as<std::vector<uint8_t>>() == bin_0);
2013 CHECK(test.object(index).is<std::vector<uint8_t>>());
2014 CHECK(test.object(index).as<std::vector<uint8_t>>() == bin_8);
2017 CHECK(test.object(index).is<std::vector<uint8_t>>());
2018 CHECK(test.object(index).as<std::vector<uint8_t>>() == bin_16);
2021 CHECK(test.object(index).is<std::vector<uint8_t>>());
2022 CHECK(test.object(index).as<std::vector<uint8_t>>() == bin_32);
2046 size_t index = object_vector.size();
2047 object_vector.emplace_back(Object{Array{}});
2049 Array& sub_array = object_vector[index].asArray();
2050 sub_array.object_vector = array.object_vector;
2056 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
2057 TEST_CASE(
"array/append/array (copy)")
2059 messagepack::Array sub_0;
2060 messagepack::Array sub_1;
2062 messagepack::Array sub_2;
2064 sub_2.append(
false);
2065 messagepack::Array sub_3;
2066 sub_3.append(std::string_view(
"Hello"));
2067 sub_3.append(std::string_view(
"World"));
2070 const messagepack::Array tmp_0 = sub_0;
2071 const messagepack::Array tmp_1 = sub_1;
2072 const messagepack::Array tmp_2 = sub_2;
2073 const messagepack::Array tmp_3 = sub_3;
2076 array.append(tmp_0); count++;
2077 array.append(tmp_1); count++;
2078 array.append(tmp_2); count++;
2079 array.append(tmp_3); count++;
2081 CHECK(array.size() == count);
2082 CHECK(tmp_0.size() == 0);
2083 CHECK(tmp_1.size() == 1);
2084 CHECK(tmp_2.size() == 2);
2085 CHECK(tmp_3.size() == 2);
2089 std::vector<uint8_t> data =
serialize(array);
2095 CHECK(
object.isArray());
2096 Array& test =
object.asArray();
2097 CHECK(test.size() == count);
2100 CHECK(test.object(index).isArray());
2101 CHECK(test.object(index).asArray().size() == 0);
2104 CHECK(test.object(index).isArray());
2105 CHECK(test.object(index).asArray().size() == 1);
2106 CHECK(test.object(index).asArray().object(0).isNull());
2109 CHECK(test.object(index).isArray());
2110 CHECK(test.object(index).asArray().size() == 2);
2111 CHECK(test.object(index).asArray().object(0).is<
bool>());
2112 CHECK(test.object(index).asArray().object(0).as<
bool>() ==
true);
2113 CHECK(test.object(index).asArray().object(1).is<
bool>());
2114 CHECK(test.object(index).asArray().object(1).as<
bool>() ==
false);
2117 CHECK(test.object(index).isArray());
2118 CHECK(test.object(index).asArray().size() == 2);
2119 CHECK(test.object(index).asArray().object(0).is<std::string>());
2120 CHECK(test.object(index).asArray().object(0).as<std::string>() ==
"Hello");
2121 CHECK(test.object(index).asArray().object(1).is<std::string>());
2122 CHECK(test.object(index).asArray().object(1).as<std::string>() ==
"World");
2146 size_t index = object_vector.size();
2147 object_vector.emplace_back(Object{Array{}});
2149 Array& sub_array = object_vector[index].asArray();
2150 sub_array.object_vector = std::move(array.object_vector);
2156 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
2157 TEST_CASE(
"array/append/array (move)")
2159 messagepack::Array sub_0;
2160 messagepack::Array sub_1;
2162 messagepack::Array sub_2;
2164 sub_2.append(
false);
2165 messagepack::Array sub_3;
2166 sub_3.append(std::string_view(
"Hello"));
2167 sub_3.append(std::string_view(
"World"));
2170 messagepack::Array tmp_0 = sub_0;
2171 messagepack::Array tmp_1 = sub_1;
2172 messagepack::Array tmp_2 = sub_2;
2173 messagepack::Array tmp_3 = sub_3;
2176 array.append(tmp_0); count++;
2177 array.append(tmp_1); count++;
2178 array.append(tmp_2); count++;
2179 array.append(tmp_3); count++;
2181 CHECK(array.size() == count);
2182 CHECK(tmp_0.size() == 0);
2183 CHECK(tmp_1.size() == 0);
2184 CHECK(tmp_2.size() == 0);
2185 CHECK(tmp_3.size() == 0);
2189 std::vector<uint8_t> data =
serialize(array);
2195 CHECK(
object.isArray());
2196 Array& test =
object.asArray();
2197 CHECK(test.size() == count);
2200 CHECK(test.object(index).isArray());
2201 CHECK(test.object(index).asArray().size() == 0);
2204 CHECK(test.object(index).isArray());
2205 CHECK(test.object(index).asArray().size() == 1);
2206 CHECK(test.object(index).asArray().object(0).isNull());
2209 CHECK(test.object(index).isArray());
2210 CHECK(test.object(index).asArray().size() == 2);
2211 CHECK(test.object(index).asArray().object(0).is<
bool>());
2212 CHECK(test.object(index).asArray().object(0).as<
bool>() ==
true);
2213 CHECK(test.object(index).asArray().object(1).is<
bool>());
2214 CHECK(test.object(index).asArray().object(1).as<
bool>() ==
false);
2217 CHECK(test.object(index).isArray());
2218 CHECK(test.object(index).asArray().size() == 2);
2219 CHECK(test.object(index).asArray().object(0).is<std::string>());
2220 CHECK(test.object(index).asArray().object(0).as<std::string>() ==
"Hello");
2221 CHECK(test.object(index).asArray().object(1).is<std::string>());
2222 CHECK(test.object(index).asArray().object(1).as<std::string>() ==
"World");
2246 size_t index = object_vector.size();
2247 object_vector.emplace_back(Object{ext});
2253 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
2254 TEST_CASE(
"array/append/ext (copy)")
2256 const uint8_t chr_16 =
'-';
2257 const uint8_t chr_32 =
'|';
2264 { .data = std::vector<uint8_t>(16, chr_16)
2269 { .data = std::vector<uint8_t>(32, chr_32)
2275 array.append(ext_0); count++;
2276 array.append(ext_16); count++;
2277 array.append(ext_32); count++;
2279 CHECK(array.size() == count);
2280 CHECK(ext_0.data.size() == 0);
2281 CHECK(ext_16.data.size() == 16);
2282 CHECK(ext_32.data.size() == 32);
2286 std::vector<uint8_t> data =
serialize(array);
2292 CHECK(
object.isArray());
2293 Array& test =
object.asArray();
2294 CHECK(test.size() == count);
2297 CHECK(test.object(index).isExt() ==
true);
2298 CHECK(test.object(index).asExt().type == 0);
2299 CHECK(test.object(index).asExt().data.size() == 0);
2302 CHECK(test.object(index).isExt() ==
true);
2303 CHECK(test.object(index).asExt().type == 16);
2304 CHECK(test.object(index).asExt().data.size() == 16);
2305 for(
size_t i = 0; i < test.object(index).asExt().data.size(); i++)
2307 CHECK(test.object(index).asExt().data[i] == chr_16);
2311 CHECK(test.object(index).isExt() ==
true);
2312 CHECK(test.object(index).asExt().type == 32);
2313 CHECK(test.object(index).asExt().data.size() == 32);
2314 for(
size_t i = 0; i < test.object(index).asExt().data.size(); i++)
2316 CHECK(test.object(index).asExt().data[i] == chr_32);
2341 size_t index = object_vector.size();
2342 object_vector.push_back(Object{std::move(ext)});
2348 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
2349 TEST_CASE(
"array/append/ext (move)")
2351 const uint8_t chr_16 =
'-';
2352 const uint8_t chr_32 =
'|';
2360 ext_16.data = std::vector<uint8_t>(16, chr_16);
2364 ext_32.data = std::vector<uint8_t>(32, chr_32);
2368 array.append(ext_0); count++;
2369 array.append(ext_16); count++;
2370 array.append(ext_32); count++;
2372 CHECK(array.size() == count);
2373 CHECK(ext_16.data.size() == 0);
2374 CHECK(ext_32.data.size() == 0);
2378 std::vector<uint8_t> data =
serialize(array);
2384 CHECK(
object.isArray());
2385 Array& test =
object.asArray();
2386 CHECK(test.size() == count);
2389 CHECK(test.object(index).isExt());
2390 CHECK(test.object(index).asExt().type == 0);
2391 CHECK(test.object(index).asExt().data.size() == 0);
2394 CHECK(test.object(index).isExt());
2395 CHECK(test.object(index).asExt().type == 16);
2396 CHECK(test.object(index).asExt().data.size() == 16);
2397 for(
size_t i = 0; i < test.object(index).asExt().data.size(); i++)
2399 CHECK(test.object(index).asExt().data[i] == chr_16);
2403 CHECK(test.object(index).isExt());
2404 CHECK(test.object(index).asExt().type == 32);
2405 CHECK(test.object(index).asExt().data.size() == 32);
2406 for(
size_t i = 0; i < test.object(index).asExt().data.size(); i++)
2408 CHECK(test.object(index).asExt().data[i] == chr_32);
2432 size_t index = object_vector.size();
2433 object_vector.emplace_back(Object{map});
2439 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
2440 TEST_CASE(
"array/append/map (copy)")
2442 const Object key_1 = Object{
true};
2443 const Object key_2 = Object{int64_t(0)};
2445 const std::string str(
"Hello, World!");
2446 const uint64_t num(21);
2448 const Object val_1 = Object{str};
2449 const Object val_2 = Object{num};
2452 map_1.set(key_1, val_1);
2453 map_1.set(key_2, val_2);
2456 map_2.set(val_1, key_1);
2457 map_2.set(val_2, key_2);
2461 array.append((
const Map)map_1); count++;
2462 array.append((
const Map)map_2); count++;
2464 CHECK(map_1.size() == 2);
2465 CHECK(map_2.size() == 2);
2466 CHECK(array.size() == count);
2470 std::vector<uint8_t> data =
serialize(array);
2476 CHECK(
object.isArray());
2477 Array& test =
object.asArray();
2478 CHECK(test.size() == count);
2481 CHECK(test.object(index).isMap());
2482 CHECK(test.object(index).asMap().size() == 2);
2483 CHECK(test.object(index).asMap().keyExists(key_1) ==
true);
2484 CHECK(test.object(index).asMap().at(key_1) == val_1);
2485 CHECK(test.object(index).asMap().keyExists(key_2) ==
true);
2486 CHECK(test.object(index).asMap().at(key_2) == val_2);
2489 CHECK(test.object(index).isMap());
2490 CHECK(test.object(index).asMap().size() == 2);
2491 CHECK(test.object(index).asMap().keyExists(val_1) ==
true);
2492 CHECK(test.object(index).asMap().at(val_1) == key_1);
2493 CHECK(test.object(index).asMap().keyExists(val_2) ==
true);
2494 CHECK(test.object(index).asMap().at(val_2) == key_2);
2517 size_t index = object_vector.size();
2518 object_vector.push_back(Object{std::move(map)});
2524 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
2525 TEST_CASE(
"array/append/map (move)")
2527 const Object key_1 = Object{
true};
2528 const Object key_2 = Object{int64_t(0)};
2530 const std::string str(
"Hello, World!");
2531 const uint64_t num(21);
2533 const Object val_1 = Object{str};
2534 const Object val_2 = Object{num};
2537 map_1.set(key_1, val_1);
2538 map_1.set(key_2, val_2);
2541 map_2.set(val_1, key_1);
2542 map_2.set(val_2, key_2);
2546 array.append(map_1); count++;
2547 array.append(map_2); count++;
2549 CHECK(array.size() == count);
2550 CHECK(map_1.size() == 0);
2551 CHECK(map_2.size() == 0);
2555 std::vector<uint8_t> data =
serialize(array);
2561 CHECK(
object.isArray());
2562 Array& test =
object.asArray();
2563 CHECK(test.size() == count);
2566 CHECK(test.object(index).isMap());
2567 CHECK(test.object(index).asMap().size() == 2);
2568 CHECK(test.object(index).asMap().keyExists(key_1) ==
true);
2569 CHECK(test.object(index).asMap().at(key_1) == val_1);
2570 CHECK(test.object(index).asMap().keyExists(key_2) ==
true);
2571 CHECK(test.object(index).asMap().at(key_2) == val_2);
2574 CHECK(test.object(index).isMap());
2575 CHECK(test.object(index).asMap().size() == 2);
2576 CHECK(test.object(index).asMap().keyExists(val_1) ==
true);
2577 CHECK(test.object(index).asMap().at(val_1) == key_1);
2578 CHECK(test.object(index).asMap().keyExists(val_2) ==
true);
2579 CHECK(test.object(index).asMap().at(val_2) == key_2);
2600 const size_t index = object_vector.size();
2602 object_vector.push_back(
object);
2608 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
2609 TEST_CASE(
"array/append/object (copy)")
2611 messagepack::Object obj_0 = Object{
true};
2612 messagepack::Object obj_1 = Object{(uint64_t)42};
2613 messagepack::Object obj_2 = Object{std::string(
"foo")};
2615 const messagepack::Object tmp_0 = obj_0;
2616 const messagepack::Object tmp_1 = obj_1;
2617 const messagepack::Object tmp_2 = obj_2;
2621 array.append(tmp_0); count++;
2622 array.append(tmp_1); count++;
2623 array.append(tmp_2); count++;
2625 CHECK(array.size() == count);
2626 CHECK(tmp_0.isNull() ==
false);
2627 CHECK(tmp_1.isNull() ==
false);
2628 CHECK(tmp_2.isNull() ==
false);
2632 std::vector<uint8_t> data =
serialize(array);
2638 CHECK(
object.isArray());
2639 Array& test =
object.asArray();
2640 CHECK(test.size() == count);
2643 CHECK(test.object(index).is<
bool>());
2644 CHECK(test.object(index).as<
bool>() ==
true);
2647 CHECK(test.object(index).is<uint64_t>());
2648 CHECK(test.object(index).as<uint64_t>() == 42);
2651 CHECK(test.object(index).is<std::string>());
2652 CHECK(test.object(index).as<std::string>() ==
"foo");
2672 const size_t index = object_vector.size();
2674 object_vector.push_back(std::move(
object));
2681 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
2682 TEST_CASE(
"array/append/object (move)")
2684 messagepack::Object obj_0 = Object{
true};
2685 messagepack::Object obj_1 = Object{(uint64_t)42};
2686 messagepack::Object obj_2 = Object{std::string(
"foo")};
2688 messagepack::Object tmp_0 = obj_0;
2689 messagepack::Object tmp_1 = obj_1;
2690 messagepack::Object tmp_2 = obj_2;
2694 array.append(tmp_0); count++;
2695 array.append(tmp_1); count++;
2696 array.append(tmp_2); count++;
2698 CHECK(array.size() == count);
2699 CHECK(tmp_0.isNull() ==
true);
2700 CHECK(tmp_1.isNull() ==
true);
2701 CHECK(tmp_2.isNull() ==
true);
2705 std::vector<uint8_t> data =
serialize(array);
2711 CHECK(
object.isArray());
2712 Array& test =
object.asArray();
2713 CHECK(test.size() == count);
2716 CHECK(test.object(index).is<
bool>());
2717 CHECK(test.object(index).as<
bool>() ==
true);
2720 CHECK(test.object(index).is<uint64_t>());
2721 CHECK(test.object(index).as<uint64_t>() == 42);
2724 CHECK(test.object(index).is<std::string>());
2725 CHECK(test.object(index).as<std::string>() ==
"foo");
2752 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
2753 TEST_CASE(
"array/append/null")
2755 const size_t count = std::numeric_limits<uint16_t>::max() + 1;
2758 for(
size_t i = 0; i < count; i++)
2760 array.append(Object{
true});
2763 CHECK(array.size() == count);
2767 std::vector<uint8_t> data =
serialize(array);
2773 CHECK(
object.isArray());
2774 Array& test =
object.asArray();
2775 CHECK(test.size() == count);
2777 for(
size_t i = 0; i < count; i++)
2779 CHECK(test.object(i).is<
bool>());
2780 CHECK(test.object(i).as<
bool>() ==
true);
2988 std::error_code
Map::set(
const Object& key
2989 ,
const Object& value
3000 null_map.push_back(value);
3002 else if(key.is<
bool>())
3004 bool_map[key.as<
bool>()] = value;
3006 else if(key.is<int64_t>())
3008 int64_map[key.as<int64_t>()] = value;
3010 else if(key.is<uint64_t>())
3012 uint64_map[key.as<uint64_t>()] = value;
3014 else if(key.is<
float>())
3016 float_map[key.as<
float>()] = value;
3018 else if(key.is<
double>())
3020 double_map[key.as<
double>()] = value;
3022 else if(key.is<std::string>())
3024 string_map[key.as<std::string>()] = value;
3027 return Error_Invalid_Format_Type;
3030 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
3031 TEST_CASE(
"map/set (copy)")
3033 const Object key_null = {};
3034 const Object key_zero = {int64_t(0)};
3035 const Object val_null = {};
3036 const Object val_zero = {int64_t(0)};
3040 SUBCASE(
"Same Key, Same Value")
3042 map.set(key_null, val_null);
3043 CHECK(map.size() == 1);
3044 const Object& obj_1 = map.at(key_null);
3045 CHECK(obj_1 == val_null);
3046 CHECK(&obj_1 != &val_null);
3048 map.set(key_null, val_null);
3049 CHECK(map.size() == 1);
3050 const Object& obj_2 = map.at(key_null);
3051 CHECK(obj_2 == val_null);
3052 CHECK(&obj_2 != &val_null);
3055 SUBCASE(
"Same Key, Differnt Value")
3057 map.set(key_null, val_null);
3058 CHECK(map.size() == 1);
3059 const Object& obj_1 = map.at(key_null);
3060 CHECK(obj_1 == val_null);
3062 map.set(key_null, val_zero);
3063 CHECK(map.size() == 1);
3064 const Object& obj_2 = map.at(key_null);
3065 CHECK(obj_2 == val_zero);
3068 SUBCASE(
"Different Key, Same Value")
3070 map.set(key_null, val_null);
3071 map.set(key_zero, val_null);
3072 CHECK(map.size() == 2);
3074 const Object& obj_1 = map.at(key_null);
3075 CHECK(obj_1 == val_null);
3077 const Object& obj_2 = map.at(key_zero);
3078 CHECK(obj_2 == val_null);
3081 SUBCASE(
"Different Key, Different Value")
3083 map.set(key_null, val_null);
3084 map.set(key_zero, val_zero);
3085 CHECK(map.size() == 2);
3087 const Object& obj_1 = map.at(key_null);
3088 CHECK(obj_1 == val_null);
3090 const Object& obj_2 = map.at(key_zero);
3091 CHECK(obj_2 == val_zero);
3112 std::error_code
Map::set(Object& key
3124 null_map.push_back(value);
3126 else if(key.is<
bool>())
3128 bool_map[key.as<
bool>()] = value;
3130 else if(key.is<int64_t>())
3132 int64_map[key.as<int64_t>()] = value;
3134 else if(key.is<uint64_t>())
3136 uint64_map[key.as<uint64_t>()] = value;
3138 else if(key.is<
float>())
3140 float_map[key.as<
float>()] = value;
3142 else if(key.is<
double>())
3144 double_map[key.as<
double>()] = value;
3146 else if(key.is<std::string>())
3148 string_map[key.as<std::string>()] = value;
3151 return Error_Invalid_Format_Type;
3155 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
3156 TEST_CASE(
"map/set")
3158 Object key_true = Object{
true};
3159 Object key_zero = Object{int64_t(0)};
3160 Object val_true = Object{
true};
3161 Object val_zero = Object{int64_t(0)};
3165 SUBCASE(
"Same Key, Same Value")
3167 map.set(key_true, val_true);
3168 CHECK(map.size() == 1);
3170 Object& obj_1 = map.at(key_true);
3171 CHECK(obj_1 == val_true);
3173 CHECK(map.at(key_true) == val_zero);
3175 map.set(key_true, val_zero);
3176 CHECK(map.size() == 1);
3178 Object& obj_2 = map.at(key_true);
3179 CHECK(obj_2 == val_zero);
3182 SUBCASE(
"Same Key, Differnt Value")
3184 map.set(key_true, val_true);
3185 CHECK(map.size() == 1);
3187 CHECK(map.at(key_true) == val_true);
3189 map.set(key_true, val_zero);
3190 CHECK(map.size() == 1);
3191 CHECK(map.at(key_true) == val_zero);
3194 SUBCASE(
"Different Key, Same Value")
3196 map.set(key_true, val_true);
3197 map.set(key_zero, val_true);
3198 CHECK(map.size() == 2);
3199 CHECK(map.at(key_true) == val_true);
3200 CHECK(map.at(key_zero) == val_true);
3203 SUBCASE(
"Different Key, Different Value")
3205 map.set(key_true, val_true);
3206 map.set(key_zero, val_zero);
3207 CHECK(map.size() == 2);
3208 CHECK(map.at(key_true) == val_true);
3209 CHECK(map.at(key_zero) == val_zero);
3238 else if(key.is<
bool>())
3240 bool_map.erase(key.as<
bool>());
3242 else if(key.is<int64_t>())
3244 int64_map.erase(key.as<int64_t>());
3246 else if(key.is<uint64_t>())
3248 uint64_map.erase(key.as<uint64_t>());
3250 else if(key.is<
float>())
3252 float_map.erase(key.as<
float>());
3254 else if(key.is<
double>())
3256 double_map.erase(key.as<
double>());
3258 else if(key.is<std::string>())
3260 string_map.erase(key.as<std::string>());
3265 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
3266 TEST_CASE(
"map/erase")
3268 Object key_nope = Object{};
3269 Object key_true = Object{
true};
3270 Object key_zero = Object{int64_t(0)};
3271 Object val_null = Object{};
3275 map.erase(key_nope);
3277 map.set(key_true, val_null);
3278 map.set(key_zero, val_null);
3279 CHECK(map.keyExists(key_true) ==
true);
3280 CHECK(map.keyExists(key_zero) ==
true);
3282 map.erase(key_nope);
3283 CHECK(map.size() == 2);
3285 map.erase(key_true);
3286 CHECK(map.size() == 1);
3287 CHECK(map.keyExists(key_true) ==
false);
3288 CHECK(map.keyExists(key_zero) ==
true);
3290 map.erase(key_true);
3291 CHECK(map.size() == 1);
3292 CHECK(map.keyExists(key_true) ==
false);
3293 CHECK(map.keyExists(key_zero) ==
true);
3295 map.erase(key_zero);
3296 CHECK(map.size() == 0);
3297 CHECK(map.keyExists(key_true) ==
false);
3298 CHECK(map.keyExists(key_zero) ==
false);
3300 map.erase(key_zero);
3301 CHECK(map.size() == 0);
3302 CHECK(map.keyExists(key_true) ==
false);
3303 CHECK(map.keyExists(key_zero) ==
false);
3332 return (null_map.empty() ==
false);
3334 else if(key.is<
bool>())
3336 return bool_map.contains(key.as<
bool>());
3338 else if(key.is<int64_t>())
3340 return int64_map.contains(key.as<int64_t>());
3342 else if(key.is<uint64_t>())
3344 return uint64_map.contains(key.as<uint64_t>());
3346 else if(key.is<
float>())
3348 return float_map.contains(key.as<
float>());
3350 else if(key.is<
double>())
3352 return double_map.contains(key.as<
double>());
3354 else if(key.is<std::string>())
3356 return string_map.contains(key.as<std::string>());
3363 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
3364 TEST_CASE(
"map/keyexists")
3366 const Object key_true = Object{
true};
3367 const Object key_zero = Object{int64_t(0)};
3368 const Object val_null = Object{};
3372 CHECK(map.size() == 0);
3373 CHECK(map.keyExists(key_true) ==
false);
3374 CHECK(map.keyExists(key_zero) ==
false);
3376 map.set(key_true, val_null);
3377 CHECK(map.keyExists(key_true) ==
true);
3378 CHECK(map.keyExists(key_zero) ==
false);
3380 map.set(key_zero, val_null);
3381 CHECK(map.keyExists(key_true) ==
true);
3382 CHECK(map.keyExists(key_zero) ==
true);
3409 const Object&
Map::at(
const Object& key
3412 if(keyExists(key) ==
false)
3419 return null_map.at(0);
3421 else if(key.is<
bool>())
3423 return bool_map.at(key.as<
bool>());
3425 else if(key.is<int64_t>())
3427 return int64_map.at(key.as<int64_t>());
3429 else if(key.is<uint64_t>())
3431 return uint64_map.at(key.as<uint64_t>());
3433 else if(key.is<
float>())
3435 return float_map.at(key.as<
float>());
3437 else if(key.is<
double>())
3439 return double_map.at(key.as<
double>());
3441 else if(key.is<std::string>())
3443 return string_map.at(key.as<std::string>());
3450 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
3451 TEST_CASE(
"map/valueof (const)")
3457 const Object key_null = {};
3458 const Object key_bool = {
true};
3459 const Object key_int64 = {int64_t(0)};
3460 const Object key_uint64 = {uint64_t(0)};
3461 const Object key_float = {float(0)};
3462 const Object key_double = {double(0)};
3463 const Object key_string = {std::string(
"_")};
3465 const Object value_0 = {uint64_t(0)};
3466 const Object value_1 = {uint64_t(1)};
3467 const Object value_2 = {uint64_t(2)};
3468 const Object value_3 = {uint64_t(3)};
3469 const Object value_4 = {uint64_t(4)};
3470 const Object value_5 = {uint64_t(5)};
3471 const Object value_6 = {uint64_t(6)};
3473 map.set(key_null, value_0);
3474 map.set(key_bool, value_1);
3475 map.set(key_int64, value_2);
3476 map.set(key_uint64, value_3);
3477 map.set(key_float, value_4);
3478 map.set(key_double, value_5);
3479 map.set(key_string, value_6);
3481 CHECK(map.at(key_null) == value_0);
3482 CHECK(map.at(key_bool) == value_1);
3483 CHECK(map.at(key_int64) == value_2);
3484 CHECK(map.at(key_uint64) == value_3);
3485 CHECK(map.at(key_float) == value_4);
3486 CHECK(map.at(key_double) == value_5);
3487 CHECK(map.at(key_string) == value_6);
3490 SUBCASE(
"Not Exists")
3492 const Object bad_key = {};
3493 const Object& bad_val = map.at(bad_key);
3494 CHECK(&bad_key == &bad_val);
3528 if(keyExists(key) ==
false)
3535 return null_map.at(0);
3537 else if(key.is<
bool>())
3539 return bool_map.at(key.as<
bool>());
3541 else if(key.is<int64_t>())
3543 return int64_map.at(key.as<int64_t>());
3545 else if(key.is<uint64_t>())
3547 return uint64_map.at(key.as<uint64_t>());
3549 else if(key.is<
float>())
3551 return float_map.at(key.as<
float>());
3553 else if(key.is<
double>())
3555 return double_map.at(key.as<
double>());
3557 else if(key.is<std::string>())
3559 return string_map.at(key.as<std::string>());
3566 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
3567 TEST_CASE(
"map/valueof")
3573 Object key_null = {};
3574 Object key_bool = {
true};
3575 Object key_int64 = {int64_t(0)};
3576 Object key_uint64 = {uint64_t(0)};
3577 Object key_float = {float(0)};
3578 Object key_double = {double(0)};
3579 Object key_string = {std::string(
"_")};
3581 Object value_0 = {uint64_t(0)};
3582 Object value_1 = {uint64_t(1)};
3583 Object value_2 = {uint64_t(2)};
3584 Object value_3 = {uint64_t(3)};
3585 Object value_4 = {uint64_t(4)};
3586 Object value_5 = {uint64_t(5)};
3587 Object value_6 = {uint64_t(6)};
3589 map.set(key_null, value_0);
3590 map.set(key_bool, value_1);
3591 map.set(key_int64, value_2);
3592 map.set(key_uint64, value_3);
3593 map.set(key_float, value_4);
3594 map.set(key_double, value_5);
3595 map.set(key_string, value_6);
3597 CHECK(map.at(key_null) == value_0);
3598 CHECK(map.at(key_bool) == value_1);
3599 CHECK(map.at(key_int64) == value_2);
3600 CHECK(map.at(key_uint64) == value_3);
3601 CHECK(map.at(key_float) == value_4);
3602 CHECK(map.at(key_double) == value_5);
3603 CHECK(map.at(key_string) == value_6);
3605 map.at(key_null) = {
false};
3606 CHECK(map.at(key_null) == Object{false});
3609 SUBCASE(
"Not Exists")
3611 Object bad_key = {};
3612 Object& bad_val = map.at(bad_key);
3613 CHECK(&bad_key == &bad_val);
3645 const size_t size = null_map.size()
3974 if(
object.isExt() ==
true)
3976 const Ext& ext =
object.asExt();
3980 if(ext.data.size() == 4
3981 || ext.data.size() == 8
3982 || ext.data.size() == 12
3994 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
3995 TEST_CASE(
"extension/timestamp/check")
3997 Object
object = {Ext{}};
3998 Ext& ext =
object.asExt();
4004 ext.data = std::vector<uint8_t>();
4007 ext.data = std::vector<uint8_t>(1, 0);
4010 ext.data = std::vector<uint8_t>(4, 0);
4013 ext.data = std::vector<uint8_t>(8, 0);
4016 ext.data = std::vector<uint8_t>(12, 0);
4022 ext.data = std::vector<uint8_t>();
4025 ext.data = std::vector<uint8_t>();
4028 ext.data = std::vector<uint8_t>(1, 0);
4031 ext.data = std::vector<uint8_t>(4, 0);
4034 ext.data = std::vector<uint8_t>(8, 0);
4037 ext.data = std::vector<uint8_t>(12, 0);
4065 if(
object.isExt() ==
false)
4070 const Ext& ext =
object.asExt();
4077 switch(ext.data.size())
4082 Convert_Byte3 = ext.data[0];
4083 Convert_Byte2 = ext.data[1];
4084 Convert_Byte1 = ext.data[2];
4085 Convert_Byte0 = ext.data[3];
4088 { .tv_sec = Convert.uint32
4098 Convert_Byte3 = ext.data[0];
4099 Convert_Byte2 = ext.data[1];
4100 Convert_Byte1 = ext.data[2];
4101 Convert_Byte0 = ext.data[3];
4102 const uint32_t nsec = Convert.uint32 >> 2;
4105 Convert_Byte4 = ext.data[3];
4106 Convert_Byte3 = ext.data[4];
4107 Convert_Byte2 = ext.data[5];
4108 Convert_Byte1 = ext.data[6];
4109 Convert_Byte0 = ext.data[7];
4110 const int64_t sec = Convert.int64 & 0x0000'0003'ffff'ffff;
4123 Convert_Byte3 = ext.data[0];
4124 Convert_Byte2 = ext.data[1];
4125 Convert_Byte1 = ext.data[2];
4126 Convert_Byte0 = ext.data[3];
4127 const uint32_t nsec = Convert.uint32;
4130 Convert_Byte7 = ext.data[ 4];
4131 Convert_Byte6 = ext.data[ 5];
4132 Convert_Byte5 = ext.data[ 6];
4133 Convert_Byte4 = ext.data[ 7];
4134 Convert_Byte3 = ext.data[ 8];
4135 Convert_Byte2 = ext.data[ 9];
4136 Convert_Byte1 = ext.data[10];
4137 Convert_Byte0 = ext.data[11];
4138 const int64_t sec = Convert.int64;
4177 Object
object = {Ext{}};
4178 Ext& ext =
object.asExt();
4180 if((ts.tv_sec >> 34) == 0)
4182 Convert.uint64 = (ts.tv_nsec << 34) | ts.tv_sec;
4183 if((Convert.uint64 & 0xffff'ffff'0000'0000) == 0)
4189 ext.data[index++] = Convert_Byte3;
4190 ext.data[index++] = Convert_Byte2;
4191 ext.data[index++] = Convert_Byte1;
4192 ext.data[index++] = Convert_Byte0;
4201 ext.data[index++] = Convert_Byte7;
4202 ext.data[index++] = Convert_Byte6;
4203 ext.data[index++] = Convert_Byte5;
4204 ext.data[index++] = Convert_Byte4;
4205 ext.data[index++] = Convert_Byte3;
4206 ext.data[index++] = Convert_Byte2;
4207 ext.data[index++] = Convert_Byte1;
4208 ext.data[index++] = Convert_Byte0;
4214 ext.data.resize(12);
4217 Convert.uint64 = ts.tv_nsec;
4218 ext.data[index++] = Convert_Byte3;
4219 ext.data[index++] = Convert_Byte2;
4220 ext.data[index++] = Convert_Byte1;
4221 ext.data[index++] = Convert_Byte0;
4223 Convert.uint64 = ts.tv_sec;
4224 ext.data[index++] = Convert_Byte7;
4225 ext.data[index++] = Convert_Byte6;
4226 ext.data[index++] = Convert_Byte5;
4227 ext.data[index++] = Convert_Byte4;
4228 ext.data[index++] = Convert_Byte3;
4229 ext.data[index++] = Convert_Byte2;
4230 ext.data[index++] = Convert_Byte1;
4231 ext.data[index++] = Convert_Byte0;
4236 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
4237 TEST_CASE(
"extension/timestamp/convert/32bit")
4241 const uint64_t sec = 0;
4242 const uint32_t nsec = 0;
4244 struct timespec time =
4251 Ext& ext =
object.asExt();
4252 CHECK(ext.type == -1);
4253 CHECK(ext.data.size() == 4);
4256 std::vector<uint8_t> data =
serialize(
object);
4257 CHECK(data.size() == 6);
4259 CHECK(data[index++] == (uint8_t)Format::Fixed_Ext4);
4260 CHECK(data[index++] == (uint8_t)-1);
4261 CHECK(data[index++] == 0);
4262 CHECK(data[index++] == 0);
4263 CHECK(data[index++] == 0);
4264 CHECK(data[index++] == 0);
4267 CHECK(
object.isExt() ==
true);
4269 Ext& ext =
object.asExt();
4270 CHECK(ext.type == -1);
4271 CHECK(ext.data.size() == 4);
4274 CHECK(time.tv_sec == sec);
4275 CHECK(time.tv_nsec == nsec);
4280 const uint64_t sec = 0x0000'0000'ffff'ffff;
4281 const uint32_t nsec = 0;
4283 struct timespec time =
4290 Ext& ext =
object.asExt();
4291 CHECK(ext.type == -1);
4292 CHECK(ext.data.size() == 4);
4295 std::vector<uint8_t> data =
serialize(
object);
4296 CHECK(data.size() == 6);
4298 CHECK(data[index++] == (uint8_t)Format::Fixed_Ext4);
4299 CHECK(data[index++] == (uint8_t)-1);
4300 CHECK(data[index++] == 0xff);
4301 CHECK(data[index++] == 0xff);
4302 CHECK(data[index++] == 0xff);
4303 CHECK(data[index++] == 0xff);
4306 CHECK(
object.isExt() ==
true);
4308 Ext& ext =
object.asExt();
4309 CHECK(ext.type == -1);
4310 CHECK(ext.data.size() == 4);
4313 CHECK(time.tv_sec == sec);
4314 CHECK(time.tv_nsec == nsec);
4319 const uint64_t sec = 0x12345678;
4320 const uint32_t nsec = 0;
4322 struct timespec time =
4329 Ext& ext =
object.asExt();
4330 CHECK(ext.type == -1);
4331 CHECK(ext.data.size() == 4);
4334 std::vector<uint8_t> data =
serialize(
object);
4335 CHECK(data.size() == 6);
4337 CHECK(data[index++] == (uint8_t)Format::Fixed_Ext4);
4338 CHECK(data[index++] == (uint8_t)-1);
4339 CHECK(data[index++] == 0x12);
4340 CHECK(data[index++] == 0x34);
4341 CHECK(data[index++] == 0x56);
4342 CHECK(data[index++] == 0x78);
4345 CHECK(
object.isExt() ==
true);
4347 Ext& ext =
object.asExt();
4348 CHECK(ext.type == -1);
4349 CHECK(ext.data.size() == 4);
4352 CHECK(time.tv_sec == sec);
4353 CHECK(time.tv_nsec == nsec);
4357 TEST_CASE(
"extension/timestamp/convert/64bit")
4361 const uint64_t sec = 0x0000'0002'0000'0000;
4362 const uint32_t nsec = 0;
4364 struct timespec time =
4371 Ext& ext =
object.asExt();
4372 CHECK(ext.type == -1);
4373 CHECK(ext.data.size() == 8);
4376 std::vector<uint8_t> data =
serialize(
object);
4377 CHECK(data.size() == 10);
4379 CHECK(data[index++] == (uint8_t)Format::Fixed_Ext8);
4380 CHECK(data[index++] == (uint8_t)-1);
4381 CHECK(data[index++] == 0x00);
4382 CHECK(data[index++] == 0x00);
4383 CHECK(data[index++] == 0x00);
4384 CHECK(data[index++] == 0x02);
4385 CHECK(data[index++] == 0x00);
4386 CHECK(data[index++] == 0x00);
4387 CHECK(data[index++] == 0x00);
4388 CHECK(data[index++] == 0x00);
4391 CHECK(
object.isExt() ==
true);
4393 Ext& ext =
object.asExt();
4394 CHECK(ext.type == -1);
4395 CHECK(ext.data.size() == 8);
4398 CHECK(time.tv_sec == sec);
4399 CHECK(time.tv_nsec == nsec);
4404 const uint64_t sec = 0x0000'0003'ffff'ffff;
4405 const uint32_t nsec = 0x3fff'ffff;
4407 struct timespec time =
4414 Ext& ext =
object.asExt();
4415 CHECK(ext.type == -1);
4416 CHECK(ext.data.size() == 8);
4419 std::vector<uint8_t> data =
serialize(
object);
4420 CHECK(data.size() == 10);
4422 CHECK(data[index++] == (uint8_t)Format::Fixed_Ext8);
4423 CHECK(data[index++] == (uint8_t)-1);
4424 CHECK(data[index++] == 0xff);
4425 CHECK(data[index++] == 0xff);
4426 CHECK(data[index++] == 0xff);
4427 CHECK(data[index++] == 0xff);
4428 CHECK(data[index++] == 0xff);
4429 CHECK(data[index++] == 0xff);
4430 CHECK(data[index++] == 0xff);
4431 CHECK(data[index++] == 0xff);
4434 CHECK(
object.isExt() ==
true);
4436 Ext& ext =
object.asExt();
4437 CHECK(ext.type == -1);
4438 CHECK(ext.data.size() == 8);
4441 CHECK(time.tv_sec == sec);
4442 CHECK(time.tv_nsec == nsec);
4447 const uint64_t sec = 0x0000'0001'2345'6789;
4448 const uint32_t nsec = 0x0fed'cba9;
4455 struct timespec time =
4462 Ext& ext =
object.asExt();
4463 CHECK(ext.type == -1);
4464 CHECK(ext.data.size() == 8);
4467 std::vector<uint8_t> data =
serialize(
object);
4468 CHECK(data.size() == 10);
4470 CHECK(data[index++] == (uint8_t)Format::Fixed_Ext8);
4471 CHECK(data[index++] == (uint8_t)-1);
4472 CHECK(data[index++] == 0x3f);
4473 CHECK(data[index++] == 0xb7);
4474 CHECK(data[index++] == 0x2e);
4475 CHECK(data[index++] == 0xa5);
4476 CHECK(data[index++] == 0x23);
4477 CHECK(data[index++] == 0x45);
4478 CHECK(data[index++] == 0x67);
4479 CHECK(data[index++] == 0x89);
4482 CHECK(
object.isExt() ==
true);
4484 Ext& ext =
object.asExt();
4485 CHECK(ext.type == -1);
4486 CHECK(ext.data.size() == 8);
4489 CHECK(time.tv_sec == sec);
4490 CHECK(time.tv_nsec == nsec);
4494 TEST_CASE(
"extension/timestamp/convert/96bit")
4498 const int64_t sec = 0x0000'0004'0000'0000;
4499 const uint64_t nsec = 0x0000'0000;
4501 struct timespec time =
4508 Ext& ext =
object.asExt();
4509 CHECK(ext.type == -1);
4510 CHECK(ext.data.size() == 12);
4513 std::vector<uint8_t> data =
serialize(
object);
4514 CHECK(data.size() == 15);
4516 CHECK(data[index++] == (uint8_t)Format::Ext8);
4517 CHECK(data[index++] == 12);
4518 CHECK(data[index++] == (uint8_t)-1);
4520 CHECK(data[index++] == 0x00);
4521 CHECK(data[index++] == 0x00);
4522 CHECK(data[index++] == 0x00);
4523 CHECK(data[index++] == 0x00);
4525 CHECK(data[index++] == 0x00);
4526 CHECK(data[index++] == 0x00);
4527 CHECK(data[index++] == 0x00);
4528 CHECK(data[index++] == 0x04);
4529 CHECK(data[index++] == 0x00);
4530 CHECK(data[index++] == 0x00);
4531 CHECK(data[index++] == 0x00);
4532 CHECK(data[index++] == 0x00);
4535 CHECK(
object.isExt() ==
true);
4537 Ext& ext =
object.asExt();
4538 CHECK(ext.type == -1);
4539 CHECK(ext.data.size() == 12);
4542 CHECK(time.tv_sec == sec);
4543 CHECK(time.tv_nsec == nsec);
4548 const int64_t sec = 0x7fff'ffff'ffff'ffff;
4549 const uint64_t nsec = 0xffff'ffff;
4551 struct timespec time =
4558 Ext& ext =
object.asExt();
4559 CHECK(ext.type == -1);
4560 CHECK(ext.data.size() == 12);
4563 std::vector<uint8_t> data =
serialize(
object);
4564 CHECK(data.size() == 15);
4566 CHECK(data[index++] == (uint8_t)Format::Ext8);
4567 CHECK(data[index++] == 12);
4568 CHECK(data[index++] == (uint8_t)-1);
4570 CHECK(data[index++] == 0xff);
4571 CHECK(data[index++] == 0xff);
4572 CHECK(data[index++] == 0xff);
4573 CHECK(data[index++] == 0xff);
4575 CHECK(data[index++] == 0x7f);
4576 CHECK(data[index++] == 0xff);
4577 CHECK(data[index++] == 0xff);
4578 CHECK(data[index++] == 0xff);
4579 CHECK(data[index++] == 0xff);
4580 CHECK(data[index++] == 0xff);
4581 CHECK(data[index++] == 0xff);
4582 CHECK(data[index++] == 0xff);
4585 CHECK(
object.isExt() ==
true);
4587 Ext& ext =
object.asExt();
4588 CHECK(ext.type == -1);
4589 CHECK(ext.data.size() == 12);
4592 CHECK(time.tv_sec == sec);
4593 CHECK(time.tv_nsec == nsec);
4598 const int64_t sec = 0x1234'5678'9abc'def0;
4599 const uint64_t nsec = 0xfedc'ba98;
4601 struct timespec time =
4608 Ext& ext =
object.asExt();
4609 CHECK(ext.type == -1);
4610 CHECK(ext.data.size() == 12);
4613 std::vector<uint8_t> data =
serialize(
object);
4614 CHECK(data.size() == 15);
4616 CHECK(data[index++] == (uint8_t)Format::Ext8);
4617 CHECK(data[index++] == 12);
4618 CHECK(data[index++] == (uint8_t)-1);
4620 CHECK(data[index++] == 0xfe);
4621 CHECK(data[index++] == 0xdc);
4622 CHECK(data[index++] == 0xba);
4623 CHECK(data[index++] == 0x98);
4625 CHECK(data[index++] == 0x12);
4626 CHECK(data[index++] == 0x34);
4627 CHECK(data[index++] == 0x56);
4628 CHECK(data[index++] == 0x78);
4629 CHECK(data[index++] == 0x9a);
4630 CHECK(data[index++] == 0xbc);
4631 CHECK(data[index++] == 0xde);
4632 CHECK(data[index++] == 0xf0);
4635 CHECK(
object.isExt() ==
true);
4637 Ext& ext =
object.asExt();
4638 CHECK(ext.type == -1);
4639 CHECK(ext.data.size() == 12);
4642 CHECK(time.tv_sec == sec);
4643 CHECK(time.tv_nsec == nsec);
4682 Object
deserialize(
const std::vector<uint8_t>& data
4686 std::error_code error = {};
4723 Object
deserialize(
const std::vector<uint8_t>& data
4724 , std::error_code& error
4764 Object
deserialize(
const std::vector<uint8_t>& data
4768 std::error_code error = {};
4809 Object
deserialize(
const std::vector<uint8_t>& data
4811 , std::error_code& error
4816 if(data.size() == 0)
4818 error = Error_No_Data;
4822 if(index >= data.size())
4824 error = Error_Invalid_Index;
4828 const uint8_t format_byte = data[index];
4829 const Format format_type = (Format)format_byte;
4831 if((index + formatSize(format_type)) > data.size())
4833 error = Error_Incomplete;
4837 if(format_type == Format::Never_Used)
4839 error = Error_Invalid_Format_Type;
4851 return Object{
false};
4854 return Object{
true};
4857 Convert.int64 = (int8_t)data[index++];
4858 return Object{Convert.int64};
4862 Convert_Byte1 = data[index++];
4863 Convert_Byte0 = data[index++];
4864 return Object{int64_t(Convert.int16)};
4868 Convert_Byte3 = data[index++];
4869 Convert_Byte2 = data[index++];
4870 Convert_Byte1 = data[index++];
4871 Convert_Byte0 = data[index++];
4872 return Object{int64_t(Convert.int32)};
4875 Convert_Byte7 = data[index++];
4876 Convert_Byte6 = data[index++];
4877 Convert_Byte5 = data[index++];
4878 Convert_Byte4 = data[index++];
4879 Convert_Byte3 = data[index++];
4880 Convert_Byte2 = data[index++];
4881 Convert_Byte1 = data[index++];
4882 Convert_Byte0 = data[index++];
4883 return Object{Convert.int64};
4886 Convert.uint64 = data[index++];
4887 return Object{Convert.uint64};
4889 case Format::Uint16:
4891 Convert_Byte1 = data[index++];
4892 Convert_Byte0 = data[index++];
4893 return Object{Convert.uint64};
4895 case Format::Uint32:
4897 Convert_Byte3 = data[index++];
4898 Convert_Byte2 = data[index++];
4899 Convert_Byte1 = data[index++];
4900 Convert_Byte0 = data[index++];
4901 return Object{Convert.uint64};
4903 case Format::Uint64:
4904 Convert_Byte7 = data[index++];
4905 Convert_Byte6 = data[index++];
4906 Convert_Byte5 = data[index++];
4907 Convert_Byte4 = data[index++];
4908 Convert_Byte3 = data[index++];
4909 Convert_Byte2 = data[index++];
4910 Convert_Byte1 = data[index++];
4911 Convert_Byte0 = data[index++];
4912 return Object{Convert.uint64};
4914 case Format::Float32:
4916 Convert_Byte3 = data[index++];
4917 Convert_Byte2 = data[index++];
4918 Convert_Byte1 = data[index++];
4919 Convert_Byte0 = data[index++];
4920 return Object{Convert.float32};
4922 case Format::Float64:
4923 Convert_Byte7 = data[index++];
4924 Convert_Byte6 = data[index++];
4925 Convert_Byte5 = data[index++];
4926 Convert_Byte4 = data[index++];
4927 Convert_Byte3 = data[index++];
4928 Convert_Byte2 = data[index++];
4929 Convert_Byte1 = data[index++];
4930 Convert_Byte0 = data[index++];
4931 return Object{Convert.float64};
4935 const size_t length = data[index++];
4937 if((index + length) > data.size())
4939 error = Error_Incomplete;
4943 std::string_view str((
char*)&data[index], length);
4947 return Object{std::string(str)};
4953 Convert_Byte1 = data[index++];
4954 Convert_Byte0 = data[index++];
4955 const size_t length = Convert.uint64;
4957 if((index + length) > data.size())
4959 error = Error_Incomplete;
4963 const std::string_view str((
char*)&data[index], length);
4967 return Object{std::string(str)};
4973 Convert_Byte3 = data[index++];
4974 Convert_Byte2 = data[index++];
4975 Convert_Byte1 = data[index++];
4976 Convert_Byte0 = data[index++];
4977 const size_t length = Convert.uint64;
4979 if((index + length) > data.size())
4981 error = Error_Incomplete;
4985 const std::string_view str((
char*)&data[index], length);
4989 return Object{std::string(str)};
4994 const size_t length = data[index++];
4996 if((index + length) > data.size())
4998 error = Error_Incomplete;
5002 std::vector<uint8_t> vector(length);
5003 memcpy((
void*)vector.data(), (
void*)&data[index], length);
5007 return Object{std::move(vector)};
5013 Convert_Byte1 = data[index++];
5014 Convert_Byte0 = data[index++];
5015 const size_t length = Convert.uint64;
5017 if((index + length) > data.size())
5019 error = Error_Incomplete;
5023 std::vector<uint8_t> vector(length);
5024 memcpy((
void*)vector.data(), (
void*)&data[index], length);
5028 return Object{std::move(vector)};
5034 Convert_Byte3 = data[index++];
5035 Convert_Byte2 = data[index++];
5036 Convert_Byte1 = data[index++];
5037 Convert_Byte0 = data[index++];
5038 const size_t length = Convert.uint64;
5040 if((index + length) > data.size())
5042 error = Error_Incomplete;
5046 std::vector<uint8_t> vector(length);
5047 memcpy((
void*)vector.data(), (
void*)&data[index], length);
5051 return Object{std::move(vector)};
5054 case Format::Array16:
5056 Object
object = {Array{}};
5059 Convert_Byte1 = data[index++];
5060 Convert_Byte0 = data[index++];
5061 const size_t count = Convert.uint64;
5063 for(
size_t i = 0; i < count; i++)
5065 object.asArray().append(
deserialize(data, index, error));
5075 case Format::Array32:
5077 Object
object = {Array{}};
5080 Convert_Byte3 = data[index++];
5081 Convert_Byte2 = data[index++];
5082 Convert_Byte1 = data[index++];
5083 Convert_Byte0 = data[index++];
5084 const size_t count = Convert.uint64;
5086 for(
size_t i = 0; i < count; i++)
5088 object.asArray().append(
deserialize(data, index, error));
5100 Object
object = {Map{}};
5103 Convert_Byte1 = data[index++];
5104 Convert_Byte0 = data[index++];
5105 const size_t count = Convert.uint64;
5107 for(
size_t i = 0; i < count; i++)
5121 object.asMap().set(std::move(key), std::move(val));
5129 Object
object = {Map{}};
5132 Convert_Byte3 = data[index++];
5133 Convert_Byte2 = data[index++];
5134 Convert_Byte1 = data[index++];
5135 Convert_Byte0 = data[index++];
5136 const size_t count = Convert.uint64;
5138 for(
size_t i = 0; i < count; i++)
5152 object.asMap().set(std::move(key), std::move(val));
5158 case Format::Fixed_Ext1:
5160 Object
object = {Ext{}};
5161 Ext& ext =
object.asExt();
5164 Convert.uint8 = data[index++];
5165 ext.type = Convert.int8;
5167 ext.data.push_back(data[index++]);
5172 case Format::Fixed_Ext2:
5174 Object
object = {Ext{}};
5175 Ext& ext =
object.asExt();
5178 Convert.uint8 = data[index++];
5179 ext.type = Convert.int8;
5181 ext.data.push_back(data[index++]);
5182 ext.data.push_back(data[index++]);
5187 case Format::Fixed_Ext4:
5189 Object
object = {Ext{}};
5190 Ext& ext =
object.asExt();
5193 Convert.uint8 = data[index++];
5194 ext.type = Convert.int8;
5196 ext.data.push_back(data[index++]);
5197 ext.data.push_back(data[index++]);
5198 ext.data.push_back(data[index++]);
5199 ext.data.push_back(data[index++]);
5204 case Format::Fixed_Ext8:
5206 Object
object = {Ext{}};
5207 Ext& ext =
object.asExt();
5210 Convert.uint8 = data[index++];
5211 ext.type = Convert.int8;
5213 const size_t data_size = 8;
5214 ext.data.reserve(data_size);
5216 for(
size_t i = 0; i < data_size; i++)
5218 ext.data.push_back(data[index++]);
5224 case Format::Fixed_Ext16:
5226 Object
object = {Ext{}};
5227 Ext& ext =
object.asExt();
5230 Convert.uint8 = data[index++];
5231 ext.type = Convert.int8;
5233 const size_t data_size = 16;
5234 ext.data.reserve(data_size);
5236 for(
size_t i = 0; i < data_size; i++)
5238 ext.data.push_back(data[index++]);
5246 Object
object = {Ext{}};
5247 Ext& ext =
object.asExt();
5249 const size_t data_size = data[index++];
5251 if((index + data_size) > data.size())
5253 error = Error_Incomplete;
5258 Convert.uint8 = data[index++];
5259 ext.type = Convert.int8;
5263 ext.data.resize(data_size);
5264 memcpy((
void*)ext.data.data(), (
void*)&data[index], data_size);
5273 Object
object = {Ext{}};
5274 Ext& ext =
object.asExt();
5277 Convert_Byte1 = data[index++];
5278 Convert_Byte0 = data[index++];
5279 const size_t data_size = Convert.uint16;
5281 if((index + data_size) > data.size())
5283 error = Error_Incomplete;
5288 Convert.uint8 = data[index++];
5289 ext.type = Convert.int8;
5291 ext.data.resize(data_size);
5292 memcpy((
void*)ext.data.data(), (
void*)&data[index], data_size);
5294 index += data_size + 1;
5301 Object
object = {Ext{}};
5302 Ext& ext =
object.asExt();
5305 Convert_Byte3 = data[index++];
5306 Convert_Byte2 = data[index++];
5307 Convert_Byte1 = data[index++];
5308 Convert_Byte0 = data[index++];
5309 const size_t data_size = Convert.uint32;
5311 if((index + data_size) > data.size())
5313 error = Error_Incomplete;
5318 Convert.uint8 = data[index++];
5319 ext.type = Convert.int8;
5321 ext.data.resize(data_size);
5322 memcpy((
void*)ext.data.data(), (
void*)&data[index], data_size);
5324 index += data_size + 1;
5329 case Format::Fixed_Int_Pos:
5330 case Format::Fixed_Int_Neg:
5331 case Format::Fixed_Array:
5332 case Format::Fixed_Str:
5333 case Format::Fixed_Map:
5334 case Format::Never_Used:
5339 if((format_byte & (uint8_t)Fixed_Int_Pos_Mask) == (uint8_t)Format::Fixed_Int_Pos)
5341 const int64_t value = format_byte & (uint8_t)Fixed_Int_Pos_Value;
5343 return Object{value};
5346 if((format_byte & (uint8_t)Fixed_Int_Neg_Mask) == (uint8_t)Format::Fixed_Int_Neg)
5348 const int64_t value = (int8_t)(format_byte & Fixed_Int_Neg_Value) - 32;
5350 return Object{value};
5353 if((format_byte & (uint8_t)Fixed_Str_Mask) == (uint8_t)Format::Fixed_Str)
5355 const size_t length = format_byte & Fixed_Str_Value;
5359 return Object{std::string(
"")};
5363 if((index + length) > data.size())
5365 error = Error_Incomplete;
5369 std::string_view str((
char*)&data[index], length);
5373 return Object{std::string(str)};
5377 if((format_byte & (uint8_t)Fixed_Array_Mask) == (uint8_t)Format::Fixed_Array)
5379 Object
object = {Array{}};
5381 const size_t count = format_byte & (uint8_t)Fixed_Array_Value;
5383 for(
size_t i = 0; i < count; i++)
5385 object.asArray().append(
deserialize(data, index, error));
5396 if((format_byte & (uint8_t)Fixed_Map_Mask) == (uint8_t)Format::Fixed_Map)
5398 Object
object = {Map{}};
5400 const size_t count = format_byte & (uint8_t)Fixed_Map_Value;
5402 for(
size_t i = 0; i < count; i++)
5416 object.asMap().set(std::move(key), std::move(val));
5425 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
5426 TEST_CASE(
"deserialize/error")
5428 std::vector<uint8_t> data = {};
5429 std::error_code error = {};
5436 CHECK(error == Error_No_Data);
5438 CHECK(
object.isNull() ==
true);
5441 SUBCASE(
"invalid index")
5447 CHECK(error == Error_Invalid_Index);
5449 CHECK(
object.isNull() ==
true);
5452 SUBCASE(
"Never_Used")
5454 data.push_back((uint8_t)Format::Never_Used);
5457 CHECK(error == Error_Invalid_Format_Type);
5459 CHECK(
object.isNull() ==
true);
5472 object = Object{(uint64_t)std::numeric_limits<uint8_t>::max()};
5473 object = Object{uint64_t(0xff)};
5475 data.resize(data.size() - 1);
5478 CHECK(data[0] == (uint8_t)Format::Uint8);
5479 CHECK(error == Error_Incomplete);
5480 CHECK(index == index);
5481 CHECK(
object.isNull() ==
true);
5486 object = Object{(uint64_t)std::numeric_limits<uint16_t>::max()};
5488 data.resize(data.size() - 1);
5491 CHECK(data[0] == (uint8_t)Format::Uint16);
5492 CHECK(error == Error_Incomplete);
5493 CHECK(index == index);
5494 CHECK(
object.isNull() ==
true);
5499 object = Object{(uint64_t)std::numeric_limits<uint32_t>::max()};
5501 data.resize(data.size() - 1);
5504 CHECK(data[0] == (uint8_t)Format::Uint32);
5505 CHECK(error == Error_Incomplete);
5506 CHECK(index == index);
5507 CHECK(
object.isNull() ==
true);
5512 object = Object{(uint64_t)std::numeric_limits<uint64_t>::max()};
5514 data.resize(data.size() - 1);
5517 CHECK(data[0] == (uint8_t)Format::Uint64);
5518 CHECK(error == Error_Incomplete);
5519 CHECK(index == index);
5520 CHECK(
object.isNull() ==
true);
5525 object = Object{int64_t(std::numeric_limits<int8_t>::min())};
5527 data.resize(data.size() - 1);
5530 CHECK(data[0] == (uint8_t)Format::Int8);
5531 CHECK(error == Error_Incomplete);
5532 CHECK(index == index);
5533 CHECK(
object.isNull() ==
true);
5538 object = Object{int64_t(std::numeric_limits<int16_t>::min())};
5540 data.resize(data.size() - 1);
5543 CHECK(data[0] == (uint8_t)Format::Int16);
5544 CHECK(error == Error_Incomplete);
5545 CHECK(index == index);
5546 CHECK(
object.isNull() ==
true);
5551 object = Object{int64_t(std::numeric_limits<int32_t>::min())};
5553 data.resize(data.size() - 1);
5556 CHECK(data[0] == (uint8_t)Format::Int32);
5557 CHECK(error == Error_Incomplete);
5558 CHECK(index == index);
5559 CHECK(
object.isNull() ==
true);
5564 object = Object{std::numeric_limits<int64_t>::min()};
5566 data.resize(data.size() - 1);
5569 CHECK(data[0] == (uint8_t)Format::Int64);
5570 CHECK(error == Error_Incomplete);
5571 CHECK(index == index);
5572 CHECK(
object.isNull() ==
true);
5577 object = Object{std::numeric_limits<float>::min()};
5579 data.resize(data.size() - 1);
5582 CHECK(data[0] == (uint8_t)Format::Float32);
5583 CHECK(error == Error_Incomplete);
5584 CHECK(index == index);
5585 CHECK(
object.isNull() ==
true);
5590 object = Object{std::numeric_limits<double>::min()};
5592 data.resize(data.size() - 1);
5595 CHECK(data[0] == (uint8_t)Format::Float64);
5596 CHECK(error == Error_Incomplete);
5597 CHECK(index == index);
5598 CHECK(
object.isNull() ==
true);
5601 SUBCASE(
"Fixed_Str")
5603 object = Object{std::string(16,
'X')};
5605 data.resize(data.size() - 1);
5608 CHECK((data[0] & Fixed_Str_Mask) == (uint8_t)Format::Fixed_Str);
5609 CHECK(error == Error_Incomplete);
5610 CHECK(index == index);
5611 CHECK(
object.isNull() ==
true);
5616 object = Object{std::string(32,
'X')};
5618 data.resize(data.size() - 1);
5621 CHECK(data[0] == (uint8_t)Format::Str8);
5622 CHECK(error == Error_Incomplete);
5623 CHECK(index == index);
5624 CHECK(
object.isNull() ==
true);
5629 object = Object{std::string(std::numeric_limits<uint8_t>::max() + 1,
'X')};
5631 data.resize(data.size() - 1);
5634 CHECK(data[0] == (uint8_t)Format::Str16);
5635 CHECK(error == Error_Incomplete);
5636 CHECK(index == index);
5637 CHECK(
object.isNull() ==
true);
5642 object = Object{std::string(std::numeric_limits<uint16_t>::max() + 1,
'X')};
5644 data.resize(data.size() - 1);
5647 CHECK(data[0] == (uint8_t)Format::Str32);
5648 CHECK(error == Error_Incomplete);
5649 CHECK(index == index);
5650 CHECK(
object.isNull() ==
true);
5655 object = Object{std::vector<uint8_t>(0,
'X')};
5657 data.resize(data.size() - 1);
5660 CHECK(data[0] == (uint8_t)Format::Bin8);
5661 CHECK(error == Error_Incomplete);
5662 CHECK(index == index);
5663 CHECK(
object.isNull() ==
true);
5668 object = Object{std::vector<uint8_t>(std::numeric_limits<uint8_t>::max() + 1,
'X')};
5670 data.resize(data.size() - 1);
5673 CHECK(data[0] == (uint8_t)Format::Bin16);
5674 CHECK(error == Error_Incomplete);
5675 CHECK(index == index);
5676 CHECK(
object.isNull() ==
true);
5681 object = Object{std::vector<uint8_t>(std::numeric_limits<uint16_t>::max() + 1,
'X')};
5683 data.resize(data.size() - 1);
5686 CHECK(data[0] == (uint8_t)Format::Bin32);
5687 CHECK(error == Error_Incomplete);
5688 CHECK(index == index);
5689 CHECK(
object.isNull() ==
true);
5692 SUBCASE(
"Fixed_Array")
5696 array.object_vector = std::vector<Object>(8, Object{});
5698 data.resize(data.size() - 1);
5701 CHECK((data[0] & Fixed_Array_Mask) == (uint8_t)Format::Fixed_Array);
5702 CHECK(error == Error_Invalid_Index);
5703 CHECK(index == index);
5704 CHECK(
object.isNull() ==
true);
5708 array.object_vector = std::vector<Object>(1, Object{});
5709 array.object(0) = Object{std::string(
"ABC")};
5711 data.resize(data.size() - 1);
5714 CHECK((data[0] & Fixed_Array_Mask) == (uint8_t)Format::Fixed_Array);
5715 CHECK(error == Error_Incomplete);
5716 CHECK(index == index);
5717 CHECK(
object.isNull() ==
true);
5723 array.object_vector = std::vector<Object>(16, Object{});
5725 data.resize(data.size() - 1);
5728 CHECK(data[0] == (uint8_t)Format::Array16);
5729 CHECK(error == Error_Incomplete);
5730 CHECK(index == index);
5731 CHECK(
object.isNull() ==
true);
5737 array.object_vector = std::vector<Object>(std::numeric_limits<uint16_t>::max() + 1, Object{});
5739 data.resize(data.size() - 1);
5742 CHECK(data[0] == (uint8_t)Format::Array32);
5743 CHECK(error == Error_Incomplete);
5744 CHECK(index == index);
5745 CHECK(
object.isNull() ==
true);
5748 SUBCASE(
"Fixed_Map")
5752 map.set(Object{}, Object{});
5754 data.resize(data.size() - 1);
5757 CHECK((data[0] & Fixed_Map_Mask) == (uint8_t)Format::Fixed_Map);
5758 CHECK(error == Error_Invalid_Index);
5759 CHECK(index == index);
5760 CHECK(
object.isNull() ==
true);
5764 map.set(Object{int64_t(0)}, Object{});
5765 map.set(Object{int64_t(1)}, Object{std::string(
"Hello, World")});
5767 data.resize(data.size() - 1);
5770 CHECK((data[0] & Fixed_Map_Mask) == (uint8_t)Format::Fixed_Map);
5771 CHECK(error == Error_Incomplete);
5772 CHECK(index == index);
5773 CHECK(
object.isNull() ==
true);
5779 for(
size_t i = 0; i < 16; i++)
5781 map.set(Object{int64_t(i)}, Object{});
5784 data.resize(data.size() - 1);
5787 CHECK(data[0] == (uint8_t)Format::Map16);
5788 CHECK(data[1] == (uint8_t)Format::Fixed_Int_Pos);
5789 CHECK(error == Error_Incomplete);
5790 CHECK(index == index);
5791 CHECK(
object.isNull() ==
true);
5797 for(
size_t i = 0; i < (std::numeric_limits<uint16_t>::max() + 1) ; i++)
5799 map.set(Object{int64_t(i)}, Object{});
5802 data.resize(data.size() - 1);
5805 CHECK(data[0] == (uint8_t)Format::Map32);
5806 CHECK(data[1] == (uint8_t)Format::Fixed_Int_Pos);
5807 CHECK(error == Error_Incomplete);
5808 CHECK(index == index);
5809 CHECK(
object.isNull() ==
true);
5812 SUBCASE(
"Fixed_Ext1")
5815 ext.data = std::vector<uint8_t>(1,
'X');
5817 data.resize(data.size() - 1);
5820 CHECK(data[0] == (uint8_t)Format::Fixed_Ext1);
5821 CHECK(error == Error_Incomplete);
5822 CHECK(index == index);
5823 CHECK(
object.isNull() ==
true);
5826 SUBCASE(
"Fixed_Ext2")
5829 ext.data = std::vector<uint8_t>(2,
'X');
5831 data.resize(data.size() - 1);
5834 CHECK(data[0] == (uint8_t)Format::Fixed_Ext2);
5835 CHECK(error == Error_Incomplete);
5836 CHECK(index == index);
5837 CHECK(
object.isNull() ==
true);
5840 SUBCASE(
"Fixed_Ext4")
5843 ext.data = std::vector<uint8_t>(4,
'X');
5845 data.resize(data.size() - 1);
5848 CHECK(data[0] == (uint8_t)Format::Fixed_Ext4);
5849 CHECK(error == Error_Incomplete);
5850 CHECK(index == index);
5851 CHECK(
object.isNull() ==
true);
5854 SUBCASE(
"Fixed_Ext8")
5857 ext.data = std::vector<uint8_t>(8,
'X');
5859 data.resize(data.size() - 1);
5862 CHECK(data[0] == (uint8_t)Format::Fixed_Ext8);
5863 CHECK(error == Error_Incomplete);
5864 CHECK(index == index);
5865 CHECK(
object.isNull() ==
true);
5868 SUBCASE(
"Fixed_Ext16")
5871 ext.data = std::vector<uint8_t>(16,
'X');
5873 data.resize(data.size() - 1);
5876 CHECK(data[0] == (uint8_t)Format::Fixed_Ext16);
5877 CHECK(error == Error_Incomplete);
5878 CHECK(index == index);
5879 CHECK(
object.isNull() ==
true);
5885 ext.data = std::vector<uint8_t>(0,
'X');
5887 data.resize(data.size() - 1);
5890 CHECK(data[0] == (uint8_t)Format::Ext8);
5891 CHECK(error == Error_Incomplete);
5892 CHECK(index == index);
5893 CHECK(
object.isNull() ==
true);
5899 ext.data = std::vector<uint8_t>(std::numeric_limits<uint8_t>::max() + 1,
'X');
5901 data.resize(data.size() - 1);
5904 CHECK(data[0] == (uint8_t)Format::Ext16);
5905 CHECK(error == Error_Incomplete);
5906 CHECK(index == index);
5907 CHECK(
object.isNull() ==
true);
5913 ext.data = std::vector<uint8_t>(std::numeric_limits<uint16_t>::max() + 1,
'X');
5915 data.resize(data.size() - 1);
5918 CHECK(data[0] == (uint8_t)Format::Ext32);
5919 CHECK(error == Error_Incomplete);
5920 CHECK(index == index);
5921 CHECK(
object.isNull() ==
true);
5947 std::vector<uint8_t>
serialize(
const Array& array
5950 std::error_code error;
5983 std::vector<uint8_t>
serialize(
const Array& array
5984 , std::error_code& error
5987 std::vector<uint8_t> vector;
5989 error = serialize_(array, vector);
6010 std::vector<uint8_t>
serialize(
const Ext& ext
6013 std::error_code error;
6035 std::vector<uint8_t>
serialize(
const Ext& ext
6036 , std::error_code& error
6039 std::vector<uint8_t> vector;
6041 error = serialize_(ext, vector);
6046 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
6047 TEST_CASE(
"serialize/ext (fixed_ext1)")
6050 std::vector<uint8_t> data;
6051 const size_t data_len = 1;
6052 const int8_t type = 42;
6055 ext.data = std::vector<uint8_t>(data_len,
'_');
6058 CHECK(data.size() == 3);
6060 CHECK(data[index++] == (uint8_t)Format::Fixed_Ext1);
6061 CHECK(data[index++] == type);
6062 CHECK(data[index++] ==
'_');
6065 CHECK(
object.isExt() ==
true);
6067 CHECK(
object.asExt().type == type);
6068 CHECK(
object.asExt().data.size() == 1);
6069 CHECK(
object.asExt().data[0] ==
'_');
6072 TEST_CASE(
"serialize/ext (fixed_ext2)")
6075 std::vector<uint8_t> data;
6076 const size_t data_len = 2;
6077 const int8_t type = 42;
6080 ext.data = std::vector<uint8_t>(data_len,
'_');
6083 CHECK(data.size() == 4);
6085 CHECK(data[index++] == (uint8_t)Format::Fixed_Ext2);
6086 CHECK(data[index++] == type);
6089 CHECK(
object.isExt() ==
true);
6091 CHECK(
object.asExt().type == type);
6092 CHECK(
object.asExt().data.size() == data_len);
6094 for(
size_t i = 0; i < data_len; i++)
6096 CHECK(
object.asExt().data[i] ==
'_');
6100 TEST_CASE(
"serialize/ext (fixed_ext4)")
6103 std::vector<uint8_t> data;
6104 const size_t data_len = 4;
6105 const int8_t type = 42;
6108 ext.data = std::vector<uint8_t>(data_len,
'_');
6111 CHECK(data.size() == 6);
6113 CHECK(data[index++] == (uint8_t)Format::Fixed_Ext4);
6114 CHECK(data[index++] == type);
6117 CHECK(
object.isExt() ==
true);
6119 CHECK(
object.asExt().type == type);
6120 CHECK(
object.asExt().data.size() == data_len);
6122 for(
size_t i = 0; i < data_len; i++)
6124 CHECK(
object.asExt().data[i] ==
'_');
6128 TEST_CASE(
"serialize/ext (fixed_ext8)")
6131 std::vector<uint8_t> data;
6132 const size_t data_len = 8;
6133 const int8_t type = 42;
6136 ext.data = std::vector<uint8_t>(data_len,
'_');
6139 CHECK(data.size() == 10);
6141 CHECK(data[index++] == (uint8_t)Format::Fixed_Ext8);
6142 CHECK(data[index++] == type);
6145 CHECK(
object.isExt() ==
true);
6147 CHECK(
object.asExt().type == type);
6148 CHECK(
object.asExt().data.size() == data_len);
6150 for(
size_t i = 0; i < data_len; i++)
6152 CHECK(
object.asExt().data[i] ==
'_');
6156 TEST_CASE(
"serialize/ext (fixed_ext16)")
6159 std::vector<uint8_t> data;
6160 const size_t data_len = 16;
6161 const int8_t type = 42;
6164 ext.data = std::vector<uint8_t>(data_len,
'_');
6167 CHECK(data.size() == 18);
6169 CHECK(data[index++] == (uint8_t)Format::Fixed_Ext16);
6170 CHECK(data[index++] == type);
6173 CHECK(
object.isExt() ==
true);
6175 CHECK(
object.asExt().type == type);
6176 CHECK(
object.asExt().data.size() == data_len);
6178 for(
size_t i = 0; i < data_len; i++)
6180 CHECK(
object.asExt().data[i] ==
'_');
6184 TEST_CASE(
"serialize/ext (ext8)")
6186 std::vector<uint8_t> data;
6187 const int8_t type = 42;
6194 const size_t data_len = 0;
6195 ext.data = std::vector<uint8_t>(data_len,
'_');
6198 CHECK(data.size() == 3);
6200 CHECK(data[index++] == (uint8_t)Format::Ext8);
6201 CHECK(data[index++] == data_len);
6202 CHECK(data[index++] == type);
6205 CHECK(
object.isExt() ==
true);
6207 CHECK(
object.asExt().type == type);
6208 CHECK(
object.asExt().data.size() == data_len);
6210 for(
size_t i = 0; i < data_len; i++)
6212 CHECK(
object.asExt().data[i] ==
'_');
6218 const size_t data_len = 5;
6219 ext.data = std::vector<uint8_t>(data_len,
'_');
6222 CHECK(data.size() == 8);
6224 CHECK(data[index++] == (uint8_t)Format::Ext8);
6225 CHECK(data[index++] == data_len);
6226 CHECK(data[index++] == type);
6229 CHECK(
object.isExt() ==
true);
6231 CHECK(
object.asExt().type == type);
6232 CHECK(
object.asExt().data.size() == data_len);
6234 for(
size_t i = 0; i < data_len; i++)
6236 CHECK(
object.asExt().data[i] ==
'_');
6240 SUBCASE(
"length=max")
6242 const size_t data_len = std::numeric_limits<uint8_t>::max();
6243 ext.data = std::vector<uint8_t>(data_len,
'_');
6246 CHECK(data.size() == 258);
6248 CHECK(data[index++] == (uint8_t)Format::Ext8);
6249 CHECK(data[index++] == data_len);
6250 CHECK(data[index++] == type);
6253 CHECK(
object.isExt() ==
true);
6255 CHECK(
object.asExt().type == type);
6256 CHECK(
object.asExt().data.size() == data_len);
6258 for(
size_t i = 0; i < data_len; i++)
6260 CHECK(
object.asExt().data[i] ==
'_');
6265 TEST_CASE(
"serialize/ext (ext16)")
6267 std::vector<uint8_t> data;
6268 const int8_t type = 42;
6273 SUBCASE(
"length=min")
6275 const size_t data_len = std::numeric_limits<uint8_t>::max() + (size_t)1;
6276 ext.data = std::vector<uint8_t>(data_len,
'_');
6279 CHECK(data.size() == (data_len + 4));
6281 CHECK(data[index++] == (uint8_t)Format::Ext16);
6283 Convert_Byte1 = data[index++];
6284 Convert_Byte0 = data[index++];
6285 CHECK(Convert.uint16 == data_len);
6286 CHECK(data[index++] == type);
6289 CHECK(
object.isExt() ==
true);
6291 CHECK(
object.asExt().type == type);
6292 CHECK(
object.asExt().data.size() == data_len);
6294 for(
size_t i = 0; i < data_len; i++)
6296 CHECK(
object.asExt().data[i] ==
'_');
6300 SUBCASE(
"length=max")
6302 const size_t data_len = std::numeric_limits<uint16_t>::max();
6303 ext.data = std::vector<uint8_t>(data_len,
'_');
6306 CHECK(data.size() == (data_len + 4));
6308 CHECK(data[index++] == (uint8_t)Format::Ext16);
6310 Convert_Byte1 = data[index++];
6311 Convert_Byte0 = data[index++];
6312 CHECK(Convert.uint16 == data_len);
6313 CHECK(data[index++] == type);
6316 CHECK(
object.isExt() ==
true);
6318 CHECK(
object.asExt().type == type);
6319 CHECK(
object.asExt().data.size() == data_len);
6321 for(
size_t i = 0; i < data_len; i++)
6323 CHECK(
object.asExt().data[i] ==
'_');
6328 TEST_CASE(
"serialize/ext (ext32)")
6330 std::vector<uint8_t> data;
6331 const int8_t type = 42;
6336 SUBCASE(
"length=min")
6338 const size_t data_len = std::numeric_limits<uint16_t>::max() + (size_t)1;
6339 ext.data = std::vector<uint8_t>(data_len,
'_');
6342 CHECK(data.size() == (data_len + 6));
6344 CHECK(data[index++] == (uint8_t)Format::Ext32);
6346 Convert_Byte3 = data[index++];
6347 Convert_Byte2 = data[index++];
6348 Convert_Byte1 = data[index++];
6349 Convert_Byte0 = data[index++];
6350 CHECK(Convert.uint32 == data_len);
6351 CHECK(data[index++] == type);
6354 CHECK(
object.isExt() ==
true);
6356 CHECK(
object.asExt().type == type);
6357 CHECK(
object.asExt().data.size() == data_len);
6359 for(
size_t i = 0; i < data_len; i++)
6361 CHECK(
object.asExt().data[i] ==
'_');
6366 SUBCASE(
"length=max")
6368 const size_t data_len = std::numeric_limits<uint32_t>::max();
6369 ext.data = std::vector<uint8_t>(data_len,
'_');
6372 CHECK(data.size() == (data_len + 6));
6374 CHECK(data[index++] == (uint8_t)Format::Ext32);
6376 Convert_Byte3 = data[index++];
6377 Convert_Byte2 = data[index++];
6378 Convert_Byte1 = data[index++];
6379 Convert_Byte0 = data[index++];
6380 CHECK(Convert.uint32 == data_len);
6381 CHECK(data[index++] == type);
6384 CHECK(
object.isExt() ==
true);
6386 CHECK(
object.asExt().type == type);
6387 CHECK(
object.asExt().data.size() == data_len);
6389 for(
size_t i = 0; i < data_len; i++)
6391 CHECK(
object.asExt().data[i] ==
'_');
6415 std::vector<uint8_t>
serialize(
const Map& map
6418 std::error_code error;
6441 std::vector<uint8_t>
serialize(
const Map& map
6442 , std::error_code& error
6445 std::vector<uint8_t> vector;
6447 error = serialize_(map, vector);
6452 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
6453 TEST_CASE(
"serialize/map (fixed_map)")
6456 std::vector<uint8_t> data;
6461 CHECK(data.size() == 1);
6462 CHECK((data[0] & Fixed_Map_Mask) == (uint8_t)Format::Fixed_Map);
6463 CHECK((data[0] & Fixed_Map_Value) == 0);
6466 CHECK(
object.isMap() ==
true);
6467 CHECK(
object.asMap().size() == 0);
6474 for(
size_t i = 0; i < max; i++)
6479 map.set(Object{int64_t(i)}, Object{std::to_string(i)});
6483 CHECK(data.size() == 51);
6484 CHECK((data[0] & Fixed_Map_Mask) == (uint8_t)Format::Fixed_Map);
6485 CHECK((data[0] & Fixed_Map_Value) == max);
6488 CHECK(
object.isMap() ==
true);
6489 CHECK(
object.asMap().size() == max);
6491 for(
size_t i = 0; i < max; i++)
6493 Object key = Object{int64_t(i)};
6494 CHECK(map.keyExists(key) ==
true);
6496 Object value = map.at(key);
6497 CHECK(value.asString() == std::to_string(i));
6503 TEST_CASE(
"serialize/map (map16)")
6506 std::vector<uint8_t> data;
6510 const size_t min = 16;
6512 for(
size_t i = 0; i < min; i++)
6514 map.set(Object{int64_t(i)}, Object{std::to_string(i)});
6518 CHECK(data.size() == 57);
6519 CHECK(data[0] == (uint8_t)Format::Map16);
6521 Convert_Byte1 = data[1];
6522 Convert_Byte0 = data[2];
6523 CHECK(Convert.uint16 == min);
6526 CHECK(
object.isMap() ==
true);
6527 CHECK(
object.asMap().size() == min);
6529 for(
size_t i = 0; i < min; i++)
6531 Object key = Object{int64_t(i)};
6532 CHECK(map.keyExists(key) ==
true);
6534 Object value = map.at(key);
6535 CHECK(value.asString() == std::to_string(i));
6541 const size_t max = std::numeric_limits<uint16_t>::max();
6544 for(
size_t i = 0; i < max; i++)
6546 Object key = {int64_t(i)};
6547 Object val = {std::to_string(i)};
6548 map.set(std::move(key), std::move(val));
6554 CHECK(data.size() == 643986);
6555 CHECK(data[0] == (uint8_t)Format::Map16);
6557 Convert_Byte1 = data[1];
6558 Convert_Byte0 = data[2];
6559 CHECK(Convert.uint16 == max);
6562 CHECK(
object.isMap() ==
true);
6563 CHECK(
object.asMap().size() == max);
6565 for(
size_t i = 0; i < max; i++)
6567 Object key = Object{int64_t(i)};
6568 CHECK(map.keyExists(key) ==
true);
6570 Object value = map.at(key);
6571 CHECK(value.asString() == std::to_string(i));
6577 TEST_CASE(
"serialize/map (map32)")
6580 std::vector<uint8_t> data;
6584 const size_t min = std::numeric_limits<uint16_t>::max() + 1;
6587 for(
size_t i = 0; i < min; i++)
6589 Object key = {int64_t(i)};
6590 Object val = {std::to_string(i)};
6591 map.set(std::move(key), std::move(val));
6597 CHECK(data.size() == 643999);
6598 CHECK(data[0] == (uint8_t)Format::Map32);
6600 Convert_Byte3 = data[1];
6601 Convert_Byte2 = data[2];
6602 Convert_Byte1 = data[3];
6603 Convert_Byte0 = data[4];
6604 CHECK(Convert.uint32 == min);
6607 CHECK(
object.isMap() ==
true);
6608 CHECK(
object.asMap().size() == min);
6610 for(
size_t i = 0; i < min; i++)
6612 Object key = Object{int64_t(i)};
6613 CHECK(map.keyExists(key) ==
true);
6615 Object value = map.at(key);
6616 CHECK(value.asString() == std::to_string(i));
6623 const size_t max = std::numeric_limits<uint32_t>::max();
6624 map.object_key.reserve(max);
6625 map.object_value.reserve(max);
6627 printf(
"Generating %lu Map entries\n", max);
6628 for(
size_t i = 0; i < max; i++)
6630 Object key = {int64_t(i)};
6631 Object val = {std::to_string(i)};
6632 map.set(std::move(key), std::move(val));
6634 if(i % 1000 == 0) { printf(
"%lu/%lu\n", i, max); }
6638 CHECK(data.size() == 0);
6639 CHECK(data[0] == (uint8_t)Format::Map32);
6641 Convert_Byte3 = data[1];
6642 Convert_Byte2 = data[2];
6643 Convert_Byte1 = data[3];
6644 Convert_Byte0 = data[4];
6645 CHECK(Convert.uint32 == max);
6648 CHECK(
object.isMap() ==
true);
6649 CHECK(
object.asMap().size() == max);
6651 for(
size_t i = 0; i < max; i++)
6653 Object key = Object{int64_t(i)};
6654 CHECK(map.keyExists(key) ==
true);
6656 Object value = map.at(key);
6657 CHECK(value.asString() == std::to_string(i));
6680 std::vector<uint8_t>
serialize(
const Object&
object
6683 std::error_code error;
6705 std::vector<uint8_t>
serialize(
const Object&
object
6706 , std::error_code& error
6709 std::vector<uint8_t> vector;
6711 error = serialize_(
object, vector);
6717 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
6719 TEST_CASE(
"serialize/object/nill")
6722 CHECK(
object.isNull());
6726 std::vector<uint8_t> data =
serialize(
object);
6727 CHECK(data.size() == 1);
6732 CHECK(data[index] == (uint8_t)Format::Nill);
6735 CHECK(
object.isNull());
6739 TEST_CASE(
"serialize/object/bool")
6742 std::vector<uint8_t> data;
6748 CHECK(
object.is<bool>());
6753 CHECK(data.size() == 1);
6756 CHECK(data[index] == (uint8_t)Format::True);
6761 CHECK(
object.is<bool>());
6762 CHECK(
object.as<bool>() ==
true);
6768 CHECK(
object.is<bool>());
6773 CHECK(data.size() == 1);
6775 CHECK(data[index] == (uint8_t)Format::False);
6780 CHECK(
object.is<bool>());
6781 CHECK(
object.as<bool>() ==
false);
6786 TEST_CASE(
"serialize/object/fixed_int")
6789 std::vector<uint8_t> data;
6796 const int64_t fixint_zero = 0;
6798 object = {fixint_zero};
6799 CHECK(
object.is<int64_t>());
6804 CHECK(data.size() == 1);
6807 CHECK((data[index] & Fixed_Int_Pos_Mask) == (uint8_t)Format::Fixed_Int_Pos);
6808 CHECK((data[index] & Fixed_Int_Pos_Value) == fixint_zero);
6813 CHECK(
object.is<int64_t>());
6814 CHECK(
object.as<int64_t>() == fixint_zero);
6821 const int64_t fixint_max = 127;
6823 object = {fixint_max};
6824 CHECK(
object.is<int64_t>());
6829 CHECK(data.size() == 1);
6832 CHECK((data[index] & Fixed_Int_Pos_Mask) == (uint8_t)Format::Fixed_Int_Pos);
6833 CHECK((data[index] & Fixed_Int_Pos_Value) == fixint_max);
6838 CHECK(
object.is<int64_t>());
6839 CHECK(
object.as<int64_t>() == fixint_max);
6846 const int64_t fixint_min = -32;
6848 object = {fixint_min};
6849 CHECK(
object.is<int64_t>());
6854 CHECK(data.size() == 1);
6857 CHECK((data[index] & Fixed_Int_Neg_Mask) == (uint8_t)Format::Fixed_Int_Neg);
6858 CHECK(((data[index] & Fixed_Int_Neg_Value) - 32) == fixint_min);
6863 CHECK(
object.is<int64_t>());
6864 CHECK(
object.as<int64_t>() == fixint_min);
6869 SUBCASE(
"Value: 24")
6871 const int64_t fixint_p24 = 24;
6873 object = {fixint_p24};
6874 CHECK(
object.is<int64_t>());
6879 CHECK(data.size() == 1);
6882 CHECK((data[index] & Fixed_Int_Pos_Mask) == (uint8_t)Format::Fixed_Int_Pos);
6883 CHECK((data[index] & Fixed_Int_Pos_Value) == fixint_p24);
6888 CHECK(
object.is<int64_t>());
6889 CHECK(
object.as<int64_t>() == fixint_p24);
6894 SUBCASE(
"Value: -24")
6896 const int64_t fixint_n24 = -24;
6898 object = {fixint_n24};
6899 CHECK(
object.is<int64_t>());
6904 CHECK(data.size() == 1);
6907 CHECK((data[index] & Fixed_Int_Neg_Mask) == (uint8_t)Format::Fixed_Int_Neg);
6908 CHECK(((data[index] & Fixed_Int_Neg_Value) - 32) == fixint_n24);
6913 CHECK(
object.is<int64_t>());
6914 CHECK(
object.as<int64_t>() == fixint_n24);
6919 TEST_CASE(
"serialize/object/int8")
6922 std::vector<uint8_t> data;
6932 const int64_t i8_min = std::numeric_limits<int8_t>::min();
6935 CHECK(
object.is<int64_t>());
6940 CHECK(data.size() == 2);
6943 CHECK(data[index] == (uint8_t)Format::Int8);
6945 CHECK((int8_t)data[index] == i8_min);
6950 CHECK(
object.is<int64_t>());
6951 CHECK(
object.as<int64_t>() == i8_min);
6956 SUBCASE(
"Value: -33")
6958 const int64_t i8_min = -33;
6961 CHECK(
object.is<int64_t>());
6966 CHECK(data.size() == 2);
6969 CHECK(data[index] == (uint8_t)Format::Int8);
6971 CHECK((int8_t)data[index] == i8_min);
6976 CHECK(
object.is<int64_t>());
6977 CHECK(
object.as<int64_t>() == i8_min);
6982 TEST_CASE(
"serialize/object/int16")
6985 std::vector<uint8_t> data;
6992 const int64_t i16_min = std::numeric_limits<int16_t>::min();
6995 CHECK(
object.is<int64_t>());
7000 CHECK(data.size() == 3);
7003 CHECK(data[index++] == (uint8_t)Format::Int16);
7006 Convert_Byte1 = data[index++];
7007 Convert_Byte0 = data[index++];
7008 CHECK(Convert.int16 == i16_min);
7013 CHECK(
object.is<int64_t>());
7014 CHECK(
object.as<int64_t>() == i16_min);
7021 const int64_t i16_min = std::numeric_limits<int8_t>::min() - (int64_t)1;
7024 CHECK(
object.is<int64_t>());
7029 CHECK(data.size() == 3);
7032 CHECK(data[index++] == (uint8_t)Format::Int16);
7035 Convert_Byte1 = data[index++];
7036 Convert_Byte0 = data[index++];
7037 CHECK(Convert.int16 == i16_min);
7042 CHECK(
object.is<int64_t>());
7043 CHECK(
object.as<int64_t>() == i16_min);
7050 const int64_t i16_max = std::numeric_limits<int16_t>::max();
7053 CHECK(
object.is<int64_t>());
7058 CHECK(data.size() == 3);
7061 CHECK(data[index++] == (uint8_t)Format::Int16);
7064 Convert_Byte1 = data[index++];
7065 Convert_Byte0 = data[index++];
7066 CHECK(Convert.int16 == i16_max);
7071 CHECK(
object.is<int64_t>());
7072 CHECK(
object.as<int64_t>() == i16_max);
7079 const int64_t i16_max = std::numeric_limits<int16_t>::max();
7082 CHECK(
object.is<int64_t>());
7087 CHECK(data.size() == 3);
7090 CHECK(data[index++] == (uint8_t)Format::Int16);
7093 Convert_Byte1 = data[index++];
7094 Convert_Byte0 = data[index++];
7095 CHECK(Convert.int16 == i16_max);
7100 CHECK(
object.is<int64_t>());
7101 CHECK(
object.as<int64_t>() == i16_max);
7106 TEST_CASE(
"serialize/object/int32")
7109 std::vector<uint8_t> data;
7116 const int64_t i32_min = std::numeric_limits<int32_t>::min();
7119 CHECK(
object.is<int64_t>());
7124 CHECK(data.size() == 5);
7127 CHECK(data[index++] == (uint8_t)Format::Int32);
7130 Convert_Byte3 = data[index++];
7131 Convert_Byte2 = data[index++];
7132 Convert_Byte1 = data[index++];
7133 Convert_Byte0 = data[index++];
7134 CHECK(Convert.int32 == i32_min);
7139 CHECK(
object.is<int64_t>());
7140 CHECK(
object.as<int64_t>() == i32_min);
7147 const int64_t i32_min = std::numeric_limits<int16_t>::min() - (int64_t)1;
7150 CHECK(
object.is<int64_t>());
7155 CHECK(data.size() == 5);
7158 CHECK(data[index++] == (uint8_t)Format::Int32);
7161 Convert_Byte3 = data[index++];
7162 Convert_Byte2 = data[index++];
7163 Convert_Byte1 = data[index++];
7164 Convert_Byte0 = data[index++];
7165 CHECK(Convert.int32 == i32_min);
7170 CHECK(
object.is<int64_t>());
7171 CHECK(
object.as<int64_t>() == i32_min);
7178 const int64_t i32_max = std::numeric_limits<int32_t>::max();
7181 CHECK(
object.is<int64_t>());
7186 CHECK(data.size() == 5);
7189 CHECK(data[index++] == (uint8_t)Format::Int32);
7192 Convert_Byte3 = data[index++];
7193 Convert_Byte2 = data[index++];
7194 Convert_Byte1 = data[index++];
7195 Convert_Byte0 = data[index++];
7196 CHECK(Convert.int32 == i32_max);
7201 CHECK(
object.is<int64_t>());
7202 CHECK(
object.as<int64_t>() == i32_max);
7209 const int64_t i32_max = std::numeric_limits<int16_t>::max() + 1;
7212 CHECK(
object.is<int64_t>());
7217 CHECK(data.size() == 5);
7220 CHECK(data[index++] == (uint8_t)Format::Int32);
7223 Convert_Byte3 = data[index++];
7224 Convert_Byte2 = data[index++];
7225 Convert_Byte1 = data[index++];
7226 Convert_Byte0 = data[index++];
7227 CHECK(Convert.int32 == i32_max);
7232 CHECK(
object.is<int64_t>());
7233 CHECK(
object.as<int64_t>() == i32_max);
7238 TEST_CASE(
"serialize/object/int64")
7241 std::vector<uint8_t> data;
7248 const int64_t i64_min = std::numeric_limits<int64_t>::min();
7251 CHECK(
object.is<int64_t>());
7256 CHECK(data.size() == 9);
7259 CHECK(data[index++] == (uint8_t)Format::Int64);
7262 Convert_Byte7 = data[index++];
7263 Convert_Byte6 = data[index++];
7264 Convert_Byte5 = data[index++];
7265 Convert_Byte4 = data[index++];
7266 Convert_Byte3 = data[index++];
7267 Convert_Byte2 = data[index++];
7268 Convert_Byte1 = data[index++];
7269 Convert_Byte0 = data[index++];
7270 CHECK(Convert.int64 == i64_min);
7275 CHECK(
object.is<int64_t>());
7276 CHECK(
object.as<int64_t>() == i64_min);
7283 const int64_t i64_min = std::numeric_limits<int32_t>::min() - (int64_t)1;
7286 CHECK(
object.is<int64_t>());
7291 CHECK(data.size() == 9);
7294 CHECK(data[index++] == (uint8_t)Format::Int64);
7297 Convert_Byte7 = data[index++];
7298 Convert_Byte6 = data[index++];
7299 Convert_Byte5 = data[index++];
7300 Convert_Byte4 = data[index++];
7301 Convert_Byte3 = data[index++];
7302 Convert_Byte2 = data[index++];
7303 Convert_Byte1 = data[index++];
7304 Convert_Byte0 = data[index++];
7305 CHECK(Convert.int64 == i64_min);
7310 CHECK(
object.is<int64_t>());
7311 CHECK(
object.as<int64_t>() == i64_min);
7318 const int64_t i64_max = std::numeric_limits<int64_t>::max();
7321 CHECK(
object.is<int64_t>());
7326 CHECK(data.size() == 9);
7329 CHECK(data[index++] == (uint8_t)Format::Int64);
7332 Convert_Byte7 = data[index++];
7333 Convert_Byte6 = data[index++];
7334 Convert_Byte5 = data[index++];
7335 Convert_Byte4 = data[index++];
7336 Convert_Byte3 = data[index++];
7337 Convert_Byte2 = data[index++];
7338 Convert_Byte1 = data[index++];
7339 Convert_Byte0 = data[index++];
7340 CHECK(Convert.int64 == i64_max);
7345 CHECK(
object.is<int64_t>());
7346 CHECK(
object.as<int64_t>() == i64_max);
7353 const int64_t i64_max = std::numeric_limits<int32_t>::max() + (int64_t)1;
7356 CHECK(
object.is<int64_t>());
7361 CHECK(data.size() == 9);
7364 CHECK(data[index++] == (uint8_t)Format::Int64);
7367 Convert_Byte7 = data[index++];
7368 Convert_Byte6 = data[index++];
7369 Convert_Byte5 = data[index++];
7370 Convert_Byte4 = data[index++];
7371 Convert_Byte3 = data[index++];
7372 Convert_Byte2 = data[index++];
7373 Convert_Byte1 = data[index++];
7374 Convert_Byte0 = data[index++];
7375 CHECK(Convert.int64 == i64_max);
7380 CHECK(
object.is<int64_t>());
7381 CHECK(
object.as<int64_t>() == i64_max);
7386 TEST_CASE(
"serialize/object/uint8")
7389 std::vector<uint8_t> data;
7396 const uint64_t u8_min = 0;
7399 CHECK(
object.is<uint64_t>());
7404 CHECK(data.size() == 2);
7407 CHECK(data[index++] == (uint8_t)Format::Uint8);
7408 CHECK(data[index++] == u8_min);
7413 CHECK(
object.is<uint64_t>());
7414 CHECK(
object.as<uint64_t>() == u8_min);
7421 const uint64_t u8_max = std::numeric_limits<uint8_t>::max();
7424 CHECK(
object.is<uint64_t>());
7429 CHECK(data.size() == 2);
7432 CHECK(data[index++] == (uint8_t)Format::Uint8);
7433 CHECK(data[index++] == u8_max);
7438 CHECK(
object.is<uint64_t>());
7439 CHECK(
object.as<uint64_t>() == u8_max);
7444 TEST_CASE(
"serialize/object/uint16")
7447 std::vector<uint8_t> data;
7454 const uint64_t u16_min = std::numeric_limits<uint8_t>::max() + (uint64_t)1;
7457 CHECK(
object.is<uint64_t>());
7462 CHECK(data.size() == 3);
7465 CHECK(data[index++] == (uint8_t)Format::Uint16);
7466 Convert_Byte1 = data[index++];
7467 Convert_Byte0 = data[index++];
7468 CHECK(Convert.uint16 == u16_min);
7473 CHECK(
object.is<uint64_t>());
7474 CHECK(
object.as<uint64_t>() == u16_min);
7481 const uint64_t u16_max = std::numeric_limits<uint16_t>::max();
7484 CHECK(
object.is<uint64_t>());
7489 CHECK(data.size() == 3);
7492 CHECK(data[index++] == (uint8_t)Format::Uint16);
7493 Convert_Byte1 = data[index++];
7494 Convert_Byte0 = data[index++];
7495 CHECK(Convert.uint16 == u16_max);
7500 CHECK(
object.is<uint64_t>());
7501 CHECK(
object.as<uint64_t>() == u16_max);
7506 TEST_CASE(
"serialize/object/uint32")
7509 std::vector<uint8_t> data;
7516 const uint64_t u32_min = std::numeric_limits<uint16_t>::max() + (uint64_t)1;
7519 CHECK(
object.is<uint64_t>());
7524 CHECK(data.size() == 5);
7527 CHECK(data[index++] == (uint8_t)Format::Uint32);
7528 Convert_Byte3 = data[index++];
7529 Convert_Byte2 = data[index++];
7530 Convert_Byte1 = data[index++];
7531 Convert_Byte0 = data[index++];
7532 CHECK(Convert.uint32 == u32_min);
7537 CHECK(
object.is<uint64_t>());
7538 CHECK(
object.as<uint64_t>() == u32_min);
7545 const uint64_t u32_max = std::numeric_limits<uint32_t>::max();
7548 CHECK(
object.is<uint64_t>());
7553 CHECK(data.size() == 5);
7556 CHECK(data[index++] == (uint8_t)Format::Uint32);
7557 Convert_Byte3 = data[index++];
7558 Convert_Byte2 = data[index++];
7559 Convert_Byte1 = data[index++];
7560 Convert_Byte0 = data[index++];
7561 CHECK(Convert.uint32 == u32_max);
7566 CHECK(
object.is<uint64_t>());
7567 CHECK(
object.as<uint64_t>() == u32_max);
7572 TEST_CASE(
"serialize/object/uint64")
7575 std::vector<uint8_t> data;
7582 const uint64_t u64_min = std::numeric_limits<uint32_t>::max() + (uint64_t)1;
7585 CHECK(
object.is<uint64_t>());
7590 CHECK(data.size() == 9);
7593 CHECK(data[index++] == (uint8_t)Format::Uint64);
7594 Convert_Byte7 = data[index++];
7595 Convert_Byte6 = data[index++];
7596 Convert_Byte5 = data[index++];
7597 Convert_Byte4 = data[index++];
7598 Convert_Byte3 = data[index++];
7599 Convert_Byte2 = data[index++];
7600 Convert_Byte1 = data[index++];
7601 Convert_Byte0 = data[index++];
7602 CHECK(Convert.uint64 == u64_min);
7607 CHECK(
object.is<uint64_t>());
7608 CHECK(
object.as<uint64_t>() == u64_min);
7615 const uint64_t u64_max = std::numeric_limits<uint64_t>::max();
7618 CHECK(
object.is<uint64_t>());
7623 CHECK(data.size() == 9);
7626 CHECK(data[index++] == (uint8_t)Format::Uint64);
7627 Convert_Byte7 = data[index++];
7628 Convert_Byte6 = data[index++];
7629 Convert_Byte5 = data[index++];
7630 Convert_Byte4 = data[index++];
7631 Convert_Byte3 = data[index++];
7632 Convert_Byte2 = data[index++];
7633 Convert_Byte1 = data[index++];
7634 Convert_Byte0 = data[index++];
7635 CHECK(Convert.uint64 == u64_max);
7640 CHECK(
object.is<uint64_t>());
7641 CHECK(
object.as<uint64_t>() == u64_max);
7646 TEST_CASE(
"serialize/object/float32")
7649 std::vector<uint8_t> data;
7656 const float f32_zero = 0;
7658 object = {f32_zero};
7659 CHECK(
object.is<float>());
7664 CHECK(data.size() == 5);
7667 CHECK(data[index++] == (uint8_t)Format::Float32);
7668 Convert_Byte3 = data[index++];
7669 Convert_Byte2 = data[index++];
7670 Convert_Byte1 = data[index++];
7671 Convert_Byte0 = data[index++];
7672 CHECK(Convert.float32 == f32_zero);
7677 CHECK(
object.is<float>());
7678 CHECK(
object.as<float>() == f32_zero);
7685 const float f32_min = std::numeric_limits<float>::min();
7688 CHECK(
object.is<float>());
7693 CHECK(data.size() == 5);
7696 CHECK(data[index++] == (uint8_t)Format::Float32);
7697 Convert_Byte3 = data[index++];
7698 Convert_Byte2 = data[index++];
7699 Convert_Byte1 = data[index++];
7700 Convert_Byte0 = data[index++];
7701 CHECK(Convert.float32 == f32_min);
7706 CHECK(
object.is<float>());
7707 CHECK(
object.as<float>() == f32_min);
7714 const float f32_max = std::numeric_limits<float>::max();
7717 CHECK(
object.is<float>());
7722 CHECK(data.size() == 5);
7725 CHECK(data[index++] == (uint8_t)Format::Float32);
7726 Convert_Byte3 = data[index++];
7727 Convert_Byte2 = data[index++];
7728 Convert_Byte1 = data[index++];
7729 Convert_Byte0 = data[index++];
7730 CHECK(Convert.float32 == f32_max);
7735 CHECK(
object.is<float>());
7736 CHECK(
object.as<float>() == f32_max);
7741 TEST_CASE(
"serialize/object/float64")
7744 std::vector<uint8_t> data;
7751 const double f64_zero = 0;
7753 object = {f64_zero};
7754 CHECK(
object.is<double>());
7759 CHECK(data.size() == 9);
7762 CHECK(data[index++] == (uint8_t)Format::Float64);
7763 Convert_Byte7 = data[index++];
7764 Convert_Byte6 = data[index++];
7765 Convert_Byte5 = data[index++];
7766 Convert_Byte4 = data[index++];
7767 Convert_Byte3 = data[index++];
7768 Convert_Byte2 = data[index++];
7769 Convert_Byte1 = data[index++];
7770 Convert_Byte0 = data[index++];
7771 CHECK(Convert.float64 == f64_zero);
7776 CHECK(
object.is<double>());
7777 CHECK(
object.as<double>() == f64_zero);
7784 const double f64_min = std::numeric_limits<double>::min();
7787 CHECK(
object.is<double>());
7792 CHECK(data.size() == 9);
7795 CHECK(data[index++] == (uint8_t)Format::Float64);
7796 Convert_Byte7 = data[index++];
7797 Convert_Byte6 = data[index++];
7798 Convert_Byte5 = data[index++];
7799 Convert_Byte4 = data[index++];
7800 Convert_Byte3 = data[index++];
7801 Convert_Byte2 = data[index++];
7802 Convert_Byte1 = data[index++];
7803 Convert_Byte0 = data[index++];
7804 CHECK(Convert.float64 == f64_min);
7809 CHECK(
object.is<double>());
7810 CHECK(
object.as<double>() == f64_min);
7817 const double f64_max = std::numeric_limits<double>::max();
7820 CHECK(
object.is<double>());
7825 CHECK(data.size() == 9);
7828 CHECK(data[index++] == (uint8_t)Format::Float64);
7829 Convert_Byte7 = data[index++];
7830 Convert_Byte6 = data[index++];
7831 Convert_Byte5 = data[index++];
7832 Convert_Byte4 = data[index++];
7833 Convert_Byte3 = data[index++];
7834 Convert_Byte2 = data[index++];
7835 Convert_Byte1 = data[index++];
7836 Convert_Byte0 = data[index++];
7837 CHECK(Convert.float64 == f64_max);
7842 CHECK(
object.is<double>());
7843 CHECK(
object.as<double>() == f64_max);
7848 TEST_CASE(
"serialize/object/fixed_str")
7851 std::vector<uint8_t> data;
7859 const std::string string;
7862 CHECK(
object.is<std::string>());
7867 CHECK(data.size() == 1);
7870 CHECK((data[index] & Fixed_Str_Mask) == (uint8_t)Format::Fixed_Str);
7871 str_len = data[index] & Fixed_Str_Value;
7872 CHECK(str_len ==
string.size());
7877 CHECK(
object.is<std::string>());
7878 CHECK(
object.as<std::string>() ==
string);
7885 const std::string string(1,
'_');
7888 CHECK(
object.is<std::string>());
7893 CHECK(data.size() ==
string.size() + 1);
7896 CHECK((data[index] & Fixed_Str_Mask) == (uint8_t)Format::Fixed_Str);
7897 str_len = data[index] & Fixed_Str_Value;
7898 CHECK(str_len ==
string.size());
7903 CHECK(
object.is<std::string>());
7904 CHECK(
object.as<std::string>() ==
string);
7911 const std::string string(31,
'X');
7914 CHECK(
object.is<std::string>());
7919 CHECK(data.size() ==
string.size() + 1);
7922 CHECK((data[index] & Fixed_Str_Mask) == (uint8_t)Format::Fixed_Str);
7923 str_len = data[index] & Fixed_Str_Value;
7924 CHECK(str_len ==
string.size());
7929 CHECK(
object.is<std::string>());
7930 CHECK(
object.as<std::string>() ==
string);
7935 TEST_CASE(
"serialize/object/str8")
7938 std::vector<uint8_t> data;
7946 const std::string string(32,
'_');
7949 CHECK(
object.is<std::string>());
7954 CHECK(data.size() ==
string.size() + 2);
7957 CHECK(data[index++] == (uint8_t)Format::Str8);
7958 str_len = data[index++];
7959 CHECK(str_len ==
string.size());
7964 CHECK(
object.is<std::string>());
7965 CHECK(
object.as<std::string>() ==
string);
7972 const std::string string(std::numeric_limits<uint8_t>::max(),
'X');
7975 CHECK(
object.is<std::string>());
7980 CHECK(data.size() == (
string.size() + 2));
7983 CHECK(data[index++] == (uint8_t)Format::Str8);
7984 str_len = data[index++];
7985 CHECK(str_len ==
string.size());
7990 CHECK(
object.is<std::string>());
7991 CHECK(
object.as<std::string>() ==
string);
7996 TEST_CASE(
"serialize/object/str16")
7999 std::vector<uint8_t> data;
8007 const std::string string(std::numeric_limits<uint8_t>::max() + 1,
'_');
8010 CHECK(
object.is<std::string>());
8015 CHECK(data.size() ==
string.size() + 3);
8018 CHECK(data[index++] == (uint8_t)Format::Str16);
8019 Convert_Byte1 = data[index++];
8020 Convert_Byte0 = data[index++];
8021 str_len = Convert.uint16;
8022 CHECK(str_len ==
string.size());
8027 CHECK(
object.is<std::string>());
8028 CHECK(
object.as<std::string>() ==
string);
8035 const std::string string(std::numeric_limits<uint16_t>::max(),
'X');
8038 CHECK(
object.is<std::string>());
8043 CHECK(data.size() == (
string.size() + 3));
8046 CHECK(data[index++] == (uint8_t)Format::Str16);
8047 Convert_Byte1 = data[index++];
8048 Convert_Byte0 = data[index++];
8049 str_len = Convert.uint16;
8050 CHECK(str_len ==
string.size());
8055 CHECK(
object.is<std::string>());
8056 CHECK(
object.as<std::string>() ==
string);
8061 TEST_CASE(
"serialize/object/str32")
8064 std::vector<uint8_t> data;
8072 const std::string string(std::numeric_limits<uint16_t>::max() + 1,
'_');
8075 CHECK(
object.is<std::string>());
8080 CHECK(data.size() ==
string.size() + 5);
8083 CHECK(data[index++] == (uint8_t)Format::Str32);
8084 Convert_Byte3 = data[index++];
8085 Convert_Byte2 = data[index++];
8086 Convert_Byte1 = data[index++];
8087 Convert_Byte0 = data[index++];
8088 str_len = Convert.uint32;
8089 CHECK(str_len ==
string.size());
8094 CHECK(
object.is<std::string>());
8095 CHECK(
object.as<std::string>() ==
string);
8135 TEST_CASE(
"serialize/object/bin8")
8138 std::vector<uint8_t> data;
8146 const std::vector<uint8_t> bin = {};
8149 CHECK(
object.isBinary());
8154 CHECK(data.size() == bin.size() + 2);
8157 CHECK(data[index++] == (uint8_t)Format::Bin8);
8158 bin_len = data[index++];
8159 CHECK(bin_len == bin.size());
8164 CHECK(
object.isBinary());
8166 const std::vector<uint8_t>& vector =
object.asBinary();
8167 for(
size_t i = 0; i < bin_len; i++)
8169 CHECK(vector[i] == bin[i]);
8177 const std::vector<uint8_t> bin(std::numeric_limits<uint8_t>::max(),
'X');
8180 CHECK(
object.isBinary());
8185 CHECK(data.size() == bin.size() + 2);
8188 CHECK(data[index++] == (uint8_t)Format::Bin8);
8189 bin_len = data[index++];
8190 CHECK(bin_len == bin.size());
8195 CHECK(
object.isBinary());
8197 const std::vector<uint8_t>& vector =
object.asBinary();
8198 for(
size_t i = 0; i < bin_len; i++)
8200 CHECK(vector[i] == bin[i]);
8206 TEST_CASE(
"serialize/object/bin16")
8209 std::vector<uint8_t> data;
8217 const std::vector<uint8_t> bin(std::numeric_limits<uint8_t>::max() + 1,
'_');
8220 CHECK(
object.isBinary());
8225 CHECK(data.size() == bin.size() + 3);
8228 CHECK(data[index++] == (uint8_t)Format::Bin16);
8229 Convert_Byte1 = data[index++];
8230 Convert_Byte0 = data[index++];
8231 bin_len = Convert.uint16;
8232 CHECK(bin_len == bin.size());
8237 CHECK(
object.isBinary());
8239 const std::vector<uint8_t>& vector =
object.asBinary();
8240 for(
size_t i = 0; i < bin_len; i++)
8242 CHECK(vector[i] == bin[i]);
8250 const std::vector<uint8_t> bin(std::numeric_limits<uint16_t>::max(),
'X');
8253 CHECK(
object.isBinary());
8258 CHECK(data.size() == bin.size() + 3);
8261 CHECK(data[index++] == (uint8_t)Format::Bin16);
8262 Convert_Byte1 = data[index++];
8263 Convert_Byte0 = data[index++];
8264 bin_len = Convert.uint16;
8265 CHECK(bin_len == bin.size());
8270 CHECK(
object.isBinary());
8272 const std::vector<uint8_t>& vector =
object.asBinary();
8273 for(
size_t i = 0; i < bin_len; i++)
8275 CHECK(vector[i] == bin[i]);
8281 TEST_CASE(
"serialize/object/bin32")
8284 std::vector<uint8_t> data;
8292 const std::vector<uint8_t> bin(std::numeric_limits<uint16_t>::max() + 1,
'_');
8295 CHECK(
object.isBinary());
8300 CHECK(data.size() == bin.size() + 5);
8303 CHECK(data[index++] == (uint8_t)Format::Bin32);
8304 Convert_Byte3 = data[index++];
8305 Convert_Byte2 = data[index++];
8306 Convert_Byte1 = data[index++];
8307 Convert_Byte0 = data[index++];
8308 bin_len = Convert.uint32;
8309 CHECK(bin_len == bin.size());
8314 CHECK(
object.isBinary());
8316 const std::vector<uint8_t>& vector =
object.asBinary();
8317 for(
size_t i = 0; i < bin_len; i++)
8319 CHECK(vector[i] == bin[i]);
8365 TEST_CASE(
"serialize/object/fixed_array")
8368 std::vector<uint8_t> data;
8377 CHECK(
object.isArray());
8378 CHECK(
object.asArray().size() == 0);
8383 CHECK(data.size() == 1);
8386 CHECK((data[index] & Fixed_Array_Mask) == (uint8_t)Format::Fixed_Array);
8387 array_len = data[index] & Fixed_Array_Value;
8388 CHECK(array_len == 0);
8393 CHECK(
object.isArray());
8394 CHECK(
object.asArray().size() == 0);
8402 CHECK(
object.isArray());
8404 for(
size_t i = 0; i < 15; i++)
8406 object.asArray().appendNull();
8409 array_len =
object.asArray().size();
8410 CHECK(array_len == 15);
8415 CHECK(data.size() == (array_len + 1));
8418 CHECK((data[index] & Fixed_Array_Mask) == (uint8_t)Format::Fixed_Array);
8419 array_len = data[index] & Fixed_Array_Value;
8420 CHECK(array_len == 15);
8425 CHECK(
object.isArray());
8426 CHECK(
object.asArray().size() == 15);
8428 for(
size_t i = 0; i < 15; i++)
8430 CHECK(
object.asArray().
object(i).isNull());
8436 TEST_CASE(
"serialize/object/array16")
8439 std::vector<uint8_t> data;
8448 CHECK(
object.isArray());
8450 for(
size_t i = 0; i < 16; i++)
8452 object.asArray().append(
true);
8455 array_len =
object.asArray().size();
8456 CHECK(array_len == 16);
8461 CHECK(data.size() == (array_len + 3));
8464 CHECK(data[index++] == (uint8_t)Format::Array16);
8465 Convert_Byte1 = data[index++];
8466 Convert_Byte0 = data[index++];
8467 array_len = Convert.uint16;
8468 CHECK(array_len == 16);
8473 CHECK(
object.isArray());
8474 CHECK(
object.asArray().size() == 16);
8476 for(
size_t i = 0; i < 16; i++)
8478 CHECK(
object.asArray().
object(i).is<bool>());
8479 CHECK(
object.asArray().
object(i).as<bool>() ==
true);
8488 CHECK(
object.isArray());
8490 for(
size_t i = 0; i < std::numeric_limits<uint16_t>::max(); i++)
8492 object.asArray().append(
false);
8495 array_len =
object.asArray().size();
8496 CHECK(array_len == std::numeric_limits<uint16_t>::max());
8501 CHECK(data.size() == (array_len + 3));
8504 CHECK(data[index++] == (uint8_t)Format::Array16);
8505 Convert_Byte1 = data[index++];
8506 Convert_Byte0 = data[index++];
8507 array_len = Convert.uint16;
8508 CHECK(array_len == std::numeric_limits<uint16_t>::max());
8513 CHECK(
object.isArray());
8514 CHECK(array_len == std::numeric_limits<uint16_t>::max());
8516 for(
int i = 0; i < std::numeric_limits<uint16_t>::max(); i++)
8518 CHECK(
object.asArray().
object(i).is<bool>());
8519 CHECK(
object.asArray().
object(i).as<bool>() ==
false);
8525 TEST_CASE(
"serialize/object/array32")
8528 std::vector<uint8_t> data;
8537 CHECK(
object.isArray());
8539 for(
size_t i = 0; i < std::numeric_limits<uint16_t>::max() + 1; i++)
8541 object.asArray().append(
true);
8544 array_len =
object.asArray().size();
8545 CHECK(array_len == (std::numeric_limits<uint16_t>::max() + 1));
8550 CHECK(data.size() == (array_len + 5));
8553 CHECK(data[index++] == (uint8_t)Format::Array32);
8554 Convert_Byte3 = data[index++];
8555 Convert_Byte2 = data[index++];
8556 Convert_Byte1 = data[index++];
8557 Convert_Byte0 = data[index++];
8558 array_len = Convert.uint32;
8559 CHECK(array_len == (std::numeric_limits<uint16_t>::max() + 1));
8564 CHECK(
object.isArray());
8565 CHECK(
object.asArray().size() == (std::numeric_limits<uint16_t>::max() + 1));
8567 for(
size_t i = 0; i < std::numeric_limits<uint16_t>::max() + 1; i++)
8569 CHECK(
object.asArray().
object(i).is<bool>());
8570 CHECK(
object.asArray().
object(i).as<bool>() ==
true);
8632 std::string
to_string(
const messagepack::Array& array
8635 std::string s =
"[";
8637 std::string prefix =
" ";
8639 for(
size_t i = 0; i < array.size(); i++)
8641 s += prefix +
to_string(array.object(i));
8660 std::string
to_string(
const messagepack::Ext& ext
8665 s +=
"( 'type': " + std::to_string(ext.type);
8668 std::string prefix =
" ";
8670 for(
size_t i = 0; i < ext.data.size(); i++)
8672 s += prefix + std::to_string(ext.data[i]);
8692 std::string
to_string(
const messagepack::Map& map
8695 std::string s =
"{";
8697 std::string prefix =
" ";
8699 if(map.null_map.empty() ==
false)
8710 for(
const auto& [key, value] : map.bool_map)
8721 for(
const auto& [key, value] : map.int64_map)
8732 for(
const auto& [key, value] : map.uint64_map)
8743 for(
const auto& [key, value] : map.float_map)
8754 for(
const auto& [key, value] : map.double_map)
8765 for(
const auto& [key, value] : map.string_map)
8787 std::string
to_string(
const messagepack::Object&
object
8790 std::string s =
"{ ";
8794 s +=
"'type': 'null'";
8796 else if(
object.is<bool>())
8798 s +=
"'type': 'bool', 'value': ";
8799 if(
object.as<bool>() ==
true)
8808 else if(
object.is<int64_t>())
8810 s +=
"'type': 'int64_t', 'value': "
8811 + std::to_string(
object.as<int64_t>())
8814 else if(
object.is<uint64_t>())
8816 s +=
"'type': 'uint64_t', 'value': "
8817 + std::to_string(
object.as<uint64_t>())
8820 else if(
object.is<float>())
8822 s +=
"'type': 'float', 'value': "
8823 + std::to_string(
object.as<float>())
8826 else if(
object.is<double>())
8828 s +=
"'type': 'double', 'value': "
8829 + std::to_string(
object.as<double>())
8832 else if(
object.is<std::string>())
8834 s +=
"'type': 'std::string', 'value': '"
8835 +
object.as<std::string>()
8839 else if(
object.is<std::vector<uint8_t>>())
8841 s +=
"'type': 'std::vector<uint8_t>', 'value': ["
8844 std::string prefix =
" ";
8846 const std::vector<uint8_t>& data =
object.as<std::vector<uint8_t>>();
8847 for(
size_t i = 0; i < data.size(); i++)
8849 s += prefix + std::to_string(data[i]);
8859 else if(
object.isArray())
8861 s +=
"'type': 'zakero::messagepack::Array', 'value': "
8865 else if(
object.isExt())
8867 s +=
"'type': 'zakero::messagepack::Ext', 'value': "
8871 else if(
object.isMap())
8873 s +=
"'type': 'zakero::messagepack::Ext', 'value': "
8896 std::ostream&
operator<<(std::ostream& stream
8914 std::ostream&
operator<<(std::ostream& stream
8932 std::ostream&
operator<<(std::ostream& stream
8950 std::ostream&
operator<<(std::ostream& stream
8977 if(lhs.isNull() && rhs.isNull())
8982 if(lhs.is<
bool>() && rhs.is<
bool>())
8984 return (lhs.as<
bool>() == rhs.as<
bool>());
8987 if(lhs.is<int64_t>() && rhs.is<int64_t>())
8989 return (lhs.as<int64_t>() == rhs.as<int64_t>());
8992 if(lhs.is<uint64_t>() && rhs.is<uint64_t>())
8994 return (lhs.as<uint64_t>() == rhs.as<uint64_t>());
8997 if(lhs.is<
float>() && rhs.is<
float>())
8999 return (lhs.as<
float>() == rhs.as<
float>());
9002 if(lhs.is<
double>() && rhs.is<
double>())
9004 return (lhs.as<
double>() == rhs.as<
double>());
9007 if(lhs.isString() && rhs.isString())
9009 return (lhs.asString() == rhs.asString());
9012 if(lhs.isBinary() && rhs.isBinary())
9014 return (lhs.asBinary() == rhs.asBinary());
9017 if(lhs.isArray() && rhs.isArray())
9022 if(l_array.
size() != r_array.
size())
9027 for(
size_t i = 0; i < l_array.
size(); i++)
9055 return !(lhs == rhs);
std::string to_string(const bool value) noexcept
Convert a bool into a string.
Definition: Zakero_Base.h:561
ErrorCategory_ ErrorCategory
A single instance.
Definition: Zakero_MessagePack.h:1383
std::ostream & operator<<(std::ostream &, const zakero::messagepack::Array &) noexcept
OStream operator.
Definition: Zakero_MessagePack.h:8892
Object deserialize(const std::vector< uint8_t > &) noexcept
Deserialize MessagePack data.
Definition: Zakero_MessagePack.h:4678
bool extensionTimestampCheck(const Object &) noexcept
Timestamp Extension Check.
Definition: Zakero_MessagePack.h:3967
bool operator!=(const zakero::messagepack::Object &lhs, const zakero::messagepack::Object &rhs) noexcept
Compare two Objects for inequality.
Definition: Zakero_MessagePack.h:9047
bool operator==(const zakero::messagepack::Object &lhs, const zakero::messagepack::Object &rhs) noexcept
Compare two Objects for equality.
Definition: Zakero_MessagePack.h:8964
std::string to_string(const messagepack::Array &) noexcept
Convert to a JSON formatted string.
Definition: Zakero_MessagePack.h:8628
struct timespec extensionTimestampConvert(const Object &) noexcept
Convert MessagePack Timestamp extension into a struct timespec.
Definition: Zakero_MessagePack.h:4058
std::vector< uint8_t > serialize(const messagepack::Array &) noexcept
Serialize Array data.
Definition: Zakero_MessagePack.h:5943
MessagePack Error Categories.
Definition: Zakero_MessagePack.h:247
std::string message(int condition) const noexcept final override
A description message.
Definition: Zakero_MessagePack.h:1363
const char * name() const noexcept final override
The name of the error category.
Definition: Zakero_MessagePack.h:1352
constexpr ErrorCategory_() noexcept
Constructor.
Definition: Zakero_MessagePack.h:249
An array of Objects.
Definition: Zakero_MessagePack.h:272
Object & object(const size_t index) noexcept
Access a data object.
Definition: Zakero_MessagePack.h:291
size_t append(const bool) noexcept
Append a boolean value.
Definition: Zakero_MessagePack.h:1425
std::vector< Object > object_vector
Store the Object data.
Definition: Zakero_MessagePack.h:297
size_t size() const noexcept
Get the size of the Array.
Definition: Zakero_MessagePack.h:295
void clear() noexcept
Remove all data from the Array.
Definition: Zakero_MessagePack.h:294
const Object & object(const size_t index) const noexcept
Access a data object.
Definition: Zakero_MessagePack.h:292
size_t appendNull() noexcept
Append a "Null" value.
Definition: Zakero_MessagePack.h:2738
Extension Data.
Definition: Zakero_MessagePack.h:304
A Key/Value collection of Objects.
Definition: Zakero_MessagePack.h:313
void clear() noexcept
Remove the contents of the Map.
Definition: Zakero_MessagePack.h:3622
std::error_code set(Object &, Object &) noexcept
Set a key/value pair.
Definition: Zakero_MessagePack.h:3108
size_t size() const noexcept
Get the size of the Map.
Definition: Zakero_MessagePack.h:3639
Object & at(Object &) noexcept
Get the value of a key.
Definition: Zakero_MessagePack.h:3521
bool keyExists(const Object &) const noexcept
Check if a key exists.
Definition: Zakero_MessagePack.h:3323
void erase(const Object &) noexcept
Erase a key/value pair.
Definition: Zakero_MessagePack.h:3227
A Data Object.
Definition: Zakero_MessagePack.h:337
constexpr bool isExt() const noexcept
Is Object an Ext?
Definition: Zakero_MessagePack.h:371
constexpr bool isString() const noexcept
Is Object a std::string?
Definition: Zakero_MessagePack.h:374
const messagepack::Array & asArray() const noexcept
Convert to an Array.
Definition: Zakero_MessagePack.h:357
messagepack::Array & asArray() noexcept
Convert to an Array.
Definition: Zakero_MessagePack.h:356
messagepack::Map & asMap() noexcept
Convert to a Map.
Definition: Zakero_MessagePack.h:360
const std::vector< uint8_t > & asBinary() const noexcept
Convert to a std::vector<uint8_t>.
Definition: Zakero_MessagePack.h:363
const std::string & asString() const noexcept
Convert to a std::string.
Definition: Zakero_MessagePack.h:364
constexpr bool is() const noexcept
Is Object of type T.
Definition: Zakero_MessagePack.h:367
constexpr bool isNull() const noexcept
Does the Object represent a null?
Definition: Zakero_MessagePack.h:373
constexpr bool isArray() const noexcept
Is Object an Array?
Definition: Zakero_MessagePack.h:369
const messagepack::Map & asMap() const noexcept
Convert to a Map.
Definition: Zakero_MessagePack.h:361
constexpr bool isMap() const noexcept
Is Object a Map?
Definition: Zakero_MessagePack.h:372
std::vector< uint8_t > & asBinary() noexcept
Convert to a std::vector<uint8_t>.
Definition: Zakero_MessagePack.h:362
const T & as() const noexcept
Convert to type T.
Definition: Zakero_MessagePack.h:354
T & as() noexcept
Convert to type T.
Definition: Zakero_MessagePack.h:352
constexpr bool isBinary() const noexcept
Is Object binary data?
Definition: Zakero_MessagePack.h:370
messagepack::Ext & asExt() noexcept
Convert to an Ext.
Definition: Zakero_MessagePack.h:358
const messagepack::Ext & asExt() const noexcept
Convert to an Ext.
Definition: Zakero_MessagePack.h:359