From a87277c6e809f5526b792c3467188d8f184da580 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Wed, 12 Jan 2022 15:47:25 -0800 Subject: [PATCH 1/2] Add tests for `unordered_set::contains()` --- test/unordered/contains_tests.cpp | 78 +++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/test/unordered/contains_tests.cpp b/test/unordered/contains_tests.cpp index 032b1677..45bc59d9 100644 --- a/test/unordered/contains_tests.cpp +++ b/test/unordered/contains_tests.cpp @@ -169,9 +169,87 @@ void test_multimap() test_map_non_transparent_contains(); } +template void test_set_transparent_contains() +{ + count_reset(); + + UnorderedSet set; + bool contains = set.contains(0); + BOOST_TEST(!contains); + + BOOST_TEST_EQ(key::count_, 0); + + set.insert(0); + set.insert(0); + set.insert(0); + set.insert(1); + + int const expected_key_count = key::count_; + + contains = set.contains(0); + BOOST_TEST(contains); + + contains = set.contains(1); + BOOST_TEST(contains); + + contains = set.contains(2); + BOOST_TEST(!contains); + + BOOST_TEST_EQ(key::count_, expected_key_count); +} + +template void test_set_non_transparent_contains() +{ + count_reset(); + + UnorderedSet set; + bool contains = set.contains(0); + BOOST_TEST(!contains); + BOOST_TEST_EQ(key::count_, 1); + + set.insert(0); + set.insert(0); + set.insert(0); + set.insert(1); + + int key_count = key::count_; + + contains = set.contains(0); + ++key_count; + BOOST_TEST(contains); + + contains = set.contains(1); + ++key_count; + BOOST_TEST(contains); + + contains = set.contains(2); + ++key_count; + BOOST_TEST(!contains); + + BOOST_TEST_EQ(key::count_, key_count); +} + +void test_set() +{ + typedef boost::unordered_set + transparent_set; + + typedef boost::unordered_set + non_transparent_set1; + typedef boost::unordered_set + non_transparent_set2; + typedef boost::unordered_set non_transparent_set3; + + test_set_transparent_contains(); + test_set_non_transparent_contains(); + test_set_non_transparent_contains(); + test_set_non_transparent_contains(); +} + UNORDERED_AUTO_TEST (contains) { test_map(); test_multimap(); + test_set(); } RUN_TESTS() From f5d470c53179059b003fbd001e5a748bdb474947 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Wed, 12 Jan 2022 15:47:34 -0800 Subject: [PATCH 2/2] Implement `unordered_set::contains()` --- include/boost/unordered/unordered_set.hpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/include/boost/unordered/unordered_set.hpp b/include/boost/unordered/unordered_set.hpp index c66fef7e..0210056d 100644 --- a/include/boost/unordered/unordered_set.hpp +++ b/include/boost/unordered/unordered_set.hpp @@ -507,6 +507,23 @@ namespace boost { const_iterator find(CompatibleKey const&, CompatibleHash const&, CompatiblePredicate const&) const; + bool contains(key_type const& k) const + { + return table_.find_node_impl( + table::policy::apply_hash(this->hash_function(), k), k, + this->key_eq()); + } + + template + typename boost::enable_if_c::value, + bool>::type + contains(const Key& k) const + { + return table_.find_node_impl( + table::policy::apply_hash(this->hash_function(), k), k, + this->key_eq()); + } + size_type count(const key_type&) const; template