From f001585cd5c886f662175aad6d1e70419a73c20c Mon Sep 17 00:00:00 2001 From: Marcelo Zimbres Date: Wed, 19 Nov 2025 22:08:17 +0100 Subject: [PATCH] Fixes SBO problem and adds some tests --- include/boost/redis/impl/flat_tree.ipp | 2 +- include/boost/redis/resp3/flat_tree.hpp | 3 +- test/test_low_level_sync_sans_io.cpp | 44 ++++++++++++++++++------- 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/include/boost/redis/impl/flat_tree.ipp b/include/boost/redis/impl/flat_tree.ipp index 48be5040c..095e48ae6 100644 --- a/include/boost/redis/impl/flat_tree.ipp +++ b/include/boost/redis/impl/flat_tree.ipp @@ -81,7 +81,7 @@ void flat_tree::add_node_impl(node_view const& node) ranges_.push_back({data_.size(), node.value.size()}); // This must come after setting the offset above. - data_.append(node.value.data(), node.value.size()); + data_.insert(data_.end(), node.value.begin(), node.value.end()); view_tree_.push_back(node); } diff --git a/include/boost/redis/resp3/flat_tree.hpp b/include/boost/redis/resp3/flat_tree.hpp index 90b232143..4635b95b9 100644 --- a/include/boost/redis/resp3/flat_tree.hpp +++ b/include/boost/redis/resp3/flat_tree.hpp @@ -12,7 +12,6 @@ #include #include -#include #include namespace boost::redis { @@ -108,7 +107,7 @@ struct flat_tree { friend bool operator==(range const&, range const&); - std::string data_; + std::vector data_; view_tree view_tree_; std::vector ranges_; std::size_t pos_ = 0u; diff --git a/test/test_low_level_sync_sans_io.cpp b/test/test_low_level_sync_sans_io.cpp index 246cc0f30..1d4a7f454 100644 --- a/test/test_low_level_sync_sans_io.cpp +++ b/test/test_low_level_sync_sans_io.cpp @@ -404,10 +404,10 @@ BOOST_AUTO_TEST_CASE(flat_tree_views_are_set) deserialize(resp3_set, adapt2(resp3), ec); BOOST_CHECK_EQUAL(ec, error_code{}); - BOOST_CHECK_EQUAL(resp2.get_reallocs(), 1u); + BOOST_CHECK_EQUAL(resp2.get_reallocs(), 4u); BOOST_CHECK_EQUAL(resp2.get_total_msgs(), 1u); - BOOST_CHECK_EQUAL(resp3.value().get_reallocs(), 1u); + BOOST_CHECK_EQUAL(resp3.value().get_reallocs(), 4u); BOOST_CHECK_EQUAL(resp3.value().get_total_msgs(), 1u); auto const tmp2 = from_flat(resp2); @@ -427,7 +427,7 @@ BOOST_AUTO_TEST_CASE(flat_tree_reuse) deserialize(resp3_set, adapt2(tmp), ec); BOOST_CHECK_EQUAL(ec, error_code{}); - BOOST_CHECK_EQUAL(tmp.get_reallocs(), 1u); + BOOST_CHECK_EQUAL(tmp.get_reallocs(), 4u); BOOST_CHECK_EQUAL(tmp.get_total_msgs(), 1u); // Copy to compare after the reuse. @@ -447,25 +447,45 @@ BOOST_AUTO_TEST_CASE(flat_tree_reuse) BOOST_AUTO_TEST_CASE(flat_tree_copy_assign) { - flat_tree resp; + flat_tree ref1; + flat_tree ref2; + flat_tree ref3; + flat_tree ref4; error_code ec; - deserialize(resp3_set, adapt2(resp), ec); + deserialize(resp3_set, adapt2(ref1), ec); + deserialize(resp3_set, adapt2(ref2), ec); + deserialize(resp3_set, adapt2(ref3), ec); + deserialize(resp3_set, adapt2(ref4), ec); BOOST_CHECK_EQUAL(ec, error_code{}); - // Copy - resp3::flat_tree copy1{resp}; + // Copy ctor + resp3::flat_tree copy1{ref1}; + + // Move ctor + resp3::flat_tree move1{std::move(ref2)}; // Copy assignment - resp3::flat_tree copy2 = resp; + resp3::flat_tree copy2 = ref1; + + // Move assignment + resp3::flat_tree move2 = std::move(ref3); // Assignment resp3::flat_tree copy3; - copy3 = resp; + copy3 = ref1; + + // Move assignment + resp3::flat_tree move3; + move3 = std::move(ref4); + + BOOST_TEST((copy1 == ref1)); + BOOST_TEST((copy2 == ref1)); + BOOST_TEST((copy3 == ref1)); - BOOST_TEST((copy1 == resp)); - BOOST_TEST((copy2 == resp)); - BOOST_TEST((copy3 == resp)); + BOOST_TEST((move1 == ref1)); + BOOST_TEST((move2 == ref1)); + BOOST_TEST((move3 == ref1)); } BOOST_AUTO_TEST_CASE(generic_flat_response_simple_error)