From ecf76830a57542620238159b17ce27f181e89c56 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Thu, 30 Dec 2021 11:28:44 -0800 Subject: [PATCH 1/3] Update transparent `erase()` tests to delete single elements for the multi-containers --- test/unordered/transparent_tests.cpp | 36 ++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/test/unordered/transparent_tests.cpp b/test/unordered/transparent_tests.cpp index e703a13a..f340817d 100644 --- a/test/unordered/transparent_tests.cpp +++ b/test/unordered/transparent_tests.cpp @@ -1070,9 +1070,14 @@ template void test_map_transparent_erase() BOOST_TEST_EQ(map.size(), 2); BOOST_TEST(map.find(0) == map.end()); + num_erased = map.erase(1); + BOOST_TEST_EQ(num_erased, 1); + BOOST_TEST_EQ(map.size(), 1); + BOOST_TEST(map.find(1) == map.end()); + num_erased = map.erase(1337); BOOST_TEST_EQ(num_erased, 0); - BOOST_TEST_EQ(map.size(), 2); + BOOST_TEST_EQ(map.size(), 1); BOOST_TEST_EQ(key::count_, expected_key_count); } @@ -1114,10 +1119,19 @@ template void test_map_non_transparent_erase() BOOST_TEST_EQ(key::count_, key_count); + num_erased = map.erase(1); + ++key_count; + BOOST_TEST_EQ(num_erased, 1); + BOOST_TEST_EQ(map.size(), 1); + + BOOST_TEST(map.find(1) == map.end()); + ++key_count; + num_erased = map.erase(1337); ++key_count; BOOST_TEST_EQ(num_erased, 0); - BOOST_TEST_EQ(map.size(), 2); + BOOST_TEST_EQ(map.size(), 1); + BOOST_TEST_EQ(key::count_, key_count); } @@ -1173,9 +1187,14 @@ template void test_set_transparent_erase() BOOST_TEST_EQ(set.size(), 2); BOOST_TEST(set.find(0) == set.end()); + num_erased = set.erase(1); + BOOST_TEST_EQ(num_erased, 1); + BOOST_TEST_EQ(set.size(), 1); + BOOST_TEST(set.find(1) == set.end()); + num_erased = set.erase(1337); BOOST_TEST_EQ(num_erased, 0); - BOOST_TEST_EQ(set.size(), 2); + BOOST_TEST_EQ(set.size(), 1); BOOST_TEST_EQ(key::count_, expected_key_count); } @@ -1217,10 +1236,19 @@ template void test_set_non_transparent_erase() BOOST_TEST_EQ(key::count_, key_count); + num_erased = set.erase(1); + ++key_count; + BOOST_TEST_EQ(num_erased, 1); + BOOST_TEST_EQ(set.size(), 1); + + BOOST_TEST(set.find(1) == set.end()); + ++key_count; + num_erased = set.erase(1337); ++key_count; BOOST_TEST_EQ(num_erased, 0); - BOOST_TEST_EQ(set.size(), 2); + BOOST_TEST_EQ(set.size(), 1); + BOOST_TEST_EQ(key::count_, key_count); } From 3aa62a821af8ac32cebba9cdc70424c5749b39fb Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Thu, 30 Dec 2021 11:29:11 -0800 Subject: [PATCH 2/3] Add transparent test support for multiset's `erase()` --- test/unordered/transparent_tests.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/test/unordered/transparent_tests.cpp b/test/unordered/transparent_tests.cpp index f340817d..665d627e 100644 --- a/test/unordered/transparent_tests.cpp +++ b/test/unordered/transparent_tests.cpp @@ -1138,6 +1138,10 @@ template void test_map_non_transparent_erase() typedef boost::unordered_set transparent_unordered_set; +typedef boost::unordered_multiset + transparent_unordered_multiset; + transparent_unordered_set::iterator set_erase_overload_compile_test() { convertible_to_iterator c; @@ -1157,6 +1161,25 @@ set_erase_const_overload_compile_test() return set.erase(c); } +transparent_unordered_multiset::iterator multiset_erase_overload_compile_test() +{ + convertible_to_iterator c; + transparent_unordered_multiset set; + transparent_unordered_multiset::iterator pos = set.begin(); + pos = c; + return set.erase(c); +} + +transparent_unordered_multiset::const_iterator +multiset_erase_const_overload_compile_test() +{ + convertible_to_const_iterator c; + transparent_unordered_multiset set; + transparent_unordered_multiset::const_iterator pos = set.begin(); + pos = c; + return set.erase(c); +} + template void test_set_transparent_erase() { count_reset(); @@ -1517,6 +1540,7 @@ void test_unordered_multiset() unordered_set; test_set_transparent_find(); + test_set_transparent_erase(); test_set_transparent_equal_range(); } @@ -1526,6 +1550,7 @@ void test_unordered_multiset() typedef boost::unordered_multiset unordered_set; test_set_non_transparent_find(); + test_set_non_transparent_erase(); test_set_non_transparent_equal_range(); } @@ -1536,6 +1561,7 @@ void test_unordered_multiset() unordered_set; test_set_non_transparent_find(); + test_set_non_transparent_erase(); test_set_non_transparent_equal_range(); } @@ -1546,6 +1572,7 @@ void test_unordered_multiset() unordered_set; test_set_non_transparent_find(); + test_set_non_transparent_erase(); test_set_non_transparent_equal_range(); } } From 1ab8cc4c0f55deb4a917a0506782b8e5e6018c88 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Thu, 30 Dec 2021 11:29:21 -0800 Subject: [PATCH 3/3] Implement heterogeneous `erase()` for multiset --- include/boost/unordered/unordered_set.hpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/include/boost/unordered/unordered_set.hpp b/include/boost/unordered/unordered_set.hpp index ecb12bda..4f691125 100644 --- a/include/boost/unordered/unordered_set.hpp +++ b/include/boost/unordered/unordered_set.hpp @@ -1016,6 +1016,16 @@ namespace boost { iterator erase(const_iterator); size_type erase(const key_type&); + + template + typename boost::enable_if_c< + detail::transparent_non_iterable::value, + size_type>::type + erase(const Key& k) + { + return table_.erase_key_equiv_impl(this->key_eq(), k); + } + iterator erase(const_iterator, const_iterator); BOOST_UNORDERED_DEPRECATED("Use erase instead") void quick_erase(const_iterator it) { erase(it); }