1// Copyright 2021-2022 Christian Mazakas.
2// Distributed under the Boost Software License, Version 1.0. (See accompanying
3// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
4
5#include "../helpers/unordered.hpp"
6
7#include "../helpers/test.hpp"
8
9#include <boost/config.hpp>
10#include <string>
11
12#define UNORDERED_LVALUE_QUAL &
13
14namespace test {
15 struct is_even
16 {
17 bool operator()(std::pair<std::string const, int>& key_value)
18 {
19 int const v = key_value.second;
20 return (v % 2 == 0);
21 }
22
23 bool operator()(int const& value)
24 {
25 int const v = value;
26 return (v % 2 == 0);
27 }
28 };
29
30 struct is_too_large
31 {
32 bool operator()(std::pair<std::string const, int>& key_value)
33 {
34 int const v = key_value.second;
35 return v >= 1000;
36 }
37
38 bool operator()(int const& value)
39 {
40 int const v = value;
41 return v >= 1000;
42 }
43 };
44
45} // namespace test
46
47template <class UnorderedMap> void test_map_erase_if()
48{
49 typedef UnorderedMap map_type;
50 typedef typename map_type::size_type size_type;
51
52 map_type map;
53 size_type num_erased = erase_if(map, test::is_even());
54 BOOST_TEST(map.empty());
55 BOOST_TEST_EQ(num_erased, 0u);
56
57 map.emplace("a", 1);
58 map.emplace("b", 2);
59 map.emplace("b", 4);
60 map.emplace("b", 8);
61 map.emplace("b", 16);
62 map.emplace("c", 3);
63
64 size_type size = map.size();
65
66 num_erased = erase_if(map, test::is_too_large());
67
68 BOOST_TEST_EQ(map.size(), size);
69 BOOST_TEST_EQ(num_erased, 0u);
70
71 num_erased = erase_if(map, test::is_even());
72 BOOST_TEST_EQ(map.size(), 2u);
73 BOOST_TEST_EQ(num_erased, size - map.size());
74}
75
76template <class UnorderedSet> void test_set_erase_if()
77{
78 typedef UnorderedSet set_type;
79 typedef typename set_type::size_type size_type;
80
81 set_type set;
82 size_type num_erased = erase_if(set, test::is_even());
83 BOOST_TEST(set.empty());
84 BOOST_TEST_EQ(num_erased, 0u);
85
86 set.emplace(1);
87 set.emplace(2);
88 set.emplace(2);
89 set.emplace(2);
90 set.emplace(2);
91 set.emplace(3);
92
93 size_type size = set.size();
94
95 num_erased = erase_if(set, test::is_too_large());
96
97 BOOST_TEST_EQ(set.size(), size);
98 BOOST_TEST_EQ(num_erased, 0u);
99
100 num_erased = erase_if(set, test::is_even());
101 BOOST_TEST_EQ(set.size(), 2u);
102 BOOST_TEST_EQ(num_erased, size - set.size());
103}
104
105UNORDERED_AUTO_TEST (unordered_erase_if) {
106#ifdef BOOST_UNORDERED_FOA_TESTS
107 test_map_erase_if<boost::unordered_flat_map<std::string, int> >();
108 test_set_erase_if<boost::unordered_flat_set<int> >();
109 test_map_erase_if<boost::unordered_node_map<std::string, int> >();
110 test_set_erase_if<boost::unordered_node_set<int> >();
111#else
112 test_map_erase_if<boost::unordered_map<std::string, int> >();
113 test_map_erase_if<boost::unordered_multimap<std::string, int> >();
114
115 test_set_erase_if<boost::unordered_set<int> >();
116 test_set_erase_if<boost::unordered_multiset<int> >();
117#endif
118}
119
120RUN_TESTS()
121

source code of boost/libs/unordered/test/unordered/erase_if.cpp