Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 75f0c11

Browse files
CopilotachamayouCopilot
authored
Address PR 32 review comments (#34)
* Address review comment fixes * Fix clang-tidy move helper warning * Use clear() safely after move transfer * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <[email protected]> * test: cover tree copy assignment --------- Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: Amaury Chamayou <[email protected]> Co-authored-by: Copilot Autofix powered by AI <[email protected]>
1 parent 3cbfd3c commit 75f0c11

2 files changed

Lines changed: 49 additions & 76 deletions

File tree

merklecpp.h

Lines changed: 38 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <sstream>
1616
#include <stack>
1717
#include <stdexcept>
18+
#include <utility>
1819
#include <vector>
1920

2021
#ifdef HAVE_OPENSSL
@@ -747,22 +748,9 @@ namespace merkle
747748

748749
/// @brief Moves a tree
749750
/// @param other Tree to move
750-
TreeT(TreeT&& other) noexcept :
751-
leaf_nodes(std::move(other.leaf_nodes)),
752-
uninserted_leaf_nodes(std::move(other.uninserted_leaf_nodes)),
753-
_root(std::move(other._root)),
754-
num_flushed(other.num_flushed),
755-
insertion_stack(std::move(other.insertion_stack)),
756-
hashing_stack(std::move(other.hashing_stack)),
757-
walk_stack(std::move(other.walk_stack))
758-
{
759-
other.leaf_nodes.clear();
760-
other.uninserted_leaf_nodes.clear();
761-
other._root = nullptr;
762-
other.num_flushed = 0;
763-
other.insertion_stack.clear();
764-
other.hashing_stack.clear();
765-
other.walk_stack.clear();
751+
TreeT(TreeT&& other) noexcept
752+
{
753+
move_from(other);
766754
}
767755

768756
/// @brief Deserialises a tree
@@ -790,11 +778,7 @@ namespace merkle
790778
/// @brief Deconstructor
791779
~TreeT()
792780
{
793-
delete (_root);
794-
for (auto n : uninserted_leaf_nodes)
795-
{
796-
delete (n);
797-
}
781+
clear();
798782
}
799783

800784
/// @brief Invariant of the tree
@@ -981,17 +965,7 @@ namespace merkle
981965
{
982966
return *this;
983967
}
984-
leaf_nodes.clear();
985-
for (auto n : uninserted_leaf_nodes)
986-
{
987-
delete (n);
988-
}
989-
uninserted_leaf_nodes.clear();
990-
insertion_stack.clear();
991-
hashing_stack.clear();
992-
walk_stack.clear();
993-
delete (_root);
994-
_root = nullptr;
968+
clear();
995969

996970
size_t to_skip = (other.num_flushed % 2 == 0) ? 0 : 1;
997971
_root = Node::copy_node(
@@ -1020,33 +994,8 @@ namespace merkle
1020994
return *this;
1021995
}
1022996

1023-
leaf_nodes.clear();
1024-
for (auto n : uninserted_leaf_nodes)
1025-
{
1026-
delete (n);
1027-
}
1028-
uninserted_leaf_nodes.clear();
1029-
insertion_stack.clear();
1030-
hashing_stack.clear();
1031-
walk_stack.clear();
1032-
delete (_root);
1033-
_root = nullptr;
1034-
1035-
leaf_nodes = std::move(other.leaf_nodes);
1036-
uninserted_leaf_nodes = std::move(other.uninserted_leaf_nodes);
1037-
_root = other._root;
1038-
num_flushed = other.num_flushed;
1039-
insertion_stack = std::move(other.insertion_stack);
1040-
hashing_stack = std::move(other.hashing_stack);
1041-
walk_stack = std::move(other.walk_stack);
1042-
1043-
other.leaf_nodes.clear();
1044-
other.uninserted_leaf_nodes.clear();
1045-
other._root = nullptr;
1046-
other.num_flushed = 0;
1047-
other.insertion_stack.clear();
1048-
other.hashing_stack.clear();
1049-
other.walk_stack.clear();
997+
clear();
998+
move_from(other);
1050999
return *this;
10511000
}
10521001

@@ -1468,17 +1417,7 @@ namespace merkle
14681417
{
14691418
MERKLECPP_TRACE(MERKLECPP_TOUT << "> deserialise " << std::endl;);
14701419

1471-
delete (_root);
1472-
leaf_nodes.clear();
1473-
for (auto n : uninserted_leaf_nodes)
1474-
{
1475-
delete (n);
1476-
}
1477-
uninserted_leaf_nodes.clear();
1478-
insertion_stack.clear();
1479-
hashing_stack.clear();
1480-
walk_stack.clear();
1481-
_root = nullptr;
1420+
clear();
14821421

14831422
size_t num_leaf_nodes = deserialise_uint64_t(bytes, position);
14841423
num_flushed = deserialise_uint64_t(bytes, position);
@@ -1770,15 +1709,40 @@ namespace merkle
17701709
protected:
17711710
void validate_partial_range(size_t from, size_t to) const
17721711
{
1773-
const bool from_out_of_range = from < min_index() || max_index() < from;
1774-
const bool to_out_of_range = to < min_index() || max_index() < to;
1775-
const bool reversed_range = from > to;
1776-
if (empty() || from_out_of_range || to_out_of_range || reversed_range)
1712+
if (
1713+
empty() || !(min_index() <= from && from <= to && to <= max_index()))
17771714
{
17781715
throw std::runtime_error("invalid leaf indices");
17791716
}
17801717
}
17811718

1719+
void clear()
1720+
{
1721+
leaf_nodes.clear();
1722+
for (auto n : uninserted_leaf_nodes)
1723+
{
1724+
delete (n);
1725+
}
1726+
uninserted_leaf_nodes.clear();
1727+
insertion_stack.clear();
1728+
hashing_stack.clear();
1729+
walk_stack.clear();
1730+
delete (_root);
1731+
_root = nullptr;
1732+
num_flushed = 0;
1733+
}
1734+
1735+
void move_from(TreeT& other) noexcept
1736+
{
1737+
leaf_nodes = std::exchange(other.leaf_nodes, {});
1738+
uninserted_leaf_nodes = std::exchange(other.uninserted_leaf_nodes, {});
1739+
_root = std::exchange(other._root, nullptr);
1740+
num_flushed = std::exchange(other.num_flushed, 0);
1741+
insertion_stack = std::exchange(other.insertion_stack, {});
1742+
hashing_stack = std::exchange(other.hashing_stack, {});
1743+
walk_stack = std::exchange(other.walk_stack, {});
1744+
}
1745+
17821746
/// @brief Vector of leaf nodes current in the tree
17831747
std::vector<Node*> leaf_nodes;
17841748

test/coverage.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,15 @@ namespace
265265
const auto expected_min = source.min_index();
266266
const auto expected_max = source.max_index();
267267

268+
merkle::Tree copy_assigned(hash_with_byte(0xEE));
269+
copy_assigned = source;
270+
require(copy_assigned.root() == expected_root, "copy assignment root mismatch");
271+
require(copy_assigned.min_index() == expected_min, "copy assignment min mismatch");
272+
require(copy_assigned.max_index() == expected_max, "copy assignment max mismatch");
273+
require(
274+
copy_assigned.leaf(expected_min) == source_hashes[expected_min],
275+
"copy-assigned leaf mismatch");
276+
268277
merkle::Tree moved(std::move(source));
269278
require(moved.root() == expected_root, "move constructor root mismatch");
270279
require(moved.min_index() == expected_min, "move constructor min mismatch");
@@ -307,12 +316,12 @@ int main()
307316
}
308317
catch (const std::exception& ex)
309318
{
310-
std::cout << "Error: " << ex.what() << '\n';
319+
std::cerr << "Error: " << ex.what() << '\n';
311320
return 1;
312321
}
313322
catch (...)
314323
{
315-
std::cout << "Error" << '\n';
324+
std::cerr << "Error" << '\n';
316325
return 1;
317326
}
318327

0 commit comments

Comments
 (0)