From f8b53c1cf7d69bfabd78a88c92572d2fa9f975d5 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Mon, 3 Jan 2022 13:14:47 -0800 Subject: [PATCH 1/3] Rename transparent count 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 665d627e..e6c7809e 100644 --- a/test/unordered/transparent_tests.cpp +++ b/test/unordered/transparent_tests.cpp @@ -69,7 +69,7 @@ struct key_equal void count_reset() { key::count_ = 0; } -template void test_transparent_count() +template void test_map_transparent_count() { count_reset(); @@ -97,7 +97,7 @@ template void test_transparent_count() BOOST_TEST_EQ(key::count_, expected_key_count); } -template void test_non_transparent_count() +template void test_map_non_transparent_count() { count_reset(); @@ -1388,7 +1388,7 @@ void test_unordered_map() transparent_key_equal> unordered_map; - test_transparent_count(); + test_map_transparent_count(); test_map_transparent_find(); test_map_transparent_equal_range(); test_map_transparent_erase(); @@ -1400,7 +1400,7 @@ void test_unordered_map() // typedef boost::unordered_map unordered_map; - test_non_transparent_count(); + test_map_non_transparent_count(); test_map_non_transparent_find(); test_map_non_transparent_equal_range(); test_map_non_transparent_erase(); @@ -1413,7 +1413,7 @@ void test_unordered_map() typedef boost::unordered_map unordered_map; - test_non_transparent_count(); + test_map_non_transparent_count(); test_map_non_transparent_find(); test_map_non_transparent_equal_range(); test_map_non_transparent_erase(); @@ -1426,7 +1426,7 @@ void test_unordered_map() typedef boost::unordered_map unordered_map; - test_non_transparent_count(); + test_map_non_transparent_count(); test_map_non_transparent_find(); test_map_non_transparent_equal_range(); test_map_non_transparent_erase(); @@ -1441,7 +1441,7 @@ void test_unordered_multimap() transparent_key_equal> unordered_multimap; - test_transparent_count(); + test_map_transparent_count(); test_map_transparent_find(); test_map_transparent_equal_range(); test_map_transparent_erase(); @@ -1454,7 +1454,7 @@ void test_unordered_multimap() typedef boost::unordered_multimap unordered_multimap; - test_non_transparent_count(); + test_map_non_transparent_count(); test_map_non_transparent_find(); test_map_non_transparent_equal_range(); test_map_non_transparent_erase(); @@ -1467,7 +1467,7 @@ void test_unordered_multimap() typedef boost::unordered_multimap unordered_multimap; - test_non_transparent_count(); + test_map_non_transparent_count(); test_map_non_transparent_find(); test_map_non_transparent_equal_range(); test_map_non_transparent_erase(); @@ -1480,7 +1480,7 @@ void test_unordered_multimap() typedef boost::unordered_multimap unordered_multimap; - test_non_transparent_count(); + test_map_non_transparent_count(); test_map_non_transparent_find(); test_map_non_transparent_equal_range(); test_map_non_transparent_erase(); From ccbe691cc8775998b7b38f8eae00a93c95bb9705 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Mon, 3 Jan 2022 13:34:54 -0800 Subject: [PATCH 2/3] Add transparent test support for set's `count()` --- test/unordered/transparent_tests.cpp | 66 ++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/test/unordered/transparent_tests.cpp b/test/unordered/transparent_tests.cpp index e6c7809e..e0a1111c 100644 --- a/test/unordered/transparent_tests.cpp +++ b/test/unordered/transparent_tests.cpp @@ -131,6 +131,68 @@ template void test_map_non_transparent_count() BOOST_TEST_EQ(key::count_, key_count); } +template void test_set_transparent_count() +{ + count_reset(); + + UnorderedSet set; + + set.insert(0); + set.insert(1); + set.insert(2); + set.insert(0); + set.insert(0); + set.insert(0); + + int const expected_key_count = key::count_; + + std::size_t count = 0; + count = set.count(0); + BOOST_TEST_EQ(count, set.size() - 2); + + count = set.count(1); + BOOST_TEST_EQ(count, 1); + + count = set.count(1337); + BOOST_TEST_EQ(count, 0); + + BOOST_TEST_EQ(key::count_, expected_key_count); +} + +template void test_set_non_transparent_count() +{ + count_reset(); + + UnorderedSet set; + + set.insert(0); + set.insert(1); + set.insert(2); + set.insert(0); + set.insert(0); + set.insert(0); + + int key_count = key::count_; + + std::size_t count = 0; + count = set.count(0); + ++key_count; + + BOOST_TEST_EQ(count, set.size() - 2); + BOOST_TEST_EQ(key::count_, key_count); + + count = set.count(1); + ++key_count; + + BOOST_TEST_EQ(count, 1); + + count = set.count(1337); + ++key_count; + + BOOST_TEST_EQ(count, 0); + BOOST_TEST_EQ(key::count_, key_count); +} + template void test_map_transparent_find() { count_reset(); @@ -1494,6 +1556,7 @@ void test_unordered_set() typedef boost::unordered_set unordered_set; + test_set_transparent_count(); test_set_transparent_find(); test_set_transparent_erase(); test_set_transparent_equal_range(); @@ -1504,6 +1567,7 @@ void test_unordered_set() // typedef boost::unordered_set unordered_set; + test_set_non_transparent_count(); test_set_non_transparent_find(); test_set_non_transparent_erase(); test_set_non_transparent_equal_range(); @@ -1515,6 +1579,7 @@ void test_unordered_set() typedef boost::unordered_set unordered_set; + test_set_non_transparent_count(); test_set_non_transparent_find(); test_set_non_transparent_erase(); test_set_non_transparent_equal_range(); @@ -1526,6 +1591,7 @@ void test_unordered_set() typedef boost::unordered_set unordered_set; + test_set_non_transparent_count(); test_set_non_transparent_find(); test_set_non_transparent_erase(); test_set_non_transparent_equal_range(); From 56f11f94d8c9015dcdb1dea4a870026a8d312b1c Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Mon, 3 Jan 2022 13:35:07 -0800 Subject: [PATCH 3/3] Implement heterogeneous `count()` for set --- include/boost/unordered/unordered_set.hpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/include/boost/unordered/unordered_set.hpp b/include/boost/unordered/unordered_set.hpp index 4f691125..81f6e2f4 100644 --- a/include/boost/unordered/unordered_set.hpp +++ b/include/boost/unordered/unordered_set.hpp @@ -500,6 +500,18 @@ namespace boost { size_type count(const key_type&) const; + template + typename boost::enable_if_c::value, + size_type>::type + count(const Key& k) const + { + node_pointer n = table_.find_node_impl( + table::policy::apply_hash(this->hash_function(), k), k, + this->key_eq()); + + return n ? 1 : 0; + } + std::pair equal_range( const key_type&) const;