From 6cf039eecc39a60ad333052af47b7d3d209f10d6 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Thu, 23 Dec 2021 10:52:31 -0800 Subject: [PATCH 1/4] Rename transaparent erase tests to include map in their name --- test/unordered/transparent_tests.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/test/unordered/transparent_tests.cpp b/test/unordered/transparent_tests.cpp index c53c2292..19b4ef10 100644 --- a/test/unordered/transparent_tests.cpp +++ b/test/unordered/transparent_tests.cpp @@ -687,7 +687,7 @@ multimap_erase_const_overload_compile_test() return map.erase(c); } -template void test_transparent_erase() +template void test_map_transparent_erase() { count_reset(); @@ -724,7 +724,7 @@ template void test_transparent_erase() BOOST_TEST_EQ(key::count_, expected_key_count); } -template void test_non_transparent_erase() +template void test_map_non_transparent_erase() { count_reset(); @@ -884,7 +884,7 @@ void test_unordered_map() test_transparent_count(); test_map_transparent_find(); test_transparent_equal_range(); - test_transparent_erase(); + test_map_transparent_erase(); test_transparent_extract(); } @@ -896,7 +896,7 @@ void test_unordered_map() test_non_transparent_count(); test_map_non_transparent_find(); test_non_transparent_equal_range(); - test_non_transparent_erase(); + test_map_non_transparent_erase(); test_non_transparent_extract(); } @@ -909,7 +909,7 @@ void test_unordered_map() test_non_transparent_count(); test_map_non_transparent_find(); test_non_transparent_equal_range(); - test_non_transparent_erase(); + test_map_non_transparent_erase(); test_non_transparent_extract(); } @@ -922,7 +922,7 @@ void test_unordered_map() test_non_transparent_count(); test_map_non_transparent_find(); test_non_transparent_equal_range(); - test_non_transparent_erase(); + test_map_non_transparent_erase(); test_non_transparent_extract(); } } @@ -937,7 +937,7 @@ void test_unordered_multimap() test_transparent_count(); test_map_transparent_find(); test_transparent_equal_range(); - test_transparent_erase(); + test_map_transparent_erase(); test_transparent_extract(); } @@ -950,7 +950,7 @@ void test_unordered_multimap() test_non_transparent_count(); test_map_non_transparent_find(); test_non_transparent_equal_range(); - test_non_transparent_erase(); + test_map_non_transparent_erase(); test_non_transparent_extract(); } @@ -963,7 +963,7 @@ void test_unordered_multimap() test_non_transparent_count(); test_map_non_transparent_find(); test_non_transparent_equal_range(); - test_non_transparent_erase(); + test_map_non_transparent_erase(); test_non_transparent_extract(); } @@ -976,7 +976,7 @@ void test_unordered_multimap() test_non_transparent_count(); test_map_non_transparent_find(); test_non_transparent_equal_range(); - test_non_transparent_erase(); + test_map_non_transparent_erase(); test_non_transparent_extract(); } } From 31392ce1aab2793d6a6f1b7a78bf96a2c474f330 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Thu, 23 Dec 2021 13:02:18 -0800 Subject: [PATCH 2/4] Add transparent test support for set's `erase()` --- test/unordered/transparent_tests.cpp | 107 +++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/test/unordered/transparent_tests.cpp b/test/unordered/transparent_tests.cpp index 19b4ef10..9734e28e 100644 --- a/test/unordered/transparent_tests.cpp +++ b/test/unordered/transparent_tests.cpp @@ -768,6 +768,109 @@ template void test_map_non_transparent_erase() BOOST_TEST_EQ(key::count_, key_count); } +typedef boost::unordered_set + transparent_unordered_set; + +transparent_unordered_set::iterator set_erase_overload_compile_test() +{ + convertible_to_iterator c; + transparent_unordered_set set; + transparent_unordered_set::iterator pos = set.begin(); + pos = c; + return set.erase(c); +} + +transparent_unordered_set::const_iterator +set_erase_const_overload_compile_test() +{ + convertible_to_const_iterator c; + transparent_unordered_set set; + transparent_unordered_set::const_iterator pos = set.begin(); + pos = c; + return set.erase(c); +} + +template void test_set_transparent_erase() +{ + count_reset(); + + UnorderedSet set; + + unsigned long num_erased = 0; + + num_erased = set.erase(0); + BOOST_TEST(set.empty()); + BOOST_TEST_EQ(num_erased, 0); + BOOST_TEST_EQ(key::count_, 0); + + set.insert(0); + set.insert(1); + set.insert(2); + set.insert(0); + set.insert(0); + set.insert(0); + + BOOST_TEST(set.find(0) != set.end()); + + int const expected_key_count = key::count_; + int const expected_num_erased = static_cast(set.size() - 2); + + num_erased = set.erase(0); + BOOST_TEST_EQ(num_erased, expected_num_erased); + BOOST_TEST_EQ(set.size(), 2); + BOOST_TEST(set.find(0) == set.end()); + + num_erased = set.erase(1337); + BOOST_TEST_EQ(num_erased, 0); + BOOST_TEST_EQ(set.size(), 2); + + BOOST_TEST_EQ(key::count_, expected_key_count); +} + +template void test_set_non_transparent_erase() +{ + count_reset(); + + UnorderedSet set; + + unsigned long num_erased = 0; + + num_erased = set.erase(0); + BOOST_TEST(set.empty()); + BOOST_TEST_EQ(num_erased, 0); + BOOST_TEST_EQ(key::count_, 1); + + set.insert(0); + set.insert(1); + set.insert(2); + set.insert(0); + set.insert(0); + set.insert(0); + + int const expected_num_erased = static_cast(set.size() - 2); + + BOOST_TEST(set.find(0) != set.end()); + + int key_count = key::count_; + + num_erased = set.erase(0); + ++key_count; + BOOST_TEST_EQ(key::count_, key_count); + BOOST_TEST_EQ(num_erased, expected_num_erased); + BOOST_TEST_EQ(set.size(), 2); + + BOOST_TEST(set.find(0) == set.end()); + ++key_count; + + BOOST_TEST_EQ(key::count_, key_count); + + num_erased = set.erase(1337); + ++key_count; + BOOST_TEST_EQ(num_erased, 0); + BOOST_TEST_EQ(set.size(), 2); + BOOST_TEST_EQ(key::count_, key_count); +} + // test that in the presence of the member function template `extract()`, we // still invoke the correct iterator overloads when the type is implicitly // convertible @@ -988,6 +1091,7 @@ void test_unordered_set() unordered_set; test_set_transparent_find(); + test_set_transparent_erase(); } { @@ -996,6 +1100,7 @@ void test_unordered_set() typedef boost::unordered_set unordered_set; test_set_non_transparent_find(); + test_set_non_transparent_erase(); } { @@ -1005,6 +1110,7 @@ void test_unordered_set() unordered_set; test_set_non_transparent_find(); + test_set_non_transparent_erase(); } { @@ -1014,6 +1120,7 @@ void test_unordered_set() unordered_set; test_set_non_transparent_find(); + test_set_non_transparent_erase(); } } From 36324af0176e3bc74b5d716d12c20c515103a6c8 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Thu, 23 Dec 2021 13:02:54 -0800 Subject: [PATCH 3/4] Implement heterogeneous `erase()` for set --- include/boost/unordered/unordered_set.hpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/include/boost/unordered/unordered_set.hpp b/include/boost/unordered/unordered_set.hpp index 78887a48..98a05914 100644 --- a/include/boost/unordered/unordered_set.hpp +++ b/include/boost/unordered/unordered_set.hpp @@ -436,6 +436,17 @@ namespace boost { iterator erase(const_iterator); size_type erase(const key_type&); iterator erase(const_iterator, const_iterator); + + template + typename boost::enable_if_c< + detail::transparent_non_iterable::value, + size_type>::type + erase(BOOST_FWD_REF(Key) k) + { + return table_.erase_key_unique_impl( + this->key_eq(), boost::forward(k)); + } + BOOST_UNORDERED_DEPRECATED("Use erase instead") void quick_erase(const_iterator it) { erase(it); } BOOST_UNORDERED_DEPRECATED("Use erase instead") From 9c07cf60a653033280712db3446e1815b2acc309 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Thu, 23 Dec 2021 13:12:52 -0800 Subject: [PATCH 4/4] Deprecate `table::erase_key_unique()` --- include/boost/unordered/detail/implementation.hpp | 5 ----- include/boost/unordered/unordered_set.hpp | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/include/boost/unordered/detail/implementation.hpp b/include/boost/unordered/detail/implementation.hpp index 935cbb30..225a02ff 100644 --- a/include/boost/unordered/detail/implementation.hpp +++ b/include/boost/unordered/detail/implementation.hpp @@ -3458,11 +3458,6 @@ namespace boost { return 1; } - std::size_t erase_key_unique(const_key_type& k) - { - return this->erase_key_unique_impl(this->key_eq(), k); - } - void erase_nodes_unique(node_pointer i, node_pointer j) { std::size_t bucket_index = this->node_bucket(i); diff --git a/include/boost/unordered/unordered_set.hpp b/include/boost/unordered/unordered_set.hpp index 98a05914..c0841cf7 100644 --- a/include/boost/unordered/unordered_set.hpp +++ b/include/boost/unordered/unordered_set.hpp @@ -1366,7 +1366,7 @@ namespace boost { typename unordered_set::size_type unordered_set::erase(const key_type& k) { - return table_.erase_key_unique(k); + return table_.erase_key_unique_impl(this->key_eq(), k); } template