Skip to content

Commit 91afb4a

Browse files
authored
Fixes SBO problem and adds some tests (#356)
1 parent bdd9c32 commit 91afb4a

File tree

3 files changed

+34
-15
lines changed

3 files changed

+34
-15
lines changed

include/boost/redis/impl/flat_tree.ipp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ void flat_tree::add_node_impl(node_view const& node)
8181
ranges_.push_back({data_.size(), node.value.size()});
8282

8383
// This must come after setting the offset above.
84-
data_.append(node.value.data(), node.value.size());
84+
data_.insert(data_.end(), node.value.begin(), node.value.end());
8585

8686
view_tree_.push_back(node);
8787
}

include/boost/redis/resp3/flat_tree.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
#include <boost/redis/resp3/node.hpp>
1313
#include <boost/redis/resp3/tree.hpp>
1414

15-
#include <string>
1615
#include <vector>
1716

1817
namespace boost::redis {
@@ -108,7 +107,7 @@ struct flat_tree {
108107

109108
friend bool operator==(range const&, range const&);
110109

111-
std::string data_;
110+
std::vector<char> data_;
112111
view_tree view_tree_;
113112
std::vector<range> ranges_;
114113
std::size_t pos_ = 0u;

test/test_low_level_sync_sans_io.cpp

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -395,10 +395,10 @@ BOOST_AUTO_TEST_CASE(flat_tree_views_are_set)
395395
deserialize(resp3_set, adapt2(resp3), ec);
396396
BOOST_CHECK_EQUAL(ec, error_code{});
397397

398-
BOOST_CHECK_EQUAL(resp2.get_reallocs(), 1u);
398+
BOOST_CHECK_EQUAL(resp2.get_reallocs(), 4u);
399399
BOOST_CHECK_EQUAL(resp2.get_total_msgs(), 1u);
400400

401-
BOOST_CHECK_EQUAL(resp3.value().get_reallocs(), 1u);
401+
BOOST_CHECK_EQUAL(resp3.value().get_reallocs(), 4u);
402402
BOOST_CHECK_EQUAL(resp3.value().get_total_msgs(), 1u);
403403

404404
auto const tmp2 = from_flat(resp2);
@@ -418,7 +418,7 @@ BOOST_AUTO_TEST_CASE(flat_tree_reuse)
418418
deserialize(resp3_set, adapt2(tmp), ec);
419419
BOOST_CHECK_EQUAL(ec, error_code{});
420420

421-
BOOST_CHECK_EQUAL(tmp.get_reallocs(), 1u);
421+
BOOST_CHECK_EQUAL(tmp.get_reallocs(), 4u);
422422
BOOST_CHECK_EQUAL(tmp.get_total_msgs(), 1u);
423423

424424
// Copy to compare after the reuse.
@@ -438,25 +438,45 @@ BOOST_AUTO_TEST_CASE(flat_tree_reuse)
438438

439439
BOOST_AUTO_TEST_CASE(flat_tree_copy_assign)
440440
{
441-
flat_tree resp;
441+
flat_tree ref1;
442+
flat_tree ref2;
443+
flat_tree ref3;
444+
flat_tree ref4;
442445

443446
error_code ec;
444-
deserialize(resp3_set, adapt2(resp), ec);
447+
deserialize(resp3_set, adapt2(ref1), ec);
448+
deserialize(resp3_set, adapt2(ref2), ec);
449+
deserialize(resp3_set, adapt2(ref3), ec);
450+
deserialize(resp3_set, adapt2(ref4), ec);
445451
BOOST_CHECK_EQUAL(ec, error_code{});
446452

447-
// Copy
448-
resp3::flat_tree copy1{resp};
453+
// Copy ctor
454+
resp3::flat_tree copy1{ref1};
455+
456+
// Move ctor
457+
resp3::flat_tree move1{std::move(ref2)};
449458

450459
// Copy assignment
451-
resp3::flat_tree copy2 = resp;
460+
resp3::flat_tree copy2 = ref1;
461+
462+
// Move assignment
463+
resp3::flat_tree move2 = std::move(ref3);
452464

453465
// Assignment
454466
resp3::flat_tree copy3;
455-
copy3 = resp;
467+
copy3 = ref1;
468+
469+
// Move assignment
470+
resp3::flat_tree move3;
471+
move3 = std::move(ref4);
472+
473+
BOOST_TEST((copy1 == ref1));
474+
BOOST_TEST((copy2 == ref1));
475+
BOOST_TEST((copy3 == ref1));
456476

457-
BOOST_TEST((copy1 == resp));
458-
BOOST_TEST((copy2 == resp));
459-
BOOST_TEST((copy3 == resp));
477+
BOOST_TEST((move1 == ref1));
478+
BOOST_TEST((move2 == ref1));
479+
BOOST_TEST((move3 == ref1));
460480
}
461481

462482
BOOST_AUTO_TEST_CASE(generic_flat_response_simple_error)

0 commit comments

Comments
 (0)