diff --git a/include/boost/unordered/unordered_flat_map.hpp b/include/boost/unordered/unordered_flat_map.hpp index 449dec0e..426391fb 100644 --- a/include/boost/unordered/unordered_flat_map.hpp +++ b/include/boost/unordered/unordered_flat_map.hpp @@ -11,6 +11,7 @@ #endif #include +#include #include #include @@ -332,11 +333,38 @@ namespace boost { return table_.find(key); } + template + typename std::enable_if< + boost::unordered::detail::are_transparent::value, + iterator>::type + find(K const& key) + { + return table_.find(key); + } + + template + typename std::enable_if< + boost::unordered::detail::are_transparent::value, + const_iterator>::type + find(K const& key) const + { + return table_.find(key); + } + bool contains(key_type const& key) const { return this->find(key) != this->end(); } + template + typename std::enable_if< + boost::unordered::detail::are_transparent::value, + bool>::type + contains(K const& key) const + { + return this->find(key) != this->end(); + } + std::pair equal_range(key_type const& key) { auto pos = table_.find(key); diff --git a/include/boost/unordered/unordered_flat_set.hpp b/include/boost/unordered/unordered_flat_set.hpp index 6b1cbe69..1b48a1a1 100644 --- a/include/boost/unordered/unordered_flat_set.hpp +++ b/include/boost/unordered/unordered_flat_set.hpp @@ -11,6 +11,7 @@ #endif #include +#include #include #include @@ -229,6 +230,38 @@ namespace boost { return table_.find(key); } + template + typename std::enable_if< + boost::unordered::detail::are_transparent::value, + iterator>::type + find(K const& key) + { + return table_.find(key); + } + + template + typename std::enable_if< + boost::unordered::detail::are_transparent::value, + const_iterator>::type + find(K const& key) const + { + return table_.find(key); + } + + bool contains(key_type const& key) const + { + return this->find(key) != this->end(); + } + + template + typename std::enable_if< + boost::unordered::detail::are_transparent::value, + bool>::type + contains(K const& key) const + { + return this->find(key) != this->end(); + } + std::pair equal_range(key_type const& key) { auto pos = table_.find(key); diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 40839d14..f1425155 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -114,4 +114,5 @@ build_foa find_tests ; build_foa at_tests ; build_foa load_factor_tests ; build_foa rehash_tests ; +build_foa contains_tests ; build_foa equality_tests ; diff --git a/test/unordered/contains_tests.cpp b/test/unordered/contains_tests.cpp index 01654479..39302e17 100644 --- a/test/unordered/contains_tests.cpp +++ b/test/unordered/contains_tests.cpp @@ -4,8 +4,14 @@ // clang-format off #include "../helpers/prefix.hpp" +#ifdef BOOST_UNORDERED_FOA_TESTS +#include +#include +#include +#else #include #include +#endif #include "../helpers/postfix.hpp" // clang-format on @@ -129,6 +135,20 @@ template void test_map_non_transparent_contains() void test_map() { +#ifdef BOOST_UNORDERED_FOA_TESTS + typedef boost::unordered_flat_map + transparent_map; + + typedef boost::unordered_flat_map + non_transparent_map1; + + typedef boost::unordered_flat_map + non_transparent_map2; + + typedef boost::unordered_flat_map + non_transparent_map3; +#else typedef boost::unordered_map transparent_map; @@ -141,6 +161,7 @@ void test_map() typedef boost::unordered_map non_transparent_map3; +#endif test_map_transparent_contains(); test_map_non_transparent_contains(); @@ -148,6 +169,7 @@ void test_map() test_map_non_transparent_contains(); } +#ifndef BOOST_UNORDERED_FOA_TESTS void test_multimap() { typedef boost::unordered_multimap(); test_map_non_transparent_contains(); } +#endif template void test_set_transparent_contains() { @@ -231,6 +254,18 @@ template void test_set_non_transparent_contains() void test_set() { +#ifdef BOOST_UNORDERED_FOA_TESTS + typedef boost::unordered_flat_set + transparent_set; + + typedef boost::unordered_flat_set + non_transparent_set1; + typedef boost::unordered_flat_set + non_transparent_set2; + typedef boost::unordered_flat_set + non_transparent_set3; +#else typedef boost::unordered_set transparent_set; @@ -239,6 +274,7 @@ void test_set() typedef boost::unordered_set non_transparent_set2; typedef boost::unordered_set non_transparent_set3; +#endif test_set_transparent_contains(); test_set_non_transparent_contains(); @@ -246,6 +282,7 @@ void test_set() test_set_non_transparent_contains(); } +#ifndef BOOST_UNORDERED_FOA_TESTS void test_multiset() { typedef boost::unordered_multiset(); test_set_non_transparent_contains(); } +#endif UNORDERED_AUTO_TEST (contains_) { // avoid -Wshadow warning with `bool contains` test_map(); - test_multimap(); test_set(); +#ifndef BOOST_UNORDERED_FOA_TESTS + test_multimap(); + test_multiset(); +#endif } RUN_TESTS()