diff --git a/include/boost/unordered/unordered_flat_map.hpp b/include/boost/unordered/unordered_flat_map.hpp index 3c687124..6a58269a 100644 --- a/include/boost/unordered/unordered_flat_map.hpp +++ b/include/boost/unordered/unordered_flat_map.hpp @@ -295,6 +295,12 @@ namespace boost { return table_.erase(key); } + void swap(unordered_flat_map& rhs) noexcept( + noexcept(std::declval().swap(std::declval()))) + { + table_.swap(rhs.table_); + } + /// Lookup /// @@ -493,6 +499,14 @@ namespace boost { { return !(lhs == rhs); } + + template + void swap(unordered_flat_map& lhs, + unordered_flat_map& rhs) + noexcept(noexcept(lhs.swap(rhs))) + { + lhs.swap(rhs); + } } // namespace unordered } // namespace boost diff --git a/include/boost/unordered/unordered_flat_set.hpp b/include/boost/unordered/unordered_flat_set.hpp index 297e4554..83b57484 100644 --- a/include/boost/unordered/unordered_flat_set.hpp +++ b/include/boost/unordered/unordered_flat_set.hpp @@ -223,6 +223,12 @@ namespace boost { return table_.erase(key); } + void swap(unordered_flat_set& rhs) noexcept( + noexcept(std::declval().swap(std::declval()))) + { + table_.swap(rhs.table_); + } + /// Lookup /// @@ -390,6 +396,14 @@ namespace boost { { return !(lhs == rhs); } + + template + void swap(unordered_flat_set& lhs, + unordered_flat_set& rhs) + noexcept(noexcept(lhs.swap(rhs))) + { + lhs.swap(rhs); + } } // namespace unordered } // namespace boost diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 628553a6..c86df6f2 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -114,6 +114,7 @@ build_foa find_tests ; build_foa at_tests ; build_foa load_factor_tests ; build_foa rehash_tests ; +build_foa equality_tests ; +build_foa swap_tests ; build_foa transparent_tests ; build_foa contains_tests ; -build_foa equality_tests ; diff --git a/test/unordered/swap_tests.cpp b/test/unordered/swap_tests.cpp index 9a7106ef..ed7feade 100644 --- a/test/unordered/swap_tests.cpp +++ b/test/unordered/swap_tests.cpp @@ -5,8 +5,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 @@ -139,6 +145,53 @@ namespace swap_tests { } } + using test::default_generator; + using test::generate_collisions; + using test::limited_range; + + template bool is_propagate(T*) + { + return T::allocator_type::is_propagate_on_swap; + } + +#ifdef BOOST_UNORDERED_FOA_TESTS + boost::unordered_flat_map >* test_map_std_alloc; + + boost::unordered_flat_set >* test_set; + boost::unordered_flat_map >* test_map; + + boost::unordered_flat_set >* + test_set_prop_swap; + boost::unordered_flat_map >* + test_map_prop_swap; + + boost::unordered_flat_set >* + test_set_no_prop_swap; + boost::unordered_flat_map >* + test_map_no_prop_swap; + + UNORDERED_AUTO_TEST (check_traits) { + BOOST_TEST(!is_propagate(test_set)); + BOOST_TEST(is_propagate(test_set_prop_swap)); + BOOST_TEST(!is_propagate(test_set_no_prop_swap)); + } + + UNORDERED_TEST(swap_tests1, + ((test_map_std_alloc)(test_set)(test_map)(test_set_prop_swap)(test_map_prop_swap)(test_set_no_prop_swap)(test_map_no_prop_swap))( + (default_generator)(generate_collisions)(limited_range))) + + UNORDERED_TEST(swap_tests2, + ((test_set)(test_map)(test_set_prop_swap)(test_map_prop_swap)(test_set_no_prop_swap)(test_map_no_prop_swap))( + (default_generator)(generate_collisions)(limited_range))) +#else boost::unordered_map >* test_map_std_alloc; @@ -178,15 +231,6 @@ namespace swap_tests { test::cxx11_allocator >* test_multimap_no_prop_swap; - template bool is_propagate(T*) - { - return T::allocator_type::is_propagate_on_swap; - } - - using test::default_generator; - using test::generate_collisions; - using test::limited_range; - UNORDERED_AUTO_TEST (check_traits) { BOOST_TEST(!is_propagate(test_set)); BOOST_TEST(is_propagate(test_set_prop_swap)); @@ -207,5 +251,6 @@ namespace swap_tests { test_set_no_prop_swap)(test_multiset_no_prop_swap)(test_map_no_prop_swap)( test_multimap_no_prop_swap))( (default_generator)(generate_collisions)(limited_range))) +#endif } RUN_TESTS()