From cdf63d5b4d3f7a73f10caf8c73dd19cf88e2f055 Mon Sep 17 00:00:00 2001 From: Roland Reichwein Date: Fri, 7 Feb 2025 10:35:26 +0100 Subject: [PATCH 1/2] Add intrusive_forward_list::remove() element by pointer --- include/etl/intrusive_forward_list.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/include/etl/intrusive_forward_list.h b/include/etl/intrusive_forward_list.h index 84d0aa94e..27d24431f 100644 --- a/include/etl/intrusive_forward_list.h +++ b/include/etl/intrusive_forward_list.h @@ -991,6 +991,28 @@ namespace etl } } + //************************************************************************* + // Removes the element specified by pointer. + //************************************************************************* + void remove(const_pointer element) + { + iterator i_item = begin(); + iterator i_last_item = before_begin(); + + while (i_item != end()) + { + if (&i_item == element) + { + i_item = erase_after(i_last_item); + } + else + { + ++i_item; + ++i_last_item; + } + } + } + //************************************************************************* /// Removes according to a predicate. //************************************************************************* From c70968fb673028a7a0ae1e4812f3b6e156916c7b Mon Sep 17 00:00:00 2001 From: Roland Reichwein Date: Fri, 7 Feb 2025 15:45:40 +0100 Subject: [PATCH 2/2] Add test --- include/etl/intrusive_forward_list.h | 1 + test/test_intrusive_forward_list.cpp | 29 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/include/etl/intrusive_forward_list.h b/include/etl/intrusive_forward_list.h index 27d24431f..d1a024fcf 100644 --- a/include/etl/intrusive_forward_list.h +++ b/include/etl/intrusive_forward_list.h @@ -1004,6 +1004,7 @@ namespace etl if (&i_item == element) { i_item = erase_after(i_last_item); + return; } else { diff --git a/test/test_intrusive_forward_list.cpp b/test/test_intrusive_forward_list.cpp index 20c8d830c..8134f921c 100644 --- a/test/test_intrusive_forward_list.cpp +++ b/test/test_intrusive_forward_list.cpp @@ -859,6 +859,35 @@ namespace CHECK_EQUAL(sorted_data.size(), size_t(std::distance(data1.begin(), data1.end()))); } + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_remove_by_pointer) + { + std::forward_list compare_data(sorted_data.begin(), sorted_data.end()); + DataNDC0 data0(sorted_data.begin(), sorted_data.end()); + DataNDC1 data1(sorted_data.begin(), sorted_data.end()); + + auto it = data0.begin(); + for (int i = 0; i < 7; ++i) + { + it++; + } + ItemNDCNode* element = ⁢ + + compare_data.remove(ItemNDCNode("7")); + data0.remove(*element); + + bool are_equal = std::equal(data0.begin(), data0.end(), compare_data.begin()); + + CHECK(are_equal); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data0.size()); + CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), std::distance(data0.begin(), data0.end())); + + are_equal = std::equal(data1.begin(), data1.end(), sorted_data.begin()); + CHECK(are_equal); + CHECK_EQUAL(sorted_data.size(), data1.size()); + CHECK_EQUAL(sorted_data.size(), size_t(std::distance(data1.begin(), data1.end()))); + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_remove_if) {