From dc95efea1a314f20b6aa4a8c9ca094836d28e340 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Wed, 29 Dec 2021 10:24:31 -0800 Subject: [PATCH 1/3] Update transparent `equal_range()` tests to check for ranges of length 1 for multi-containers --- test/unordered/transparent_tests.cpp | 108 +++++++++++++++++++++++++-- 1 file changed, 102 insertions(+), 6 deletions(-) diff --git a/test/unordered/transparent_tests.cpp b/test/unordered/transparent_tests.cpp index fb9339d3..f5fd483f 100644 --- a/test/unordered/transparent_tests.cpp +++ b/test/unordered/transparent_tests.cpp @@ -448,6 +448,19 @@ template void test_map_transparent_equal_range() BOOST_TEST_EQ(val.first.x_, 0); } + iters = map.equal_range(1); + + begin = iters.first; + end = iters.second; + + BOOST_TEST(begin != end); + BOOST_TEST(begin != map.end()); + BOOST_TEST_EQ(std::distance(begin, end), 1); + + value_type const& val = *begin; + BOOST_TEST_EQ(val.first, 1); + BOOST_TEST_EQ(val.second, 1338); + iters = map.equal_range(1337); begin = iters.first; @@ -480,6 +493,19 @@ template void test_map_transparent_equal_range() BOOST_TEST_EQ(val.first.x_, 0); } + iters = map.equal_range(1); + + begin = iters.first; + end = iters.second; + + BOOST_TEST(begin != end); + BOOST_TEST(begin != map.end()); + BOOST_TEST_EQ(std::distance(begin, end), 1); + + value_type const& val = *begin; + BOOST_TEST_EQ(val.first, 1); + BOOST_TEST_EQ(val.second, 1338); + iters = map.equal_range(1337); begin = iters.first; @@ -576,6 +602,19 @@ template void test_map_non_transparent_equal_range() BOOST_TEST_EQ(val.first.x_, 0); } + iters = map.equal_range(1); + + begin = iters.first; + end = iters.second; + + BOOST_TEST(begin != end); + BOOST_TEST(begin != map.end()); + BOOST_TEST_EQ(std::distance(begin, end), 1); + + value_type const& val = *begin; + BOOST_TEST_EQ(val.first, 1); + BOOST_TEST_EQ(val.second, 1338); + iters = map.equal_range(1337); begin = iters.first; @@ -585,8 +624,8 @@ template void test_map_non_transparent_equal_range() BOOST_TEST(begin == map.end()); BOOST_TEST_EQ(std::distance(begin, end), 0); - BOOST_TEST_EQ(key::count_, 2 + key_count); - key_count += 2; + BOOST_TEST_EQ(key::count_, 3 + key_count); + key_count += 3; } { @@ -609,6 +648,19 @@ template void test_map_non_transparent_equal_range() BOOST_TEST_EQ(val.first.x_, 0); } + iters = map.equal_range(1); + + begin = iters.first; + end = iters.second; + + BOOST_TEST(begin != end); + BOOST_TEST(begin != map.end()); + BOOST_TEST_EQ(std::distance(begin, end), 1); + + value_type const& val = *begin; + BOOST_TEST_EQ(val.first, 1); + BOOST_TEST_EQ(val.second, 1338); + iters = map.equal_range(1337); begin = iters.first; @@ -618,7 +670,7 @@ template void test_map_non_transparent_equal_range() BOOST_TEST(begin == map.end()); BOOST_TEST_EQ(std::distance(begin, end), 0); - BOOST_TEST_EQ(key::count_, 2 + key_count); + BOOST_TEST_EQ(key::count_, 3 + key_count); } } @@ -705,6 +757,17 @@ template void test_set_transparent_equal_range() BOOST_TEST_EQ(val, 0); } + iters = set.equal_range(1); + begin = iters.first; + end = iters.second; + + BOOST_TEST(begin != end); + BOOST_TEST(begin != set.end()); + BOOST_TEST_EQ(std::distance(begin, end), 1); + + value_type const& val = *begin; + BOOST_TEST_EQ(val, 1); + iters = set.equal_range(1337); begin = iters.first; @@ -737,6 +800,17 @@ template void test_set_transparent_equal_range() BOOST_TEST_EQ(val, 0); } + iters = set.equal_range(1); + begin = iters.first; + end = iters.second; + + BOOST_TEST(begin != end); + BOOST_TEST(begin != set.end()); + BOOST_TEST_EQ(std::distance(begin, end), 1); + + value_type const& val = *begin; + BOOST_TEST_EQ(val, 1); + iters = set.equal_range(1337); begin = iters.first; @@ -833,6 +907,17 @@ template void test_set_non_transparent_equal_range() BOOST_TEST_EQ(val, 0); } + iters = set.equal_range(1); + begin = iters.first; + end = iters.second; + + BOOST_TEST(begin != end); + BOOST_TEST(begin != set.end()); + BOOST_TEST_EQ(std::distance(begin, end), 1); + + value_type const& val = *begin; + BOOST_TEST_EQ(val, 1); + iters = set.equal_range(1337); begin = iters.first; @@ -842,8 +927,8 @@ template void test_set_non_transparent_equal_range() BOOST_TEST(begin == set.end()); BOOST_TEST_EQ(std::distance(begin, end), 0); - BOOST_TEST_EQ(key::count_, 2 + key_count); - key_count += 2; + BOOST_TEST_EQ(key::count_, 3 + key_count); + key_count += 3; } { @@ -866,6 +951,17 @@ template void test_set_non_transparent_equal_range() BOOST_TEST_EQ(val, 0); } + iters = set.equal_range(1); + begin = iters.first; + end = iters.second; + + BOOST_TEST(begin != end); + BOOST_TEST(begin != set.end()); + BOOST_TEST_EQ(std::distance(begin, end), 1); + + value_type const& val = *begin; + BOOST_TEST_EQ(val, 1); + iters = set.equal_range(1337); begin = iters.first; @@ -875,7 +971,7 @@ template void test_set_non_transparent_equal_range() BOOST_TEST(begin == set.end()); BOOST_TEST_EQ(std::distance(begin, end), 0); - BOOST_TEST_EQ(key::count_, 2 + key_count); + BOOST_TEST_EQ(key::count_, 3 + key_count); } } From 2656bfbcaceefcf3145c737d3212fb322b03b995 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Wed, 29 Dec 2021 10:24:56 -0800 Subject: [PATCH 2/3] Add transparent test support for multiset's `equal_range()` --- test/unordered/transparent_tests.cpp | 38 ++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/test/unordered/transparent_tests.cpp b/test/unordered/transparent_tests.cpp index f5fd483f..3f7871f4 100644 --- a/test/unordered/transparent_tests.cpp +++ b/test/unordered/transparent_tests.cpp @@ -1481,10 +1481,48 @@ void test_unordered_set() } } +void test_unordered_multiset() +{ + { + typedef boost::unordered_multiset + unordered_set; + + test_set_transparent_equal_range(); + } + + { + // non-transparent Hash, non-transparent KeyEqual + // + typedef boost::unordered_multiset unordered_set; + + test_set_non_transparent_equal_range(); + } + + { + // transparent Hash, non-transparent KeyEqual + // + typedef boost::unordered_multiset + unordered_set; + + test_set_non_transparent_equal_range(); + } + + { + // non-transparent Hash, transparent KeyEqual + // + typedef boost::unordered_multiset + unordered_set; + + test_set_non_transparent_equal_range(); + } +} + UNORDERED_AUTO_TEST (transparent_ops) { test_unordered_map(); test_unordered_multimap(); test_unordered_set(); + test_unordered_multiset(); } RUN_TESTS() From f813bbdf86b9d929d1219a40f697162d563d511e Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Wed, 29 Dec 2021 10:25:09 -0800 Subject: [PATCH 3/3] Implement heterogeneous `equal_range()` for multiset --- include/boost/unordered/unordered_set.hpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/include/boost/unordered/unordered_set.hpp b/include/boost/unordered/unordered_set.hpp index 75003bf4..f710c702 100644 --- a/include/boost/unordered/unordered_set.hpp +++ b/include/boost/unordered/unordered_set.hpp @@ -1063,6 +1063,19 @@ namespace boost { std::pair equal_range( const key_type&) const; + template + typename boost::enable_if_c::value, + std::pair >::type + equal_range(const Key& k) const + { + node_pointer n = table_.find_node_impl( + table::policy::apply_hash(this->hash_function(), k), k, + this->key_eq()); + + return std::make_pair( + const_iterator(n), const_iterator(n ? table_.next_group(n) : n)); + } + // bucket interface size_type bucket_count() const BOOST_NOEXCEPT