Skip to content

Commit 3936ada

Browse files
committed
Fixed erase return iterator.
1 parent 0f2830a commit 3936ada

File tree

2 files changed

+51
-11
lines changed

2 files changed

+51
-11
lines changed

include/interval-tree/interval_tree.hpp

+19-11
Original file line numberDiff line numberDiff line change
@@ -886,19 +886,27 @@ namespace lib_interval_tree
886886
throw std::out_of_range("cannot erase end iterator");
887887

888888
auto next = iter;
889-
++next;
890889

891-
node_type* y;
892-
if (!iter.node_->left_ || !iter.node_->right_)
893-
y = iter.node_;
894-
else
895-
y = successor(iter.node_);
890+
node_type* y = [&next, &iter, this]() {
891+
if (!iter.node_->left_ || !iter.node_->right_)
892+
{
893+
++next;
894+
return iter.node_;
895+
}
896+
else
897+
{
898+
const auto y = successor(iter.node_);
899+
next = iterator{iter.node_, this};
900+
return y;
901+
}
902+
}();
896903

897-
node_type* x;
898-
if (y->left_)
899-
x = y->left_;
900-
else
901-
x = y->right_;
904+
node_type* x = [y](){
905+
if (y->left_)
906+
return y->left_;
907+
else
908+
return y->right_;
909+
}();
902910

903911
if (x)
904912
x->parent_ = y->parent_;

tests/erase_tests.hpp

+32
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,25 @@ TEST_F(EraseTests, RandomEraseTest)
184184
testTreeHeightHealth(tree);
185185
}
186186

187+
188+
189+
TEST_F(EraseTests, MassiveDeleteEntireTreeWithEraseReturnIterator)
190+
{
191+
constexpr int amount = 1000;
192+
193+
for (int i = 0; i != amount; ++i)
194+
tree.insert(makeSafeOracleInterval(&oracle, distSmall(gen), distSmall(gen)));
195+
196+
for(auto iter = tree.begin(); !tree.empty();)
197+
{
198+
iter = tree.erase(iter);
199+
}
200+
201+
EXPECT_EQ(oracle.livingInstances, 0);
202+
testMaxProperty(tree);
203+
testTreeHeightHealth(tree);
204+
}
205+
187206
TEST_F(EraseTests, ReturnedIteratorPointsToNextInOrderNode)
188207
{
189208
auto regularTree = makeTree();
@@ -234,3 +253,16 @@ TEST_F(EraseTests, CanEraseEntireTreeUsingReturnedIterator)
234253
iter = tree.erase(iter);
235254
EXPECT_EQ(tree.empty(), true);
236255
}
256+
257+
TEST_F(EraseTests, FromNuiTest)
258+
{
259+
lib_interval_tree::interval_tree_t <int> tree;
260+
tree.insert({0, 0});
261+
tree.insert({4, 4});
262+
tree.insert({13, 13});
263+
264+
drawTree("erase_tests_from_nui", tree);
265+
266+
auto iter = tree.erase(tree.find({4, 4}));
267+
EXPECT_EQ(*iter, (decltype(tree)::interval_type{13, 13})) << *iter;
268+
}

0 commit comments

Comments
 (0)