From f0d10308e3001fe4f66de050b11271cd863557e1 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Tue, 14 Feb 2023 10:26:57 -0800 Subject: [PATCH] Add foa-based node containers to insert_tests --- test/unordered/insert_tests.cpp | 461 +++++++++++++++++++++----------- 1 file changed, 312 insertions(+), 149 deletions(-) diff --git a/test/unordered/insert_tests.cpp b/test/unordered/insert_tests.cpp index f59d5acd..44c34ab8 100644 --- a/test/unordered/insert_tests.cpp +++ b/test/unordered/insert_tests.cpp @@ -1,6 +1,6 @@ // Copyright 2006-2010 Daniel James. -// Copyright (C) 2022 Christian Mazakas +// Copyright (C) 2022-2023 Christian Mazakas // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -17,6 +17,7 @@ #include "../helpers/input_iterator.hpp" #include "../helpers/helpers.hpp" +#include #include namespace insert_tests { @@ -693,6 +694,69 @@ namespace insert_tests { BOOST_TEST_EQ(x.size(), 1000u); } + struct pointer_constructible + { + int x; + + pointer_constructible(int x_) : x(x_) {} + pointer_constructible(pointer_constructible const& p) : x(p.x) {} + pointer_constructible(pointer_constructible* const&) : x(-1) {} + pointer_constructible(BOOST_RV_REF(pointer_constructible*)) : x(-1) {} + }; + + struct pointer_constructible_hash + { + typedef void is_transparent; + + std::size_t operator()(pointer_constructible const& p) const + { + return boost::hash()(p.x); + } + }; + + struct pointer_constructible_equal_to + { + typedef void is_transparent; + + bool operator()( + pointer_constructible const& lhs, pointer_constructible const& rhs) const + { + return lhs.x == rhs.x; + } + }; + + template + static void set_tests2(X*) + { + X set, set2; + + pointer_constructible pc(1337); + pointer_constructible* const addr_pc = &pc; + + set.insert(pc); // 1337 + set.insert(&pc); // -1 + set.insert(addr_pc); // -1 + + BOOST_TEST_EQ(set.size(), 2u); + BOOST_TEST(set.find(pc) != set.end()); + BOOST_TEST(set.find(-1) != set.end()); + BOOST_TEST(set.find(-2) == set.end()); + + set2 = set; + + BOOST_TEST_EQ(set2.size(), 2u); + BOOST_TEST(set2.find(pc) != set2.end()); + BOOST_TEST(set2.find(-1) != set2.end()); + BOOST_TEST(set2.find(-2) == set2.end()); + + set.rehash(set.bucket_count() + 1); + + BOOST_TEST_EQ(set.size(), 2u); + BOOST_TEST(set.find(pc) != set.end()); + BOOST_TEST(set.find(-1) != set.end()); + BOOST_TEST(set.find(-2) == set.end()); + } + template void try_emplace_tests(X*, test::random_generator generator) { @@ -892,45 +956,62 @@ namespace insert_tests { #ifdef BOOST_UNORDERED_FOA_TESTS boost::unordered_flat_set >* test_set_std_alloc; + boost::unordered_node_set >* test_node_set_std_alloc; boost::unordered_flat_set >* test_set; + boost::unordered_node_set >* test_node_set; boost::unordered_flat_map >* test_map; + boost::unordered_node_map >* test_node_map; + + boost::unordered_flat_set >* + test_pc_set; + boost::unordered_node_set >* + test_pc_node_set; UNORDERED_TEST(unique_insert_tests1, - ((test_set_std_alloc)(test_set)(test_map))( + ((test_set_std_alloc)(test_node_set_std_alloc) + (test_set)(test_node_set)(test_map)(test_node_map))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST( - insert_tests2, ((test_set)(test_map))( + insert_tests2, ((test_set)(test_node_set)(test_map)(test_node_map))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(unique_emplace_tests1, - ((test_set_std_alloc)(test_set)(test_map))( + ((test_set_std_alloc)(test_set)(test_node_set)(test_map)(test_node_map))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(move_emplace_tests, - ((test_set_std_alloc)(test_set)(test_map))( + ((test_set_std_alloc)(test_set)(test_node_set)(test_map)(test_node_map))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(default_emplace_tests, - ((test_set_std_alloc)(test_set)(test_map))( + ((test_set_std_alloc)(test_set)(test_node_set)(test_map)(test_node_map))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(map_tests, - ((test_map))((default_generator)(generate_collisions)(limited_range))) + ((test_map)(test_node_map)) + ((default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST( - map_tests2, ((test_map))((default_generator)(generate_collisions))) + map_tests2, ((test_map)(test_node_map))((default_generator)(generate_collisions))) UNORDERED_TEST(map_insert_range_test1, - ((test_map))((default_generator)(generate_collisions)(limited_range))) + ((test_map)(test_node_map))((default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(map_insert_range_test2, - ((test_map))((default_generator)(generate_collisions)(limited_range))) + ((test_map)(test_node_map))((default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST( - set_tests, ((test_set_std_alloc)(test_set))((default_generator))) + set_tests, ((test_set_std_alloc)(test_set)(test_node_set))((default_generator))) + + UNORDERED_TEST(set_tests2, ((test_pc_set)(test_pc_node_set))) #else boost::unordered_set >* test_set_std_alloc; @@ -946,6 +1027,10 @@ namespace insert_tests { boost::unordered_multimap >* test_multimap; + boost::unordered_set >* + test_pc_set; + UNORDERED_TEST(unique_insert_tests1, ((test_set_std_alloc)(test_set)(test_map))( (default_generator)(generate_collisions)(limited_range))) @@ -990,6 +1075,8 @@ namespace insert_tests { UNORDERED_TEST( set_tests, ((test_set_std_alloc)(test_set)(test_multiset))((default_generator))) + + UNORDERED_TEST(set_tests2, ((test_pc_set))) #endif #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) @@ -1009,23 +1096,19 @@ namespace insert_tests { } }; - UNORDERED_AUTO_TEST (insert_initializer_list_set) { -#ifdef BOOST_UNORDERED_FOA_TESTS - boost::unordered_flat_set set; -#else - boost::unordered_set set; -#endif + template