// Copyright 2021-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) #include "../helpers/unordered.hpp" #include "../helpers/test.hpp" struct key { int x_; static int count_; key(int x) : x_(x) { ++count_; } key(key const& k) : x_(k.x_) { ++count_; } }; int key::count_; std::ostream& operator<<(std::ostream& os, key const& k) { os << "key { x_: " << k.x_ << " }"; return os; } bool operator==(key const& k, int const x) { return k.x_ == x; } bool operator==(int const x, key const& k) { return k.x_ == x; } struct transparent_hasher { typedef void is_transparent; std::size_t operator()(key const& k) const { return boost::hash()(k.x_); } std::size_t operator()(int const k) const { return boost::hash()(k); } }; struct transparent_key_equal { typedef void is_transparent; bool operator()(key const& k1, key const& k2) const { return k1.x_ == k2.x_; } bool operator()(int const x, key const& k1) const { return k1 == x; } bool operator()(key const& k1, int const x) const { return k1 == x; } }; struct hasher { std::size_t operator()(key const& k) const { return boost::hash()(k.x_); } }; struct key_equal { bool operator()(key const& k1, key const& k2) const { return k1.x_ == k2.x_; } }; void count_reset() { key::count_ = 0; } template void test_map_transparent_contains() { count_reset(); UnorderedMap map; bool contains = map.contains(0); BOOST_TEST(!contains); BOOST_TEST_EQ(key::count_, 0); map.insert(std::make_pair(0, 1337)); map.insert(std::make_pair(0, 1338)); map.insert(std::make_pair(0, 1339)); map.insert(std::make_pair(1, 1340)); int const expected_key_count = key::count_; contains = map.contains(0); BOOST_TEST(contains); contains = map.contains(1); BOOST_TEST(contains); contains = map.contains(2); BOOST_TEST(!contains); BOOST_TEST_EQ(key::count_, expected_key_count); } template void test_map_non_transparent_contains() { count_reset(); UnorderedMap map; bool contains = map.contains(0); BOOST_TEST(!contains); BOOST_TEST_EQ(key::count_, 1); map.insert(std::make_pair(0, 1337)); map.insert(std::make_pair(0, 1338)); map.insert(std::make_pair(0, 1339)); map.insert(std::make_pair(1, 1340)); int key_count = key::count_; contains = map.contains(0); ++key_count; BOOST_TEST(contains); contains = map.contains(1); ++key_count; BOOST_TEST(contains); contains = map.contains(2); ++key_count; BOOST_TEST(!contains); BOOST_TEST_EQ(key::count_, key_count); } 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; typedef boost::unordered_node_map transparent_node_map; typedef boost::unordered_node_map non_transparent_node_map1; typedef boost::unordered_node_map non_transparent_node_map2; typedef boost::unordered_node_map non_transparent_node_map3; test_map_transparent_contains(); test_map_non_transparent_contains(); test_map_non_transparent_contains(); test_map_non_transparent_contains(); #else typedef boost::unordered_map transparent_map; typedef boost::unordered_map non_transparent_map1; typedef boost::unordered_map non_transparent_map2; typedef boost::unordered_map non_transparent_map3; #endif test_map_transparent_contains(); test_map_non_transparent_contains(); test_map_non_transparent_contains(); test_map_non_transparent_contains(); } #ifndef BOOST_UNORDERED_FOA_TESTS void test_multimap() { typedef boost::unordered_multimap transparent_multimap; typedef boost::unordered_multimap non_transparent_multimap1; typedef boost::unordered_multimap non_transparent_multimap2; typedef boost::unordered_multimap non_transparent_multimap3; test_map_transparent_contains(); test_map_non_transparent_contains(); test_map_non_transparent_contains(); test_map_non_transparent_contains(); } #endif template void test_set_transparent_contains() { count_reset(); UnorderedSet set; bool contains = set.contains(0); BOOST_TEST(!contains); BOOST_TEST_EQ(key::count_, 0); set.insert(0); set.insert(0); set.insert(0); set.insert(1); int const expected_key_count = key::count_; contains = set.contains(0); BOOST_TEST(contains); contains = set.contains(1); BOOST_TEST(contains); contains = set.contains(2); BOOST_TEST(!contains); BOOST_TEST_EQ(key::count_, expected_key_count); } template void test_set_non_transparent_contains() { count_reset(); UnorderedSet set; bool contains = set.contains(0); BOOST_TEST(!contains); BOOST_TEST_EQ(key::count_, 1); set.insert(0); set.insert(0); set.insert(0); set.insert(1); int key_count = key::count_; contains = set.contains(0); ++key_count; BOOST_TEST(contains); contains = set.contains(1); ++key_count; BOOST_TEST(contains); contains = set.contains(2); ++key_count; BOOST_TEST(!contains); BOOST_TEST_EQ(key::count_, key_count); } 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; typedef boost::unordered_node_set transparent_node_set; typedef boost::unordered_node_set non_transparent_node_set1; typedef boost::unordered_node_set non_transparent_node_set2; typedef boost::unordered_node_set non_transparent_node_set3; test_set_transparent_contains(); test_set_non_transparent_contains(); test_set_non_transparent_contains(); test_set_non_transparent_contains(); #else typedef boost::unordered_set transparent_set; typedef boost::unordered_set non_transparent_set1; typedef boost::unordered_set non_transparent_set2; typedef boost::unordered_set non_transparent_set3; #endif test_set_transparent_contains(); test_set_non_transparent_contains(); test_set_non_transparent_contains(); test_set_non_transparent_contains(); } #ifndef BOOST_UNORDERED_FOA_TESTS void test_multiset() { typedef boost::unordered_multiset transparent_multiset; typedef boost::unordered_multiset non_transparent_multiset1; typedef boost::unordered_multiset non_transparent_multiset2; typedef boost::unordered_multiset non_transparent_multiset3; test_set_transparent_contains(); test_set_non_transparent_contains(); test_set_non_transparent_contains(); test_set_non_transparent_contains(); } #endif UNORDERED_AUTO_TEST (contains_) { // avoid -Wshadow warning with `bool contains` test_map(); test_set(); #ifndef BOOST_UNORDERED_FOA_TESTS test_multimap(); test_multiset(); #endif } RUN_TESTS()