9 #ifndef zakero_MessagePack_h
10 #define zakero_MessagePack_h
165 #include <arpa/inet.h>
189 #define ZAKERO_DISABLE_IMPLICIT_CASTS(func_name_) \
190 template <typename... T> \
191 void func_name_(T...) = delete
209 #define ZAKERO_MESSAGEPACK__ERROR_DATA \
210 X(Error_None , 0 , "No Error" ) \
211 X(Error_Unknown , 1 , "An unknown error has occurred" ) \
246 std::string
string = {};
247 std::vector<uint8_t> vector = {};
252 Object(const
bool) noexcept;
253 Object(const int64_t) noexcept;
254 Object(const uint64_t) noexcept;
255 Object(const
float) noexcept;
256 Object(const
double) noexcept;
257 Object(const std::string_view) noexcept;
258 Object(std::vector<uint8_t>) noexcept;
261 MessagePack() = default;
263 void append(const
bool,
size_t* const =
nullptr) noexcept;
264 void append(const int64_t,
size_t* const =
nullptr) noexcept;
265 void append(const uint64_t,
size_t* const =
nullptr) noexcept;
266 void append(const
float,
size_t* =
nullptr) noexcept;
267 void append(const
double,
size_t* =
nullptr) noexcept;
268 void append(const std::string_view,
size_t* =
nullptr) noexcept;
269 void append(const std::vector<uint8_t>&,
size_t* =
nullptr) noexcept;
270 void append(uint8_t*,
size_t,
size_t* =
nullptr);
275 void appendNull(
size_t* const =
nullptr) noexcept;
278 [[nodiscard]]
Object&
object(const
size_t index) noexcept;
280 void clear() noexcept;
281 [[nodiscard]]
size_t size() noexcept;
283 void deserialize(const std::vector<uint8_t>&) noexcept;
285 [[nodiscard]] std::vector<uint8_t>
serialize() noexcept;
288 using VectorObject = std::vector<
Object>;
290 VectorObject object_vector = {};
298 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION
303 #ifdef ZAKERO__DOXYGEN_DEFINE_DOCS
318 #define ZAKERO_MESSAGEPACK_IMPLEMENTATION
335 #define ZAKERO_MESSAGEPACK__FORMAT_DATA \
337 X(Fixed_Int_Pos , 0x00 , 0b10000000 , "positive fixint" ) \
338 X(fixmap , 0x80 , 0b00000000 , "fixmap" ) \
339 X(fixarray , 0x90 , 0b00000000 , "fixarray" ) \
340 X(Fixed_Str , 0xa0 , 0b11100000 , "fixstr" ) \
341 X(Nill , 0xc0 , 0b00000000 , "nill" ) \
342 X(never_used , 0xc1 , 0b00000000 , "(never used)" ) \
343 X(False , 0xc2 , 0b00000000 , "false" ) \
344 X(True , 0xc3 , 0b00000000 , "true" ) \
345 X(Bin8 , 0xc4 , 0b11111111 , "bin 8" ) \
346 X(Bin16 , 0xc5 , 0b11111111 , "bin 16" ) \
347 X(Bin32 , 0xc6 , 0b11111111 , "bin 32" ) \
348 X(ext8 , 0xc7 , 0b00000000 , "ext 8" ) \
349 X(ext16 , 0xc8 , 0b00000000 , "ext 16" ) \
350 X(ext32 , 0xc9 , 0b00000000 , "ext 32" ) \
351 X(Float32 , 0xca , 0b11111111 , "float 32" ) \
352 X(Float64 , 0xcb , 0b11111111 , "float 64" ) \
353 X(Uint8 , 0xcc , 0b11111111 , "uint 8" ) \
354 X(Uint16 , 0xcd , 0b11111111 , "uint 16" ) \
355 X(Uint32 , 0xce , 0b11111111 , "uint 32" ) \
356 X(Uint64 , 0xcf , 0b11111111 , "uint 64" ) \
357 X(Int8 , 0xd0 , 0b11111111 , "int 8" ) \
358 X(Int16 , 0xd1 , 0b11111111 , "int 16" ) \
359 X(Int32 , 0xd2 , 0b11111111 , "int 32" ) \
360 X(Int64 , 0xd3 , 0b11111111 , "int 64" ) \
361 X(fixext1 , 0xd4 , 0b00000000 , "fixext 1" ) \
362 X(fixext2 , 0xd5 , 0b00000000 , "fixext 2" ) \
363 X(fixext4 , 0xd6 , 0b00000000 , "fixext 4" ) \
364 X(fixext8 , 0xd7 , 0b00000000 , "fixext 8" ) \
365 X(fixext16 , 0xd8 , 0b00000000 , "fixext 16" ) \
366 X(Str8 , 0xd9 , 0b00000000 , "str 8" ) \
367 X(Str16 , 0xda , 0b00000000 , "str 16" ) \
368 X(Str32 , 0xdb , 0b00000000 , "str 32" ) \
369 X(array16 , 0xdc , 0b00000000 , "array 16" ) \
370 X(array32 , 0xdd , 0b00000000 , "array 32" ) \
371 X(map16 , 0xde , 0b00000000 , "map 16" ) \
372 X(map32 , 0xdf , 0b00000000 , "map 32" ) \
373 X(Fixed_Int_Neg , 0xe0 , 0b11100000 , "negative fixint" ) \
413 enum class Type : uint8_t
418 #define X(type_, id_, mask_, text_) \
421 ZAKERO_MESSAGEPACK__FORMAT_DATA
429 #define X(type_, id_, mask_, text_) \
430 constexpr uint8_t type_ ## _Mask = mask_; \
432 ZAKERO_MESSAGEPACK__FORMAT_DATA
442 #define X(type_, id_, mask_, text_) \
443 constexpr uint8_t type_ ## _Value = (uint8_t)~mask_;\
445 ZAKERO_MESSAGEPACK__FORMAT_DATA
471 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
472 uint8_t& Convert_Byte0 = Convert.uint8[7];
473 uint8_t& Convert_Byte1 = Convert.uint8[6];
474 uint8_t& Convert_Byte2 = Convert.uint8[5];
475 uint8_t& Convert_Byte3 = Convert.uint8[4];
476 uint8_t& Convert_Byte4 = Convert.uint8[3];
477 uint8_t& Convert_Byte5 = Convert.uint8[2];
478 uint8_t& Convert_Byte6 = Convert.uint8[1];
479 uint8_t& Convert_Byte7 = Convert.uint8[0];
480 #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
481 uint8_t& Convert_Byte0 = Convert.uint8[0];
482 uint8_t& Convert_Byte1 = Convert.uint8[1];
483 uint8_t& Convert_Byte2 = Convert.uint8[2];
484 uint8_t& Convert_Byte3 = Convert.uint8[3];
485 uint8_t& Convert_Byte4 = Convert.uint8[4];
486 uint8_t& Convert_Byte5 = Convert.uint8[5];
487 uint8_t& Convert_Byte6 = Convert.uint8[6];
488 uint8_t& Convert_Byte7 = Convert.uint8[7];
512 ,
size_t*
const index
517 *index = object_vector.size();
520 object_vector.emplace_back(value);
524 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
525 TEST_CASE(
"Append: Bool")
530 mesg_pack.
append(
true, &index);
533 CHECK(mesg_pack.
size() == 1);
535 mesg_pack.
append(
false, &index);
538 CHECK(mesg_pack.
size() == 2);
542 std::vector<uint8_t> data = mesg_pack.
serialize();
544 CHECK(data.size() == 2);
545 CHECK(data[0] == (uint8_t)Type::True);
546 CHECK(data[1] == (uint8_t)Type::False);
551 CHECK(mesg_pack.
size() == 2);
554 const MessagePack::Object&
object = mesg_pack.
object(0);
555 CHECK(
object.type == MessagePack::DataType::Bool);
556 CHECK(
object.bool_ ==
true);
560 const MessagePack::Object&
object = mesg_pack.
object(1);
561 CHECK(
object.type == MessagePack::DataType::Bool);
562 CHECK(
object.bool_ ==
false);
582 ,
size_t*
const index
587 *index = object_vector.size();
590 object_vector.emplace_back(value);
594 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
595 TEST_CASE(
"Append: Fixed_Int")
599 const int64_t fixint_zero = 0;
600 const int64_t fixint_max = 127;
601 const int64_t fixint_min = -32;
602 const int64_t fixint_p24 = 24;
603 const int64_t fixint_n24 = -24;
606 mesg_pack.
append(fixint_zero); count++;
607 mesg_pack.
append(fixint_max); count++;
608 mesg_pack.
append(fixint_min); count++;
609 mesg_pack.
append(fixint_p24); count++;
610 mesg_pack.
append(fixint_n24); count++;
612 CHECK(mesg_pack.
size() == count);
616 std::vector<uint8_t> data = mesg_pack.
serialize();
618 size_t size = (count *
sizeof(uint8_t));
620 CHECK(data.size() == size);
621 CHECK((data[0] & Fixed_Int_Pos_Mask) == ((uint8_t)Type::Fixed_Int_Pos));
622 CHECK((data[0] & Fixed_Int_Pos_Value) == fixint_zero);
623 CHECK((data[1] & Fixed_Int_Pos_Mask) == ((uint8_t)Type::Fixed_Int_Pos));
624 CHECK((data[1] & Fixed_Int_Pos_Value) == fixint_max);
625 CHECK((data[2] & Fixed_Int_Neg_Mask) == ((uint8_t)Type::Fixed_Int_Neg));
626 CHECK(((data[2] & Fixed_Int_Neg_Value) - 32) == fixint_min);
627 CHECK((data[3] & Fixed_Int_Pos_Mask) == ((uint8_t)Type::Fixed_Int_Pos));
628 CHECK((data[3] & Fixed_Int_Pos_Value) == fixint_p24);
629 CHECK((data[4] & Fixed_Int_Neg_Mask) == ((uint8_t)Type::Fixed_Int_Neg));
630 CHECK(((data[4] & Fixed_Int_Neg_Value) - 32) == fixint_n24);
635 CHECK(mesg_pack.
size() == count);
638 const MessagePack::Object&
object = mesg_pack.
object(0);
639 CHECK(
object.type == MessagePack::DataType::Int64);
640 CHECK(
object.int64_ == fixint_zero);
644 const MessagePack::Object&
object = mesg_pack.
object(1);
645 CHECK(
object.type == MessagePack::DataType::Int64);
646 CHECK(
object.int64_ == fixint_max);
650 const MessagePack::Object&
object = mesg_pack.
object(2);
651 CHECK(
object.type == MessagePack::DataType::Int64);
652 CHECK(
object.int64_ == fixint_min);
656 const MessagePack::Object&
object = mesg_pack.
object(3);
657 CHECK(
object.type == MessagePack::DataType::Int64);
658 CHECK(
object.int64_ == fixint_p24);
662 const MessagePack::Object&
object = mesg_pack.
object(4);
663 CHECK(
object.type == MessagePack::DataType::Int64);
664 CHECK(
object.int64_ == fixint_n24);
668 TEST_CASE(
"Append: Int8")
670 MessagePack mesg_pack;
675 const int64_t i8_min1 = std::numeric_limits<int8_t>::min();
676 const int64_t i8_min2 = -33;
679 mesg_pack.append(i8_min1); count++;
680 mesg_pack.append(i8_min2); count++;
682 CHECK(mesg_pack.size() == count);
686 std::vector<uint8_t> data = mesg_pack.serialize();
688 size_t size = (count * 2 *
sizeof(uint8_t));
689 CHECK(data.size() == size);
691 CHECK(data[0] == ((uint8_t)Type::Int8));
692 CHECK((int8_t)data[1] == i8_min1);
693 CHECK(data[2] == ((uint8_t)Type::Int8));
694 CHECK((int8_t)data[3] == i8_min2);
698 mesg_pack.deserialize(data);
700 CHECK(mesg_pack.size() == count);
703 const MessagePack::Object&
object = mesg_pack.object(0);
704 CHECK(
object.type == MessagePack::DataType::Int64);
705 CHECK(
object.int64_ == i8_min1);
709 const MessagePack::Object&
object = mesg_pack.object(1);
710 CHECK(
object.type == MessagePack::DataType::Int64);
711 CHECK(
object.int64_ == i8_min2);
715 TEST_CASE(
"Append: Int16")
717 MessagePack mesg_pack;
719 const int64_t i16_min1 = std::numeric_limits<int16_t>::min();
720 const int64_t i16_max1 = std::numeric_limits<int16_t>::max();
721 const int64_t i16_min2 = std::numeric_limits<int8_t>::min() - (int64_t)1;
722 const int64_t i16_max2 = std::numeric_limits<int8_t>::max() + (int64_t)1;
726 mesg_pack.append(i16_min1); count++;
727 mesg_pack.append(i16_max1); count++;
728 mesg_pack.append(i16_min2); count++;
729 mesg_pack.append(i16_max2); count++;
731 CHECK(mesg_pack.size() == count);
735 std::vector<uint8_t> data = mesg_pack.serialize();
737 size_t size = (count * 3 *
sizeof(uint8_t));
738 CHECK(data.size() == size);
740 CHECK(data[0] == ((uint8_t)Type::Int16));
743 Convert_Byte1 = data[1];
744 Convert_Byte0 = data[2];
745 CHECK(Convert.int16 == i16_min1);
747 CHECK(data[3] == ((uint8_t)Type::Int16));
748 Convert_Byte1 = data[4];
749 Convert_Byte0 = data[5];
750 CHECK(Convert.int16 == i16_max1);
752 CHECK(data[6] == ((uint8_t)Type::Int16));
753 Convert_Byte1 = data[7];
754 Convert_Byte0 = data[8];
755 CHECK(Convert.int16 == i16_min2);
757 CHECK(data[9] == ((uint8_t)Type::Int16));
758 Convert_Byte1 = data[10];
759 Convert_Byte0 = data[11];
760 CHECK(Convert.int16 == i16_max2);
764 mesg_pack.deserialize(data);
766 CHECK(mesg_pack.size() == count);
769 const MessagePack::Object&
object = mesg_pack.object(0);
770 CHECK(
object.type == MessagePack::DataType::Int64);
771 CHECK(
object.int64_ == i16_min1);
775 const MessagePack::Object&
object = mesg_pack.object(1);
776 CHECK(
object.type == MessagePack::DataType::Int64);
777 CHECK(
object.int64_ == i16_max1);
781 const MessagePack::Object&
object = mesg_pack.object(2);
782 CHECK(
object.type == MessagePack::DataType::Int64);
783 CHECK(
object.int64_ == i16_min2);
787 const MessagePack::Object&
object = mesg_pack.object(3);
788 CHECK(
object.type == MessagePack::DataType::Int64);
789 CHECK(
object.int64_ == i16_max2);
793 TEST_CASE(
"Append: Int32")
795 MessagePack mesg_pack;
797 const int64_t i32_min1 = std::numeric_limits<int32_t>::min();
798 const int64_t i32_max1 = std::numeric_limits<int32_t>::max();
799 const int64_t i32_min2 = std::numeric_limits<int16_t>::min() - (int64_t)1;
800 const int64_t i32_max2 = std::numeric_limits<int16_t>::max() + (int64_t)1;
804 mesg_pack.append(i32_min1); count++;
805 mesg_pack.append(i32_max1); count++;
806 mesg_pack.append(i32_min2); count++;
807 mesg_pack.append(i32_max2); count++;
809 CHECK(mesg_pack.size() == count);
813 std::vector<uint8_t> data = mesg_pack.serialize();
815 size_t size = (count * 5 *
sizeof(uint8_t));
816 CHECK(data.size() == size);
818 CHECK(data[0] == ((uint8_t)Type::Int32));
821 Convert_Byte3 = data[1];
822 Convert_Byte2 = data[2];
823 Convert_Byte1 = data[3];
824 Convert_Byte0 = data[4];
825 CHECK(Convert.int32 == i32_min1);
827 CHECK(data[5] == ((uint8_t)Type::Int32));
828 Convert_Byte3 = data[6];
829 Convert_Byte2 = data[7];
830 Convert_Byte1 = data[8];
831 Convert_Byte0 = data[9];
832 CHECK(Convert.int32 == i32_max1);
834 CHECK(data[10] == ((uint8_t)Type::Int32));
835 Convert_Byte3 = data[11];
836 Convert_Byte2 = data[12];
837 Convert_Byte1 = data[13];
838 Convert_Byte0 = data[14];
839 CHECK(Convert.int32 == i32_min2);
841 CHECK(data[15] == ((uint8_t)Type::Int32));
842 Convert_Byte3 = data[16];
843 Convert_Byte2 = data[17];
844 Convert_Byte1 = data[18];
845 Convert_Byte0 = data[19];
846 CHECK(Convert.int32 == i32_max2);
850 mesg_pack.deserialize(data);
852 CHECK(mesg_pack.size() == count);
855 const MessagePack::Object&
object = mesg_pack.object(0);
856 CHECK(
object.type == MessagePack::DataType::Int64);
857 CHECK(
object.int64_ == i32_min1);
861 const MessagePack::Object&
object = mesg_pack.object(1);
862 CHECK(
object.type == MessagePack::DataType::Int64);
863 CHECK(
object.int64_ == i32_max1);
867 const MessagePack::Object&
object = mesg_pack.object(2);
868 CHECK(
object.type == MessagePack::DataType::Int64);
869 CHECK(
object.int64_ == i32_min2);
873 const MessagePack::Object&
object = mesg_pack.object(3);
874 CHECK(
object.type == MessagePack::DataType::Int64);
875 CHECK(
object.int64_ == i32_max2);
879 TEST_CASE(
"Append: Int64")
881 MessagePack mesg_pack;
883 const int64_t i64_min1 = std::numeric_limits<int64_t>::min();
884 const int64_t i64_max1 = std::numeric_limits<int64_t>::max();
885 const int64_t i64_min2 = std::numeric_limits<int32_t>::min() - (int64_t)1;
886 const int64_t i64_max2 = std::numeric_limits<int32_t>::max() + (int64_t)1;
890 mesg_pack.append(i64_min1); count++;
891 mesg_pack.append(i64_max1); count++;
892 mesg_pack.append(i64_min2); count++;
893 mesg_pack.append(i64_max2); count++;
895 CHECK(mesg_pack.size() == count);
899 std::vector<uint8_t> data = mesg_pack.serialize();
901 size_t size = (count * 9 *
sizeof(uint8_t));
902 CHECK(data.size() == size);
904 CHECK(data[0] == ((uint8_t)Type::Int64));
907 Convert_Byte7 = data[1];
908 Convert_Byte6 = data[2];
909 Convert_Byte5 = data[3];
910 Convert_Byte4 = data[4];
911 Convert_Byte3 = data[5];
912 Convert_Byte2 = data[6];
913 Convert_Byte1 = data[7];
914 Convert_Byte0 = data[8];
915 CHECK(Convert.int64 == i64_min1);
917 CHECK(data[9] == ((uint8_t)Type::Int64));
918 Convert_Byte7 = data[10];
919 Convert_Byte6 = data[11];
920 Convert_Byte5 = data[12];
921 Convert_Byte4 = data[13];
922 Convert_Byte3 = data[14];
923 Convert_Byte2 = data[15];
924 Convert_Byte1 = data[16];
925 Convert_Byte0 = data[17];
926 CHECK(Convert.int64 == i64_max1);
928 CHECK(data[18] == ((uint8_t)Type::Int64));
929 Convert_Byte7 = data[19];
930 Convert_Byte6 = data[20];
931 Convert_Byte5 = data[21];
932 Convert_Byte4 = data[22];
933 Convert_Byte3 = data[23];
934 Convert_Byte2 = data[24];
935 Convert_Byte1 = data[25];
936 Convert_Byte0 = data[26];
937 CHECK(Convert.int64 == i64_min2);
939 CHECK(data[27] == ((uint8_t)Type::Int64));
940 Convert_Byte7 = data[28];
941 Convert_Byte6 = data[29];
942 Convert_Byte5 = data[30];
943 Convert_Byte4 = data[31];
944 Convert_Byte3 = data[32];
945 Convert_Byte2 = data[33];
946 Convert_Byte1 = data[34];
947 Convert_Byte0 = data[35];
948 CHECK(Convert.int64 == i64_max2);
952 mesg_pack.deserialize(data);
954 CHECK(mesg_pack.size() == count);
957 const MessagePack::Object&
object = mesg_pack.object(0);
958 CHECK(
object.type == MessagePack::DataType::Int64);
959 CHECK(
object.int64_ == i64_min1);
963 const MessagePack::Object&
object = mesg_pack.object(1);
964 CHECK(
object.type == MessagePack::DataType::Int64);
965 CHECK(
object.int64_ == i64_max1);
970 const MessagePack::Object&
object = mesg_pack.object(2);
971 CHECK(
object.type == MessagePack::DataType::Int64);
972 CHECK(
object.int64_ == i64_min2);
976 const MessagePack::Object&
object = mesg_pack.object(3);
977 CHECK(
object.type == MessagePack::DataType::Int64);
978 CHECK(
object.int64_ == i64_max2);
998 ,
size_t*
const index
1001 if(index !=
nullptr)
1003 *index = object_vector.size();
1006 object_vector.emplace_back(value);
1010 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
1011 TEST_CASE(
"Append: Uint8")
1015 const uint64_t u8_min = 0x00;
1016 const uint64_t u8_max = std::numeric_limits<uint8_t>::max();
1019 mesg_pack.
append(u8_min); count++;
1020 mesg_pack.
append(u8_max); count++;
1022 CHECK(mesg_pack.
size() == count);
1026 std::vector<uint8_t> data = mesg_pack.
serialize();
1028 size_t size = (count * 2 *
sizeof(uint8_t));
1029 CHECK(data.size() == size);
1031 CHECK(data[0] == ((uint8_t)Type::Uint8));
1032 CHECK(data[1] == u8_min);
1033 CHECK(data[2] == ((uint8_t)Type::Uint8));
1034 CHECK(data[3] == u8_max);
1040 CHECK(mesg_pack.
size() == count);
1043 const MessagePack::Object&
object = mesg_pack.
object(0);
1044 CHECK(
object.type == MessagePack::DataType::Uint64);
1045 CHECK(
object.uint64_ == u8_min);
1049 const MessagePack::Object&
object = mesg_pack.
object(1);
1050 CHECK(
object.type == MessagePack::DataType::Uint64);
1051 CHECK(
object.uint64_ == u8_max);
1055 TEST_CASE(
"Append: Uint16")
1057 MessagePack mesg_pack;
1059 const uint64_t u16_min = std::numeric_limits<uint8_t>::max() + (uint64_t)1;
1060 const uint64_t u16_max = std::numeric_limits<uint16_t>::max();
1063 mesg_pack.append(u16_min); count++;
1064 mesg_pack.append(u16_max); count++;
1066 CHECK(mesg_pack.size() == count);
1070 std::vector<uint8_t> data = mesg_pack.serialize();
1072 size_t size = (count * 3 *
sizeof(uint8_t));
1073 CHECK(data.size() == size);
1075 CHECK(data[0] == ((uint8_t)Type::Uint16));
1077 Convert_Byte1 = data[1];
1078 Convert_Byte0 = data[2];
1079 CHECK(Convert.uint16 == u16_min);
1081 CHECK(data[3] == ((uint8_t)Type::Uint16));
1082 Convert_Byte1 = data[4];
1083 Convert_Byte0 = data[5];
1084 CHECK(Convert.uint16 == u16_max);
1088 mesg_pack.deserialize(data);
1090 CHECK(mesg_pack.size() == count);
1093 const MessagePack::Object&
object = mesg_pack.object(0);
1094 CHECK(
object.type == MessagePack::DataType::Uint64);
1095 CHECK(
object.uint64_ == u16_min);
1099 const MessagePack::Object&
object = mesg_pack.object(1);
1100 CHECK(
object.type == MessagePack::DataType::Uint64);
1101 CHECK(
object.uint64_ == u16_max);
1105 TEST_CASE(
"Append: Uint32")
1107 MessagePack mesg_pack;
1109 const uint64_t u32_min = std::numeric_limits<uint16_t>::max() + (uint64_t)1;
1110 const uint64_t u32_max = std::numeric_limits<uint32_t>::max();
1113 mesg_pack.append(u32_min); count++;
1114 mesg_pack.append(u32_max); count++;
1116 CHECK(mesg_pack.size() == count);
1120 std::vector<uint8_t> data = mesg_pack.serialize();
1122 size_t size = (count * 5 *
sizeof(uint8_t));
1123 CHECK(data.size() == size);
1125 CHECK(data[0] == ((uint8_t)Type::Uint32));
1127 Convert_Byte3 = data[1];
1128 Convert_Byte2 = data[2];
1129 Convert_Byte1 = data[3];
1130 Convert_Byte0 = data[4];
1131 CHECK(Convert.uint32 == u32_min);
1133 CHECK(data[5] == ((uint8_t)Type::Uint32));
1134 Convert_Byte3 = data[6];
1135 Convert_Byte2 = data[7];
1136 Convert_Byte1 = data[8];
1137 Convert_Byte0 = data[9];
1138 CHECK(Convert.uint32 == u32_max);
1142 mesg_pack.deserialize(data);
1144 CHECK(mesg_pack.size() == count);
1147 const MessagePack::Object&
object = mesg_pack.object(0);
1148 CHECK(
object.type == MessagePack::DataType::Uint64);
1149 CHECK(
object.uint64_ == u32_min);
1153 const MessagePack::Object&
object = mesg_pack.object(1);
1154 CHECK(
object.type == MessagePack::DataType::Uint64);
1155 CHECK(
object.uint64_ == u32_max);
1159 TEST_CASE(
"Append: Uint64")
1161 MessagePack mesg_pack;
1163 const uint64_t u64_min = std::numeric_limits<uint32_t>::max() + (uint64_t)1;
1164 const uint64_t u64_max = std::numeric_limits<uint64_t>::max();
1167 mesg_pack.append(u64_min); count++;
1168 mesg_pack.append(u64_max); count++;
1170 CHECK(mesg_pack.size() == count);
1174 std::vector<uint8_t> data = mesg_pack.serialize();
1176 size_t size = (count * 9 *
sizeof(uint8_t));
1177 CHECK(data.size() == size);
1179 CHECK(data[0] == ((uint8_t)Type::Uint64));
1181 Convert_Byte7 = data[1];
1182 Convert_Byte6 = data[2];
1183 Convert_Byte5 = data[3];
1184 Convert_Byte4 = data[4];
1185 Convert_Byte3 = data[5];
1186 Convert_Byte2 = data[6];
1187 Convert_Byte1 = data[7];
1188 Convert_Byte0 = data[8];
1189 CHECK(Convert.uint64 == u64_min);
1191 CHECK(data[9] == ((uint8_t)Type::Uint64));
1192 Convert_Byte7 = data[10];
1193 Convert_Byte6 = data[11];
1194 Convert_Byte5 = data[12];
1195 Convert_Byte4 = data[13];
1196 Convert_Byte3 = data[14];
1197 Convert_Byte2 = data[15];
1198 Convert_Byte1 = data[16];
1199 Convert_Byte0 = data[17];
1200 CHECK(Convert.uint64 == u64_max);
1204 mesg_pack.deserialize(data);
1206 CHECK(mesg_pack.size() == count);
1209 const MessagePack::Object&
object = mesg_pack.object(0);
1210 CHECK(
object.type == MessagePack::DataType::Uint64);
1211 CHECK(
object.uint64_ == u64_min);
1215 const MessagePack::Object&
object = mesg_pack.object(1);
1216 CHECK(
object.type == MessagePack::DataType::Uint64);
1217 CHECK(
object.uint64_ == u64_max);
1237 ,
size_t*
const index
1240 if(index !=
nullptr)
1242 *index = object_vector.size();
1245 object_vector.emplace_back(value);
1249 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
1250 TEST_CASE(
"Append: Float32")
1254 const float f32_min = std::numeric_limits<float>::min();
1255 const float f32_max = std::numeric_limits<float>::max();
1256 const float f32_zero = 0.0f;
1259 mesg_pack.
append(f32_min); count++;
1260 mesg_pack.
append(f32_max); count++;
1261 mesg_pack.
append(f32_zero); count++;
1263 CHECK(mesg_pack.
size() == count);
1267 std::vector<uint8_t> data = mesg_pack.
serialize();
1269 size_t size = (count * 5 *
sizeof(uint8_t));
1270 CHECK(data.size() == size);
1272 CHECK(data[0] == ((uint8_t)Type::Float32));
1273 Convert_Byte3 = data[1];
1274 Convert_Byte2 = data[2];
1275 Convert_Byte1 = data[3];
1276 Convert_Byte0 = data[4];
1277 CHECK(Convert.float32 == f32_min);
1279 CHECK(data[5] == ((uint8_t)Type::Float32));
1280 Convert_Byte3 = data[6];
1281 Convert_Byte2 = data[7];
1282 Convert_Byte1 = data[8];
1283 Convert_Byte0 = data[9];
1284 CHECK(Convert.float32 == f32_max);
1286 CHECK(data[10] == ((uint8_t)Type::Float32));
1287 Convert_Byte3 = data[11];
1288 Convert_Byte2 = data[12];
1289 Convert_Byte1 = data[13];
1290 Convert_Byte0 = data[14];
1291 CHECK(Convert.float32 == f32_zero);
1297 CHECK(mesg_pack.
size() == count);
1300 const MessagePack::Object&
object = mesg_pack.
object(0);
1301 CHECK(
object.type == MessagePack::DataType::Float);
1302 CHECK(
object.float_ == f32_min);
1306 const MessagePack::Object&
object = mesg_pack.
object(1);
1307 CHECK(
object.type == MessagePack::DataType::Float);
1308 CHECK(
object.float_ == f32_max);
1312 const MessagePack::Object&
object = mesg_pack.
object(2);
1313 CHECK(
object.type == MessagePack::DataType::Float);
1314 CHECK(
object.float_ == f32_zero);
1334 ,
size_t*
const index
1337 if(index !=
nullptr)
1339 *index = object_vector.size();
1342 object_vector.emplace_back(value);
1346 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
1347 TEST_CASE(
"Append: Float64")
1351 const double f64_min = std::numeric_limits<double>::min();
1352 const double f64_max = std::numeric_limits<double>::max();
1353 const double f64_zero = 0.0f;
1356 mesg_pack.
append(f64_min); count++;
1357 mesg_pack.
append(f64_max); count++;
1358 mesg_pack.
append(f64_zero); count++;
1360 CHECK(mesg_pack.
size() == count);
1364 std::vector<uint8_t> data = mesg_pack.
serialize();
1366 size_t size = (count * 9 *
sizeof(uint8_t));
1367 CHECK(data.size() == size);
1369 CHECK(data[0] == ((uint8_t)Type::Float64));
1370 Convert_Byte7 = data[1];
1371 Convert_Byte6 = data[2];
1372 Convert_Byte5 = data[3];
1373 Convert_Byte4 = data[4];
1374 Convert_Byte3 = data[5];
1375 Convert_Byte2 = data[6];
1376 Convert_Byte1 = data[7];
1377 Convert_Byte0 = data[8];
1378 CHECK(Convert.float64 == f64_min);
1380 CHECK(data[9] == ((uint8_t)Type::Float64));
1381 Convert_Byte7 = data[10];
1382 Convert_Byte6 = data[11];
1383 Convert_Byte5 = data[12];
1384 Convert_Byte4 = data[13];
1385 Convert_Byte3 = data[14];
1386 Convert_Byte2 = data[15];
1387 Convert_Byte1 = data[16];
1388 Convert_Byte0 = data[17];
1389 CHECK(Convert.float64 == f64_max);
1391 CHECK(data[18] == ((uint8_t)Type::Float64));
1392 Convert_Byte7 = data[19];
1393 Convert_Byte6 = data[20];
1394 Convert_Byte5 = data[21];
1395 Convert_Byte4 = data[22];
1396 Convert_Byte3 = data[23];
1397 Convert_Byte2 = data[24];
1398 Convert_Byte1 = data[25];
1399 Convert_Byte0 = data[26];
1400 CHECK(Convert.float64 == f64_zero);
1406 CHECK(mesg_pack.
size() == count);
1409 const MessagePack::Object&
object = mesg_pack.
object(0);
1410 CHECK(
object.type == MessagePack::DataType::Double);
1411 CHECK(
object.double_ == f64_min);
1415 const MessagePack::Object&
object = mesg_pack.
object(1);
1416 CHECK(
object.type == MessagePack::DataType::Double);
1417 CHECK(
object.double_ == f64_max);
1421 const MessagePack::Object&
object = mesg_pack.
object(2);
1422 CHECK(
object.type == MessagePack::DataType::Double);
1423 CHECK(
object.double_ == f64_zero);
1443 ,
size_t*
const index
1446 if(index !=
nullptr)
1448 *index = object_vector.size();
1451 object_vector.emplace_back(value);
1455 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
1456 TEST_CASE(
"Append: Fixed_Str")
1460 const std::string str_empty;
1461 const std::string str_1(
"_");
1462 const std::string str_31(31,
'a');
1465 mesg_pack.
append(str_empty); count++;
1466 mesg_pack.
append(str_1); count++;
1467 mesg_pack.
append(str_31); count++;
1469 CHECK(mesg_pack.
size() == count);
1473 std::vector<uint8_t> data = mesg_pack.
serialize();
1475 size_t size = (count * 1 *
sizeof(uint8_t))
1480 CHECK(data.size() == size);
1484 std::string_view str;
1486 CHECK((data[0] & Fixed_Str_Mask) == ((uint8_t)Type::Fixed_Str));
1487 str_len = data[0] & Fixed_Str_Value;
1488 CHECK(str_len == str_empty.size());
1489 index += str_len + 1;
1491 CHECK((data[index] & Fixed_Str_Mask) == ((uint8_t)Type::Fixed_Str));
1492 str_len = data[index] & Fixed_Str_Value;
1493 CHECK(str_len == str_1.size());
1495 str = std::string_view((
char*)&data[index], str_len);
1496 CHECK(str == str_1);
1499 CHECK((data[index] & Fixed_Str_Mask) == ((uint8_t)Type::Fixed_Str));
1500 str_len = data[index] & Fixed_Str_Value;
1501 CHECK(str_len == str_31.size());
1503 str = std::string_view((
char*)&data[index], str_len);
1504 CHECK(str == str_31);
1510 CHECK(mesg_pack.
size() == count);
1513 const MessagePack::Object&
object = mesg_pack.
object(0);
1514 CHECK(
object.type == MessagePack::DataType::String);
1515 CHECK(
object.
string == str_empty);
1519 const MessagePack::Object&
object = mesg_pack.
object(1);
1520 CHECK(
object.type == MessagePack::DataType::String);
1521 CHECK(
object.
string == str_1);
1525 const MessagePack::Object&
object = mesg_pack.
object(2);
1526 CHECK(
object.type == MessagePack::DataType::String);
1527 CHECK(
object.
string == str_31);
1531 TEST_CASE(
"Append: Str8")
1533 MessagePack mesg_pack;
1535 const std::string str_min(32 ,
'_');
1536 const std::string str_max(std::numeric_limits<uint8_t>::max(),
'X');
1539 mesg_pack.append(str_min); count++;
1540 mesg_pack.append(str_max); count++;
1542 CHECK(mesg_pack.size() == count);
1546 std::vector<uint8_t> data = mesg_pack.serialize();
1548 size_t size = (count * 2 *
sizeof(uint8_t))
1552 CHECK(data.size() == size);
1556 std::string_view str;
1558 CHECK(data[index] == ((uint8_t)Type::Str8));
1559 str_len = data[++index];
1560 CHECK(str_len == str_min.size());
1561 str = std::string_view((
char*)&data[++index], str_len);
1562 CHECK(str == str_min);
1565 CHECK(data[index] == ((uint8_t)Type::Str8));
1566 str_len = data[++index];
1567 CHECK(str_len == str_max.size());
1568 str = std::string_view((
char*)&data[++index], str_len);
1569 CHECK(str == str_max);
1574 mesg_pack.deserialize(data);
1576 CHECK(mesg_pack.size() == count);
1579 const MessagePack::Object&
object = mesg_pack.object(0);
1580 CHECK(
object.type == MessagePack::DataType::String);
1581 CHECK(
object.
string == str_min);
1585 const MessagePack::Object&
object = mesg_pack.object(1);
1586 CHECK(
object.type == MessagePack::DataType::String);
1587 CHECK(
object.
string == str_max);
1591 TEST_CASE(
"Append: Str16")
1593 MessagePack mesg_pack;
1595 const std::string str_min(std::numeric_limits<uint8_t>::max() + 1,
'_');
1596 const std::string str_max(std::numeric_limits<uint16_t>::max() ,
'X');
1599 mesg_pack.append(str_min); count++;
1600 mesg_pack.append(str_max); count++;
1602 CHECK(mesg_pack.size() == count);
1606 std::vector<uint8_t> data = mesg_pack.serialize();
1608 size_t size = (count * 3 *
sizeof(uint8_t))
1612 CHECK(data.size() == size);
1616 std::string_view str;
1618 CHECK(data[index] == ((uint8_t)Type::Str16));
1619 Convert_Byte1 = data[++index];
1620 Convert_Byte0 = data[++index];
1621 str_len = Convert.uint16;
1622 CHECK(str_len == str_min.size());
1623 str = std::string_view((
char*)&data[++index], str_len);
1624 CHECK(str == str_min);
1627 CHECK(data[index] == ((uint8_t)Type::Str16));
1628 Convert_Byte1 = data[++index];
1629 Convert_Byte0 = data[++index];
1630 str_len = Convert.uint16;
1631 CHECK(str_len == str_max.size());
1632 str = std::string_view((
char*)&data[++index], str_len);
1633 CHECK(str == str_max);
1638 mesg_pack.deserialize(data);
1640 CHECK(mesg_pack.size() == count);
1643 const MessagePack::Object&
object = mesg_pack.object(0);
1644 CHECK(
object.type == MessagePack::DataType::String);
1645 CHECK(
object.
string == str_min);
1649 const MessagePack::Object&
object = mesg_pack.object(1);
1650 CHECK(
object.type == MessagePack::DataType::String);
1651 CHECK(
object.
string == str_max);
1655 TEST_CASE(
"Append: Str32")
1657 MessagePack mesg_pack;
1659 const std::string str_min(std::numeric_limits<uint16_t>::max() + 1,
'_');
1666 mesg_pack.append(str_min); count++;
1669 CHECK(mesg_pack.size() == count);
1673 std::vector<uint8_t> data = mesg_pack.serialize();
1675 size_t size = (count * 5 *
sizeof(uint8_t))
1679 CHECK(data.size() == size);
1683 std::string_view str;
1685 CHECK(data[index] == ((uint8_t)Type::Str32));
1686 Convert_Byte3 = data[++index];
1687 Convert_Byte2 = data[++index];
1688 Convert_Byte1 = data[++index];
1689 Convert_Byte0 = data[++index];
1690 str_len = Convert.uint32;
1691 CHECK(str_len == str_min.size());
1692 str = std::string_view((
char*)&data[++index], str_len);
1693 CHECK(str == str_min);
1707 mesg_pack.deserialize(data);
1709 CHECK(mesg_pack.size() == count);
1712 const MessagePack::Object&
object = mesg_pack.object(0);
1713 CHECK(
object.type == MessagePack::DataType::String);
1714 CHECK(
object.
string == str_min);
1741 ,
size_t*
const index
1744 if(index !=
nullptr)
1746 *index = object_vector.size();
1749 object_vector.emplace_back(value);
1753 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
1754 TEST_CASE(
"Append: Bin8")
1758 const std::vector<uint8_t> bin_min = {};
1759 const std::vector<uint8_t> bin_max(std::numeric_limits<uint8_t>::max(),
'X');
1762 mesg_pack.
append(bin_min); count++;
1763 mesg_pack.
append(bin_max); count++;
1765 CHECK(mesg_pack.
size() == count);
1769 std::vector<uint8_t> data = mesg_pack.
serialize();
1771 size_t size = (count * 2 *
sizeof(uint8_t))
1775 CHECK(data.size() == size);
1780 CHECK(data[index] == ((uint8_t)Type::Bin8));
1781 bin_len = data[++index];
1782 CHECK(bin_len == bin_min.size());
1783 for(
size_t i = 0; i < bin_len; i++)
1785 CHECK(data[++index] == bin_min[i]);
1788 CHECK(data[++index] == ((uint8_t)Type::Bin8));
1789 bin_len = data[++index];
1790 CHECK(bin_len == bin_max.size());
1791 for(
size_t i = 0; i < bin_len; i++)
1793 CHECK(data[++index] == bin_max[i]);
1800 CHECK(mesg_pack.
size() == count);
1803 const MessagePack::Object&
object = mesg_pack.
object(0);
1804 CHECK(
object.type == MessagePack::DataType::Vector);
1805 CHECK(
object.vector.size() == bin_min.size());
1806 for(
size_t i = 0; i < bin_min.size(); i++)
1808 CHECK(
object.vector[i] == bin_min[i]);
1813 const MessagePack::Object&
object = mesg_pack.
object(1);
1814 CHECK(
object.type == MessagePack::DataType::Vector);
1815 CHECK(
object.vector.size() == bin_max.size());
1816 for(
size_t i = 0; i < bin_max.size(); i++)
1818 CHECK(
object.vector[i] == bin_max[i]);
1823 TEST_CASE(
"Append: Bin16")
1825 MessagePack mesg_pack;
1827 const std::vector<uint8_t> bin_min(std::numeric_limits<uint8_t>::max() + 1,
'_');
1828 const std::vector<uint8_t> bin_max(std::numeric_limits<uint16_t>::max() ,
'X');
1831 mesg_pack.append(bin_min); count++;
1832 mesg_pack.append(bin_max); count++;
1834 CHECK(mesg_pack.size() == count);
1838 std::vector<uint8_t> data = mesg_pack.serialize();
1840 size_t size = (count * 3 *
sizeof(uint8_t))
1844 CHECK(data.size() == size);
1849 CHECK(data[index] == (uint8_t)Type::Bin16);
1850 Convert_Byte1 = data[++index];
1851 Convert_Byte0 = data[++index];
1852 bin_len = Convert.uint16;
1853 CHECK(bin_len == bin_min.size());
1854 for(
size_t i = 0; i < bin_len; i++)
1856 CHECK(data[++index] == bin_min[i]);
1859 CHECK(data[++index] == ((uint8_t)Type::Bin16));
1860 Convert_Byte1 = data[++index];
1861 Convert_Byte0 = data[++index];
1862 bin_len = Convert.uint16;
1863 CHECK(bin_len == bin_max.size());
1864 for(
size_t i = 0; i < bin_len; i++)
1866 CHECK(data[++index] == bin_max[i]);
1871 mesg_pack.deserialize(data);
1873 CHECK(mesg_pack.size() == count);
1876 const MessagePack::Object&
object = mesg_pack.object(0);
1877 CHECK(
object.type == MessagePack::DataType::Vector);
1878 CHECK(
object.vector.size() == bin_min.size());
1879 for(
size_t i = 0; i < bin_min.size(); i++)
1881 CHECK(
object.vector[i] == bin_min[i]);
1886 const MessagePack::Object&
object = mesg_pack.object(1);
1887 CHECK(
object.type == MessagePack::DataType::Vector);
1888 CHECK(
object.vector.size() == bin_max.size());
1889 for(
size_t i = 0; i < bin_max.size(); i++)
1891 CHECK(
object.vector[i] == bin_max[i]);
1896 TEST_CASE(
"Append: Bin32")
1898 MessagePack mesg_pack;
1900 const std::vector<uint8_t> bin_min(std::numeric_limits<uint16_t>::max() + 1,
'_');
1907 mesg_pack.append(bin_min); count++;
1910 CHECK(mesg_pack.size() == count);
1914 std::vector<uint8_t> data = mesg_pack.serialize();
1916 size_t size = (count * 5 *
sizeof(uint8_t))
1920 CHECK(data.size() == size);
1925 CHECK(data[index] == (uint8_t)Type::Bin32);
1926 Convert_Byte3 = data[++index];
1927 Convert_Byte2 = data[++index];
1928 Convert_Byte1 = data[++index];
1929 Convert_Byte0 = data[++index];
1930 bin_len = Convert.uint32;
1931 CHECK(bin_len == bin_min.size());
1932 for(
size_t i = 0; i < bin_len; i++)
1934 CHECK(data[++index] == bin_min[i]);
1951 mesg_pack.deserialize(data);
1953 CHECK(mesg_pack.size() == count);
1956 const MessagePack::Object&
object = mesg_pack.object(0);
1957 CHECK(
object.type == MessagePack::DataType::Vector);
1958 CHECK(
object.vector.size() == bin_min.size());
1959 for(
size_t i = 0; i < bin_min.size(); i++)
1961 CHECK(
object.vector[i] == bin_min[i]);
1994 if(index !=
nullptr)
1996 *index = object_vector.size();
1999 object_vector.emplace_back();
2002 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
2003 TEST_CASE(
"Append: Nill")
2011 CHECK(mesg_pack.
size() == 1);
2016 CHECK(mesg_pack.
size() == 2);
2020 std::vector<uint8_t> data = mesg_pack.
serialize();
2022 CHECK(data.size() == 2);
2023 CHECK(data[0] == (uint8_t)Type::Nill);
2024 CHECK(data[1] == (uint8_t)Type::Nill);
2029 CHECK(mesg_pack.
size() == 2);
2032 const MessagePack::Object&
object = mesg_pack.
object(0);
2033 CHECK(
object.type == MessagePack::DataType::Null);
2034 CHECK(
object.int64_ == 0);
2038 const MessagePack::Object&
object = mesg_pack.
object(1);
2039 CHECK(
object.type == MessagePack::DataType::Null);
2040 CHECK(
object.int64_ == 0);
2084 return object_vector[index];
2093 object_vector.clear();
2109 return object_vector.size();
2113 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
2151 object_vector.clear();
2153 for(
size_t index = 0; index < data.size(); index++)
2155 uint8_t
byte = data[index];
2157 if(
byte == (uint8_t)Type::Nill)
2161 else if(
byte == (uint8_t)Type::False)
2165 else if(
byte == (uint8_t)Type::True)
2169 else if((
byte & (uint8_t)Fixed_Int_Pos_Mask) == (uint8_t)Type::Fixed_Int_Pos)
2171 int64_t value =
byte & (uint8_t)Fixed_Int_Pos_Value;
2174 else if((
byte & (uint8_t)Fixed_Int_Neg_Mask) == (uint8_t)Type::Fixed_Int_Neg)
2176 int64_t value = (int8_t)(
byte & Fixed_Int_Neg_Value) - 32;
2179 else if(
byte == (uint8_t)Type::Int8)
2181 int64_t value = (int8_t)data[++index];
2184 else if(
byte == (uint8_t)Type::Int16)
2186 Convert_Byte1 = data[++index];
2187 Convert_Byte0 = data[++index];
2189 int64_t value = Convert.int16;
2192 else if(
byte == (uint8_t)Type::Int32)
2194 Convert_Byte3 = data[++index];
2195 Convert_Byte2 = data[++index];
2196 Convert_Byte1 = data[++index];
2197 Convert_Byte0 = data[++index];
2199 int64_t value = Convert.int32;
2202 else if(
byte == (uint8_t)Type::Int64)
2204 Convert_Byte7 = data[++index];
2205 Convert_Byte6 = data[++index];
2206 Convert_Byte5 = data[++index];
2207 Convert_Byte4 = data[++index];
2208 Convert_Byte3 = data[++index];
2209 Convert_Byte2 = data[++index];
2210 Convert_Byte1 = data[++index];
2211 Convert_Byte0 = data[++index];
2213 int64_t value = Convert.int64;
2216 else if(
byte == (uint8_t)Type::Uint8)
2218 uint64_t value = data[++index];
2221 else if(
byte == (uint8_t)Type::Uint16)
2223 Convert_Byte1 = data[++index];
2224 Convert_Byte0 = data[++index];
2226 uint64_t value = Convert.uint16;
2229 else if(
byte == (uint8_t)Type::Uint32)
2231 Convert_Byte3 = data[++index];
2232 Convert_Byte2 = data[++index];
2233 Convert_Byte1 = data[++index];
2234 Convert_Byte0 = data[++index];
2236 uint64_t value = Convert.uint32;
2239 else if(
byte == (uint8_t)Type::Uint64)
2241 Convert_Byte7 = data[++index];
2242 Convert_Byte6 = data[++index];
2243 Convert_Byte5 = data[++index];
2244 Convert_Byte4 = data[++index];
2245 Convert_Byte3 = data[++index];
2246 Convert_Byte2 = data[++index];
2247 Convert_Byte1 = data[++index];
2248 Convert_Byte0 = data[++index];
2250 uint64_t value = Convert.uint64;
2253 else if(
byte == (uint8_t)Type::Float32)
2255 Convert_Byte3 = data[++index];
2256 Convert_Byte2 = data[++index];
2257 Convert_Byte1 = data[++index];
2258 Convert_Byte0 = data[++index];
2260 float value = Convert.float32;
2263 else if(
byte == (uint8_t)Type::Float64)
2265 Convert_Byte7 = data[++index];
2266 Convert_Byte6 = data[++index];
2267 Convert_Byte5 = data[++index];
2268 Convert_Byte4 = data[++index];
2269 Convert_Byte3 = data[++index];
2270 Convert_Byte2 = data[++index];
2271 Convert_Byte1 = data[++index];
2272 Convert_Byte0 = data[++index];
2274 double value = Convert.float64;
2277 else if((
byte & (uint8_t)Fixed_Str_Mask) == (uint8_t)Type::Fixed_Str)
2279 size_t length =
byte & Fixed_Str_Value;
2283 append(std::string_view(
""));
2287 std::string_view str((
char*)&data[++index], length);
2290 index += length - 1;
2293 else if(
byte == (uint8_t)Type::Str8)
2295 size_t length = data[++index];
2297 std::string_view str((
char*)&data[++index], length);
2300 index += length - 1;
2302 else if(
byte == (uint8_t)Type::Str16)
2304 Convert_Byte1 = data[++index];
2305 Convert_Byte0 = data[++index];
2307 size_t length = Convert.uint16;
2308 std::string_view str((
char*)&data[++index], length);
2311 index += length - 1;
2313 else if(
byte == (uint8_t)Type::Str32)
2315 Convert_Byte3 = data[++index];
2316 Convert_Byte2 = data[++index];
2317 Convert_Byte1 = data[++index];
2318 Convert_Byte0 = data[++index];
2320 size_t length = Convert.uint32;
2321 std::string_view str((
char*)&data[++index], length);
2324 index += length - 1;
2326 else if(
byte == (uint8_t)Type::Bin8)
2328 size_t length = data[++index];
2330 std::vector<uint8_t> vector(length, 0);
2331 memcpy((
void*)vector.data(), (
void*)&data[++index], length);
2332 index += length - 1;
2336 else if(
byte == (uint8_t)Type::Bin16)
2338 Convert_Byte1 = data[++index];
2339 Convert_Byte0 = data[++index];
2341 size_t length = Convert.uint16;
2343 std::vector<uint8_t> vector(length, 0);
2344 memcpy((
void*)vector.data(), (
void*)&data[++index], length);
2345 index += length - 1;
2349 else if(
byte == (uint8_t)Type::Bin32)
2351 Convert_Byte3 = data[++index];
2352 Convert_Byte2 = data[++index];
2353 Convert_Byte1 = data[++index];
2354 Convert_Byte0 = data[++index];
2356 size_t length = Convert.uint32;
2358 std::vector<uint8_t> vector(length, 0);
2359 memcpy((
void*)vector.data(), (
void*)&data[++index], length);
2360 index += length - 1;
2389 std::vector<uint8_t> vector;
2391 for(
const Object&
object : object_vector)
2393 if(
object.type == DataType::Null)
2395 vector.push_back((uint8_t)Type::Nill);
2397 else if(
object.type == DataType::Bool)
2399 vector.push_back(
object.bool_
2400 ? (uint8_t)Type::True
2401 : (uint8_t)Type::False
2404 else if(
object.type == DataType::Int64)
2406 if(
object.int64_ < 0)
2408 if(
object.int64_ >= -32)
2410 vector.push_back((uint8_t)Type::Fixed_Int_Neg
2411 | (uint8_t)(
object.int64_ & Fixed_Int_Neg_Value)
2414 else if(
object.int64_ >= std::numeric_limits<int8_t>::min())
2416 vector.reserve(vector.size() + 2);
2418 vector.push_back((uint8_t)Type::Int8);
2419 vector.push_back((int8_t)
object.int64_);
2421 else if(
object.int64_ >= std::numeric_limits<int16_t>::min())
2423 vector.reserve(vector.size() + 3);
2425 vector.push_back((uint8_t)Type::Int16);
2427 Convert.int16 = (int16_t)
object.int64_;
2428 vector.push_back(Convert_Byte1);
2429 vector.push_back(Convert_Byte0);
2431 else if(
object.int64_ >= std::numeric_limits<int32_t>::min())
2433 vector.reserve(vector.size() + 5);
2435 vector.push_back((uint8_t)Type::Int32);
2437 Convert.int32 = (int32_t)
object.int64_;
2438 vector.push_back(Convert_Byte3);
2439 vector.push_back(Convert_Byte2);
2440 vector.push_back(Convert_Byte1);
2441 vector.push_back(Convert_Byte0);
2443 else if(
object.int64_ >= std::numeric_limits<int64_t>::min())
2445 vector.reserve(vector.size() + 9);
2447 vector.push_back((uint8_t)Type::Int64);
2449 Convert.int64 = (int64_t)
object.int64_;
2450 vector.push_back(Convert_Byte7);
2451 vector.push_back(Convert_Byte6);
2452 vector.push_back(Convert_Byte5);
2453 vector.push_back(Convert_Byte4);
2454 vector.push_back(Convert_Byte3);
2455 vector.push_back(Convert_Byte2);
2456 vector.push_back(Convert_Byte1);
2457 vector.push_back(Convert_Byte0);
2462 if(
object.int64_ <= std::numeric_limits<int8_t>::max())
2464 vector.push_back((int8_t)
object.int64_);
2466 else if(
object.int64_ <= std::numeric_limits<int16_t>::max())
2468 vector.reserve(vector.size() + 3);
2470 vector.push_back((uint8_t)Type::Int16);
2472 Convert.int16 = (int16_t)
object.int64_;
2473 vector.push_back(Convert_Byte1);
2474 vector.push_back(Convert_Byte0);
2476 else if(
object.int64_ <= std::numeric_limits<int32_t>::max())
2478 vector.reserve(vector.size() + 5);
2480 vector.push_back((uint8_t)Type::Int32);
2482 Convert.int32 = (int32_t)
object.int64_;
2483 vector.push_back(Convert_Byte3);
2484 vector.push_back(Convert_Byte2);
2485 vector.push_back(Convert_Byte1);
2486 vector.push_back(Convert_Byte0);
2488 else if(
object.int64_ <= std::numeric_limits<int64_t>::max())
2490 vector.reserve(vector.size() + 9);
2492 vector.push_back((uint8_t)Type::Int64);
2494 Convert.int64 = (int64_t)
object.int64_;
2495 vector.push_back(Convert_Byte7);
2496 vector.push_back(Convert_Byte6);
2497 vector.push_back(Convert_Byte5);
2498 vector.push_back(Convert_Byte4);
2499 vector.push_back(Convert_Byte3);
2500 vector.push_back(Convert_Byte2);
2501 vector.push_back(Convert_Byte1);
2502 vector.push_back(Convert_Byte0);
2506 else if(
object.type == DataType::Uint64)
2508 if(
object.uint64_ <= std::numeric_limits<uint8_t>::max())
2510 vector.reserve(vector.size() + 2);
2512 vector.push_back((uint8_t)Type::Uint8);
2513 vector.push_back((uint8_t)
object.uint64_);
2515 else if(
object.uint64_ <= std::numeric_limits<uint16_t>::max())
2517 vector.reserve(vector.size() + 3);
2519 vector.push_back((uint8_t)Type::Uint16);
2521 Convert.uint16 = (uint16_t)
object.uint64_;
2522 vector.push_back(Convert_Byte1);
2523 vector.push_back(Convert_Byte0);
2525 else if(
object.uint64_ <= std::numeric_limits<uint32_t>::max())
2527 vector.reserve(vector.size() + 5);
2529 vector.push_back((uint8_t)Type::Uint32);
2531 Convert.uint32 = (uint32_t)
object.uint64_;
2532 vector.push_back(Convert_Byte3);
2533 vector.push_back(Convert_Byte2);
2534 vector.push_back(Convert_Byte1);
2535 vector.push_back(Convert_Byte0);
2539 vector.reserve(vector.size() + 9);
2541 vector.push_back((uint8_t)Type::Uint64);
2543 Convert.uint64 =
object.uint64_;
2544 vector.push_back(Convert_Byte7);
2545 vector.push_back(Convert_Byte6);
2546 vector.push_back(Convert_Byte5);
2547 vector.push_back(Convert_Byte4);
2548 vector.push_back(Convert_Byte3);
2549 vector.push_back(Convert_Byte2);
2550 vector.push_back(Convert_Byte1);
2551 vector.push_back(Convert_Byte0);
2554 else if(
object.type == DataType::Float)
2556 vector.reserve(vector.size() + 5);
2558 vector.push_back((uint8_t)Type::Float32);
2560 Convert.float32 =
object.float_;
2561 vector.push_back(Convert_Byte3);
2562 vector.push_back(Convert_Byte2);
2563 vector.push_back(Convert_Byte1);
2564 vector.push_back(Convert_Byte0);
2566 else if(
object.type == DataType::Double)
2568 vector.reserve(vector.size() + 9);
2570 vector.push_back((uint8_t)Type::Float64);
2572 Convert.float64 =
object.double_;
2573 vector.push_back(Convert_Byte7);
2574 vector.push_back(Convert_Byte6);
2575 vector.push_back(Convert_Byte5);
2576 vector.push_back(Convert_Byte4);
2577 vector.push_back(Convert_Byte3);
2578 vector.push_back(Convert_Byte2);
2579 vector.push_back(Convert_Byte1);
2580 vector.push_back(Convert_Byte0);
2582 else if(
object.type == DataType::String)
2584 const size_t string_length =
object.string.size();
2586 if(string_length <= 31)
2588 vector.reserve(string_length + 1);
2590 vector.push_back((uint8_t)Type::Fixed_Str
2591 | (uint8_t)string_length
2594 for(
const auto& c :
object.
string)
2596 vector.push_back((uint8_t)c);
2599 else if(string_length <= std::numeric_limits<uint8_t>::max())
2601 vector.reserve(string_length + 2);
2603 vector.push_back((uint8_t)Type::Str8);
2604 vector.push_back((uint8_t)string_length);
2606 for(
const auto& c :
object.
string)
2608 vector.push_back((uint8_t)c);
2611 else if(string_length <= std::numeric_limits<uint16_t>::max())
2613 vector.reserve(string_length + 3);
2615 vector.push_back((uint8_t)Type::Str16);
2617 Convert.uint16 = (uint16_t)string_length;
2618 vector.push_back(Convert_Byte1);
2619 vector.push_back(Convert_Byte0);
2621 for(
const auto& c :
object.
string)
2623 vector.push_back((uint8_t)c);
2626 else if(string_length <= std::numeric_limits<uint32_t>::max())
2628 vector.reserve(string_length + 5);
2630 vector.push_back((uint8_t)Type::Str32);
2632 Convert.uint32 = (uint32_t)string_length;
2633 vector.push_back(Convert_Byte3);
2634 vector.push_back(Convert_Byte2);
2635 vector.push_back(Convert_Byte1);
2636 vector.push_back(Convert_Byte0);
2638 for(
const auto& c :
object.
string)
2640 vector.push_back((uint8_t)c);
2644 else if(
object.type == DataType::Vector)
2646 const size_t vector_length =
object.vector.size();
2648 if(vector_length <= std::numeric_limits<uint8_t>::max())
2650 vector.reserve(vector_length + 2);
2652 vector.push_back((uint8_t)Type::Bin8);
2653 vector.push_back((uint8_t)vector_length);
2655 vector.insert(vector.end()
2656 ,
object.vector.begin()
2657 ,
object.vector.end()
2660 else if(vector_length <= std::numeric_limits<uint16_t>::max())
2662 vector.reserve(vector_length + 3);
2664 vector.push_back((uint8_t)Type::Bin16);
2666 Convert.uint16 = (uint16_t)vector_length;
2667 vector.push_back(Convert_Byte1);
2668 vector.push_back(Convert_Byte0);
2670 vector.insert(vector.end()
2671 ,
object.vector.begin()
2672 ,
object.vector.end()
2675 else if(vector_length <= std::numeric_limits<uint32_t>::max())
2677 vector.reserve(vector_length + 5);
2679 vector.push_back((uint8_t)Type::Bin32);
2681 Convert.uint32 = (uint32_t)vector_length;
2682 vector.push_back(Convert_Byte3);
2683 vector.push_back(Convert_Byte2);
2684 vector.push_back(Convert_Byte1);
2685 vector.push_back(Convert_Byte0);
2687 vector.insert(vector.end()
2688 ,
object.vector.begin()
2689 ,
object.vector.end()
2698 #ifdef ZAKERO_MESSAGEPACK_IMPLEMENTATION_TEST
2778 MessagePack::Object::Object() noexcept
2779 : type(DataType::Null)
2788 MessagePack::Object::Object(
const Object&
object
2795 case DataType::Null:
break;
2796 case DataType::Bool: bool_ =
object.bool_;
break;
2797 case DataType::Int64: int64_ =
object.int64_;
break;
2798 case DataType::Uint64: uint64_ =
object.uint64_;
break;
2799 case DataType::Float: float_ =
object.float_;
break;
2800 case DataType::Double: double_ =
object.double_;
break;
2801 case DataType::String:
string =
object.string;
break;
2802 case DataType::Vector: vector =
object.vector;
break;
2810 MessagePack::Object::Object(
Object&&
object
2817 case DataType::Null:
break;
2818 case DataType::Bool: bool_ =
object.bool_;
break;
2819 case DataType::Int64: int64_ =
object.int64_;
break;
2820 case DataType::Uint64: uint64_ =
object.uint64_;
break;
2821 case DataType::Float: float_ =
object.float_;
break;
2822 case DataType::Double: double_ =
object.double_;
break;
2823 case DataType::String:
string =
object.string;
break;
2824 case DataType::Vector: vector =
object.vector;
break;
2827 object.type = DataType::Null;
2829 object.string.clear();
2830 object.vector.clear();
2837 MessagePack::Object::Object(
const bool value
2839 : type(DataType::Bool)
2848 MessagePack::Object::Object(
const int64_t value
2850 : type(DataType::Int64)
2859 MessagePack::Object::Object(
const uint64_t value
2861 : type(DataType::Uint64)
2870 MessagePack::Object::Object(
const float value
2872 : type(DataType::Float)
2881 MessagePack::Object::Object(
const double value
2883 : type(DataType::Double)
2892 MessagePack::Object::Object(
const std::string_view value
2894 : type(DataType::String)
2906 MessagePack::Object::Object(std::vector<uint8_t> value
2908 : type(DataType::Vector)
Object and Data Serialization.
Definition: Zakero_MessagePack.h:221
Object & object(const size_t index) noexcept
Access a data object.
Definition: Zakero_MessagePack.h:2081
void append(const bool, size_t *const =nullptr) noexcept
Append a boolean value.
Definition: Zakero_MessagePack.h:511
DataType
The supported C++ data-types.
Definition: Zakero_MessagePack.h:225
void appendNull(size_t *const =nullptr) noexcept
Append a "null" value.
Definition: Zakero_MessagePack.h:1991
size_t size() noexcept
Get the number of data objects.
Definition: Zakero_MessagePack.h:2107
std::vector< uint8_t > serialize() noexcept
Serialize MessagePack data.
Definition: Zakero_MessagePack.h:2387
void clear() noexcept
Remove all data from the MessagePack.
Definition: Zakero_MessagePack.h:2091
void deserialize(const std::vector< uint8_t > &) noexcept
Deserialize MessagePack data.
Definition: Zakero_MessagePack.h:2148