diff --git a/include/etl/intrusive_forward_list.h b/include/etl/intrusive_forward_list.h index 84d0aa94e..d1a024fcf 100644 --- a/include/etl/intrusive_forward_list.h +++ b/include/etl/intrusive_forward_list.h @@ -991,6 +991,29 @@ 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); + return; + } + else + { + ++i_item; + ++i_last_item; + } + } + } + //************************************************************************* /// Removes according to a predicate. //************************************************************************* 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) {