From d3ef0b9a4f6b6fffe913a5da9ffd40dbfe80492c Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Fri, 7 Oct 2022 10:56:35 -0700 Subject: [PATCH] Add rehash tests --- .../boost/unordered/unordered_flat_map.hpp | 4 ++ .../boost/unordered/unordered_flat_set.hpp | 4 ++ test/Jamfile.v2 | 1 + test/unordered/rehash_tests.cpp | 66 +++++++++++++++++-- 4 files changed, 71 insertions(+), 4 deletions(-) diff --git a/include/boost/unordered/unordered_flat_map.hpp b/include/boost/unordered/unordered_flat_map.hpp index de48a22d..644b1991 100644 --- a/include/boost/unordered/unordered_flat_map.hpp +++ b/include/boost/unordered/unordered_flat_map.hpp @@ -371,6 +371,10 @@ namespace boost { void max_load_factor(float) {} + void rehash(size_type count) { table_.rehash(count); } + + void reserve(size_type count) { table_.reserve(count); } + /// Observers /// diff --git a/include/boost/unordered/unordered_flat_set.hpp b/include/boost/unordered/unordered_flat_set.hpp index 612c8b2e..45f19cd0 100644 --- a/include/boost/unordered/unordered_flat_set.hpp +++ b/include/boost/unordered/unordered_flat_set.hpp @@ -268,6 +268,10 @@ namespace boost { void max_load_factor(float) {} + void rehash(size_type count) { table_.rehash(count); } + + void reserve(size_type count) { table_.reserve(count); } + /// Observers /// diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 332b3a21..520ea811 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -112,3 +112,4 @@ build_foa emplace_tests ; build_foa erase_tests ; build_foa find_tests ; build_foa at_tests ; +build_foa rehash_tests ; diff --git a/test/unordered/rehash_tests.cpp b/test/unordered/rehash_tests.cpp index 4eb5598b..6258e08c 100644 --- a/test/unordered/rehash_tests.cpp +++ b/test/unordered/rehash_tests.cpp @@ -5,8 +5,13 @@ // clang-format off #include "../helpers/prefix.hpp" +#ifdef BOOST_UNORDERED_FOA_TESTS +#include +#include +#else #include #include +#endif #include "../helpers/postfix.hpp" // clang-format on @@ -151,8 +156,13 @@ namespace rehash_tests { BOOST_TEST_EQ(x.size(), 0u); BOOST_TEST_EQ(test::detail::tracker.count_allocations, 0u); +#ifdef BOOST_UNORDERED_FOA_TESTS + float const mlf = boost::unordered::detail::foa::mlf; + x.max_load_factor(max_load_factors[i]); +#else float const mlf = max_load_factors[i]; x.max_load_factor(mlf); +#endif { BOOST_TEST_EQ(x.bucket_count(), 0u); @@ -419,6 +429,15 @@ namespace rehash_tests { X x; x.max_load_factor(0.25); +#ifdef BOOST_UNORDERED_FOA_TESTS + x.reserve(10000); + BOOST_TEST(x.bucket_count() >= 10000); + + x.reserve(0); + + x.reserve(10000000); + BOOST_TEST(x.bucket_count() >= 10000000); +#else x.reserve(10000); BOOST_TEST(x.bucket_count() >= 40000); @@ -426,6 +445,7 @@ namespace rehash_tests { x.reserve(10000000); BOOST_TEST(x.bucket_count() >= 40000000); +#endif } template void reserve_test1(X*, test::random_generator generator) @@ -486,6 +506,47 @@ namespace rehash_tests { } } + using test::default_generator; + using test::generate_collisions; + using test::limited_range; + +#ifdef BOOST_UNORDERED_FOA_TESTS + boost::unordered_flat_set* int_set_ptr; + boost::unordered_flat_map >* test_map_ptr; + + boost::unordered_flat_set >* test_set_tracking; + boost::unordered_flat_map > >* + test_map_tracking; + + UNORDERED_TEST(rehash_empty_test1, ((int_set_ptr)(test_map_ptr))) + UNORDERED_TEST(rehash_empty_test2, + ((int_set_ptr)(test_map_ptr))( + (default_generator)(generate_collisions)(limited_range))) + UNORDERED_TEST(rehash_empty_test3, + ((int_set_ptr)(test_map_ptr))( + (default_generator)(generate_collisions)(limited_range))) + UNORDERED_TEST( + rehash_test1, ((int_set_ptr)(test_map_ptr))( + (default_generator)(generate_collisions)(limited_range))) + UNORDERED_TEST(reserve_empty_test1, ((int_set_ptr)(test_map_ptr))) + UNORDERED_TEST(reserve_empty_test2, ((int_set_ptr)(test_map_ptr))) + UNORDERED_TEST( + reserve_test1, ((int_set_ptr)(test_map_ptr))( + (default_generator)(generate_collisions)(limited_range))) + UNORDERED_TEST( + reserve_test2, ((int_set_ptr)(test_map_ptr))( + (default_generator)(generate_collisions)(limited_range))) + UNORDERED_TEST(rehash_empty_tracking, + ((test_set_tracking)(test_map_tracking))( + (default_generator)(generate_collisions)(limited_range))) + UNORDERED_TEST(rehash_nonempty_tracking, + ((test_set_tracking)(test_map_tracking))( + (default_generator)(generate_collisions)(limited_range))) +#else boost::unordered_set* int_set_ptr; boost::unordered_multiset >* test_multiset_ptr; @@ -505,10 +566,6 @@ namespace rehash_tests { test::allocator1 > >* test_multimap_tracking; - using test::default_generator; - using test::generate_collisions; - using test::limited_range; - UNORDERED_TEST(rehash_empty_test1, ((int_set_ptr)(test_multiset_ptr)(test_map_ptr)(int_multimap_ptr))) UNORDERED_TEST(rehash_empty_test2, @@ -536,6 +593,7 @@ namespace rehash_tests { UNORDERED_TEST(rehash_nonempty_tracking, ((test_set_tracking)(test_multiset_tracking)(test_map_tracking)(test_multimap_tracking))( (default_generator)(generate_collisions)(limited_range))) +#endif } RUN_TESTS()