From c5db0ba7c3de16c3c4f9fc3f627c4bb8fb31164b Mon Sep 17 00:00:00 2001 From: ZezhengLi Date: Thu, 28 Dec 2023 15:16:09 +0800 Subject: [PATCH] fix 32-bits --- include/ylt/struct_pack/unpacker.hpp | 10 +++++++- .../tests/test_user_defined_type.cpp | 24 ++++++++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/include/ylt/struct_pack/unpacker.hpp b/include/ylt/struct_pack/unpacker.hpp index 1942396de..7bd346d2d 100644 --- a/include/ylt/struct_pack/unpacker.hpp +++ b/include/ylt/struct_pack/unpacker.hpp @@ -905,7 +905,15 @@ class unpacker { } } else { - static_assert("illegal branch"); + std::uint64_t sz; + if SP_UNLIKELY (!low_bytes_read_wrapper(reader_, + sz)) { + return struct_pack::errc::no_buffer_space; + } + if SP_UNLIKELY (sz > UINT32_MAX) { + return struct_pack::errc::invalid_width_of_container_length; + } + size = sz; } } else { diff --git a/src/struct_pack/tests/test_user_defined_type.cpp b/src/struct_pack/tests/test_user_defined_type.cpp index 68f8f04e6..3976e9126 100644 --- a/src/struct_pack/tests/test_user_defined_type.cpp +++ b/src/struct_pack/tests/test_user_defined_type.cpp @@ -9,9 +9,9 @@ namespace my_name_space { struct array2D { - std::string name = "Hello"; - std::vector> values = {{-1, 2, 3}}; - std::array values2 = {1.1, 2.3, 4.5}; + std::string name; + std::vector> values; + std::array values2; unsigned int x; unsigned int y; float* p; @@ -133,6 +133,9 @@ struct_pack::errc sp_deserialize_to_with_skip(Reader& reader, array2D& ar) { TEST_CASE("test user-defined_type") { my_name_space::array2D ar(114, 514); + ar.name = "hello"; + ar.values = {{1, -1, 44, 5}}; + ar.values2 = {1.1, 4.54, 43.32443}; ar(1, 6) = 3.14; ar(87, 111) = 2.71; auto buffer = struct_pack::serialize(ar); @@ -146,7 +149,13 @@ TEST_CASE("test user-defined_type nested") { std::vector ar; ar.emplace_back(11, 22); ar.emplace_back(114, 514); + ar[0].name = "hello"; + ar[0].values = {{1, -1, 44, 5}}; + ar[0].values2 = {1.1, 4.54, 43.32443}; ar[0](1, 6) = 3.14; + ar[1].name = "hello2"; + ar[1].values = {{1, -1, 44, 5,2}}; + ar[1].values2 = {1.1, 4.54, -2.0}; ar[1](87, 111) = 2.71; auto buffer = struct_pack::serialize(ar); auto result = struct_pack::deserialize(buffer); @@ -159,7 +168,13 @@ TEST_CASE("test user-defined_type nested ec") { std::vector ar; ar.emplace_back(11, 22); ar.emplace_back(114, 514); + ar[0].name = "hello"; + ar[0].values = {{1, -1, 44, 5}}; + ar[0].values2 = {1.1, 4.54, 43.32443}; ar[0](1, 6) = 3.14; + ar[1].name = "hello2"; + ar[1].values = {{1, -1, 44, 5, 2}}; + ar[1].values2 = {1.1, 4.54, -2.0}; ar[1](87, 111) = 2.71; auto buffer = struct_pack::serialize(ar); buffer.pop_back(); @@ -171,6 +186,9 @@ TEST_CASE("test user-defined_type nested ec") { TEST_CASE("test user-defined_type get_field") { std::pair o; o.first = {114, 514}; + o.first.name = "hello"; + o.first.values = {{1, -1, 44, 5}}; + o.first.values2 = {1.1, 4.54, 43.32443}; o.first(1, 6) = 3.14; o.first(87, 111) = 2.71; o.second = 114514;