Skip to content

Commit 37539a2

Browse files
Intrusive forward list add remove by pointer (#1026)
* Add intrusive_forward_list::remove() element by pointer * Add test
1 parent e1b263a commit 37539a2

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

include/etl/intrusive_forward_list.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -991,6 +991,29 @@ namespace etl
991991
}
992992
}
993993

994+
//*************************************************************************
995+
// Removes the element specified by pointer.
996+
//*************************************************************************
997+
void remove(const_pointer element)
998+
{
999+
iterator i_item = begin();
1000+
iterator i_last_item = before_begin();
1001+
1002+
while (i_item != end())
1003+
{
1004+
if (&i_item == element)
1005+
{
1006+
i_item = erase_after(i_last_item);
1007+
return;
1008+
}
1009+
else
1010+
{
1011+
++i_item;
1012+
++i_last_item;
1013+
}
1014+
}
1015+
}
1016+
9941017
//*************************************************************************
9951018
/// Removes according to a predicate.
9961019
//*************************************************************************

test/test_intrusive_forward_list.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,35 @@ namespace
859859
CHECK_EQUAL(sorted_data.size(), size_t(std::distance(data1.begin(), data1.end())));
860860
}
861861

862+
//*************************************************************************
863+
TEST_FIXTURE(SetupFixture, test_remove_by_pointer)
864+
{
865+
std::forward_list<ItemNDCNode> compare_data(sorted_data.begin(), sorted_data.end());
866+
DataNDC0 data0(sorted_data.begin(), sorted_data.end());
867+
DataNDC1 data1(sorted_data.begin(), sorted_data.end());
868+
869+
auto it = data0.begin();
870+
for (int i = 0; i < 7; ++i)
871+
{
872+
it++;
873+
}
874+
ItemNDCNode* element = &it;
875+
876+
compare_data.remove(ItemNDCNode("7"));
877+
data0.remove(*element);
878+
879+
bool are_equal = std::equal(data0.begin(), data0.end(), compare_data.begin());
880+
881+
CHECK(are_equal);
882+
CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data0.size());
883+
CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), std::distance(data0.begin(), data0.end()));
884+
885+
are_equal = std::equal(data1.begin(), data1.end(), sorted_data.begin());
886+
CHECK(are_equal);
887+
CHECK_EQUAL(sorted_data.size(), data1.size());
888+
CHECK_EQUAL(sorted_data.size(), size_t(std::distance(data1.begin(), data1.end())));
889+
}
890+
862891
//*************************************************************************
863892
TEST_FIXTURE(SetupFixture, test_remove_if)
864893
{

0 commit comments

Comments
 (0)