mirror of
https://github.com/ETLCPP/etl.git
synced 2026-04-30 19:09:10 +08:00
Added erase from pointer to node
This commit is contained in:
parent
2746cf4060
commit
68dac39104
@ -379,13 +379,13 @@ namespace etl
|
||||
//*************************************************************************
|
||||
/// Tests if the link is in this list.
|
||||
//*************************************************************************
|
||||
bool is_link_in_list(link_type& search_link) const
|
||||
bool is_link_in_list(const link_type* search_link) const
|
||||
{
|
||||
link_type* p_link = terminal_link.link_type::etl_next;
|
||||
|
||||
while (p_link != &terminal_link)
|
||||
{
|
||||
if (&search_link == p_link)
|
||||
if (search_link == p_link)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@ -400,13 +400,13 @@ namespace etl
|
||||
/// Remove the specified node from the list.
|
||||
/// Returns ETL_NULLPTR if the link was not in this list or was the last in the list.
|
||||
//*************************************************************************
|
||||
link_type* remove_link(link_type& link)
|
||||
link_type* remove_link(link_type* link)
|
||||
{
|
||||
link_type* result = ETL_NULLPTR;
|
||||
|
||||
if (is_link_in_list(link))
|
||||
{
|
||||
link_type* p_next = link.etl_next;
|
||||
link_type* p_next = link->etl_next;
|
||||
|
||||
disconnect_link(link);
|
||||
|
||||
@ -843,9 +843,17 @@ namespace etl
|
||||
//*************************************************************************
|
||||
/// Erases the specified node.
|
||||
//*************************************************************************
|
||||
node_type* erase(node_type& node)
|
||||
node_type* erase(const node_type& node)
|
||||
{
|
||||
return static_cast<node_type*>(this->remove_link(node));
|
||||
return static_cast<node_type*>(this->remove_link(const_cast<node_type*>(&node)));
|
||||
}
|
||||
|
||||
//*************************************************************************
|
||||
/// Erases the specified node.
|
||||
//*************************************************************************
|
||||
node_type* erase(const node_type* p_node)
|
||||
{
|
||||
return static_cast<node_type*>(this->remove_link(const_cast<node_type*>(p_node)));
|
||||
}
|
||||
|
||||
//*************************************************************************
|
||||
|
||||
@ -840,6 +840,90 @@ namespace
|
||||
CHECK(ETL_NULLPTR == p_next5);
|
||||
}
|
||||
|
||||
//*************************************************************************
|
||||
TEST_FIXTURE(SetupFixture, test_erase_single_by_node_pointer)
|
||||
{
|
||||
bool are_equal;
|
||||
|
||||
std::vector<ItemNDCNode> compare_data(sorted_data.begin(), sorted_data.end());
|
||||
DataNDC0 data0(sorted_data.begin(), sorted_data.end());
|
||||
DataNDC1 data1(sorted_data.begin(), sorted_data.end());
|
||||
|
||||
// Move to the third value and erase.
|
||||
std::vector<ItemNDCNode>::iterator i_compare_data = compare_data.begin();
|
||||
std::advance(i_compare_data, 3);
|
||||
|
||||
DataNDC0::iterator i_data = data0.begin();
|
||||
std::advance(i_data, 3);
|
||||
|
||||
ItemNDCNode& node1 = *i_data;
|
||||
ItemNDCNode* p_next1 = static_cast<ItemNDCNode*>(node1.FirstLink::get_next());
|
||||
ItemNDCNode* p_node1 = data0.erase(&node1);
|
||||
i_compare_data = compare_data.erase(i_compare_data);
|
||||
|
||||
are_equal = std::equal(data0.begin(), data0.end(), compare_data.begin());
|
||||
|
||||
CHECK(are_equal);
|
||||
CHECK_EQUAL(p_next1, p_node1);
|
||||
CHECK_EQUAL(compare_data.size(), data0.size());
|
||||
CHECK_EQUAL(compare_data.size(), size_t(std::distance(data0.begin(), data0.end())));
|
||||
|
||||
// Move to the first value and erase.
|
||||
i_compare_data = compare_data.begin();
|
||||
i_compare_data = compare_data.erase(i_compare_data);
|
||||
|
||||
i_data = data0.begin();
|
||||
|
||||
ItemNDCNode& node2 = *i_data;
|
||||
ItemNDCNode* p_next2 = static_cast<ItemNDCNode*>(node2.FirstLink::get_next());
|
||||
ItemNDCNode* p_node2 = data0.erase(&node2);
|
||||
|
||||
are_equal = std::equal(data0.begin(), data0.end(), compare_data.begin());
|
||||
|
||||
CHECK(are_equal);
|
||||
CHECK_EQUAL(p_next2, p_node2);
|
||||
CHECK_EQUAL(compare_data.size(), data0.size());
|
||||
CHECK_EQUAL(compare_data.size(), size_t(std::distance(data0.begin(), data0.end())));
|
||||
|
||||
// Move to the last value and erase.
|
||||
i_compare_data = compare_data.begin();
|
||||
std::advance(i_compare_data, compare_data.size() - 1);
|
||||
|
||||
i_data = data0.begin();
|
||||
std::advance(i_data, data0.size() - 1);
|
||||
|
||||
ItemNDCNode& node3 = *i_data;
|
||||
ItemNDCNode* p_next3 = static_cast<ItemNDCNode*>(node3.FirstLink::get_next());
|
||||
ItemNDCNode* p_node3 = data0.erase(&node3);
|
||||
i_compare_data = compare_data.erase(i_compare_data);
|
||||
|
||||
are_equal = std::equal(data0.begin(), data0.end(), compare_data.begin());
|
||||
|
||||
CHECK(are_equal);
|
||||
CHECK_NOT_EQUAL(p_next3, p_node3);
|
||||
CHECK(ETL_NULLPTR == p_node3);
|
||||
CHECK_EQUAL(compare_data.size(), data0.size());
|
||||
CHECK_EQUAL(compare_data.size(), size_t(std::distance(data0.begin(), data0.end())));
|
||||
|
||||
// Try removing a node that isn't in the list.
|
||||
auto node_not_in_list = ItemNDCNode("9");
|
||||
|
||||
ItemNDCNode* p_node4 = data0.erase(&node_not_in_list);
|
||||
CHECK(p_node4 == ETL_NULLPTR);
|
||||
|
||||
// Try removing the only node in the list.
|
||||
while (data0.size() > 1)
|
||||
{
|
||||
data0.pop_back();
|
||||
}
|
||||
|
||||
ItemNDCNode* p_node5 = &data0.front();
|
||||
|
||||
ItemNDCNode* p_next5 = static_cast<ItemNDCNode*>(p_node5->FirstLink::get_next());
|
||||
p_next5 = data0.erase(p_node5);
|
||||
CHECK(ETL_NULLPTR == p_next5);
|
||||
}
|
||||
|
||||
//*************************************************************************
|
||||
TEST_FIXTURE(SetupFixture, test_erase_range)
|
||||
{
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user