diff --git a/include/boost/unordered/unordered_flat_map.hpp b/include/boost/unordered/unordered_flat_map.hpp index f415b038..ea90c7e6 100644 --- a/include/boost/unordered/unordered_flat_map.hpp +++ b/include/boost/unordered/unordered_flat_map.hpp @@ -48,10 +48,8 @@ namespace boost { static moved_type move(value_type& x) { // TODO: we probably need to launder here - return { - std::move(const_cast(x.first)), - std::move(const_cast(x.second)) - }; + return {std::move(const_cast(x.first)), + std::move(const_cast(x.second))}; } }; @@ -61,6 +59,10 @@ namespace boost { table_type table_; + template + typename unordered_flat_map::size_type friend erase_if( + unordered_flat_map& set, Pred pred); + public: using key_type = Key; using mapped_type = T; @@ -572,6 +574,15 @@ namespace boost { { lhs.swap(rhs); } + + template + typename unordered_flat_map::size_type + erase_if( + unordered_flat_map& map, Pred pred) + { + return erase_if(map.table_, pred); + } } // namespace unordered } // namespace boost diff --git a/include/boost/unordered/unordered_flat_set.hpp b/include/boost/unordered/unordered_flat_set.hpp index 7c0fe941..fde8605c 100644 --- a/include/boost/unordered/unordered_flat_set.hpp +++ b/include/boost/unordered/unordered_flat_set.hpp @@ -42,6 +42,10 @@ namespace boost { table_type table_; + template + typename unordered_flat_set::size_type friend erase_if( + unordered_flat_set& set, Pred pred); + public: using key_type = Key; using value_type = typename set_types::value_type; @@ -453,6 +457,14 @@ namespace boost { { lhs.swap(rhs); } + + template + typename unordered_flat_set::size_type + erase_if(unordered_flat_set& set, Pred pred) + { + return erase_if(set.table_, pred); + } } // namespace unordered } // namespace boost diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 06a69bf8..c33da46c 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -129,3 +129,4 @@ build_foa swap_tests ; build_foa transparent_tests ; build_foa reserve_tests ; build_foa contains_tests ; +build_foa erase_if ; diff --git a/test/unordered/erase_if.cpp b/test/unordered/erase_if.cpp index cad9bce7..cc4bcd5c 100644 --- a/test/unordered/erase_if.cpp +++ b/test/unordered/erase_if.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 @@ -112,11 +118,16 @@ template void test_set_erase_if() } UNORDERED_AUTO_TEST (unordered_erase_if) { +#ifdef BOOST_UNORDERED_FOA_TESTS + test_map_erase_if >(); + test_set_erase_if >(); +#else test_map_erase_if >(); test_map_erase_if >(); test_set_erase_if >(); test_set_erase_if >(); +#endif } RUN_TESTS()