1 // Copyright 2021 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)
6 #include "../helpers/prefix.hpp"
7 #include <boost/unordered_set.hpp>
8 #include <boost/unordered_map.hpp>
9 #include "../helpers/postfix.hpp"
12 #include "../helpers/test.hpp"
19 key(int x
) : x_(x
) { ++count_
; }
20 key(key
const& k
) : x_(k
.x_
) { ++count_
; }
25 std::ostream
& operator<<(std::ostream
& os
, key
const& k
)
27 os
<< "key { x_: " << k
.x_
<< " }";
31 bool operator==(key
const& k
, int const x
) { return k
.x_
== x
; }
32 bool operator==(int const x
, key
const& k
) { return k
.x_
== x
; }
34 struct transparent_hasher
36 typedef void is_transparent
;
38 std::size_t operator()(key
const& k
) const
40 return boost::hash
<int>()(k
.x_
);
43 std::size_t operator()(int const k
) const { return boost::hash
<int>()(k
); }
46 struct transparent_key_equal
48 typedef void is_transparent
;
50 bool operator()(key
const& k1
, key
const& k2
) const { return k1
.x_
== k2
.x_
; }
51 bool operator()(int const x
, key
const& k1
) const { return k1
== x
; }
52 bool operator()(key
const& k1
, int const x
) const { return k1
== x
; }
57 std::size_t operator()(key
const& k
) const
59 return boost::hash
<int>()(k
.x_
);
65 bool operator()(key
const& k1
, key
const& k2
) const { return k1
.x_
== k2
.x_
; }
68 void count_reset() { key::count_
= 0; }
70 template <class UnorderedMap
> void test_map_transparent_contains()
75 bool contains
= map
.contains(0);
76 BOOST_TEST(!contains
);
78 BOOST_TEST_EQ(key::count_
, 0);
80 map
.insert(std::make_pair(0, 1337));
81 map
.insert(std::make_pair(0, 1338));
82 map
.insert(std::make_pair(0, 1339));
83 map
.insert(std::make_pair(1, 1340));
85 int const expected_key_count
= key::count_
;
87 contains
= map
.contains(0);
90 contains
= map
.contains(1);
93 contains
= map
.contains(2);
94 BOOST_TEST(!contains
);
96 BOOST_TEST_EQ(key::count_
, expected_key_count
);
99 template <class UnorderedMap
> void test_map_non_transparent_contains()
104 bool contains
= map
.contains(0);
105 BOOST_TEST(!contains
);
106 BOOST_TEST_EQ(key::count_
, 1);
108 map
.insert(std::make_pair(0, 1337));
109 map
.insert(std::make_pair(0, 1338));
110 map
.insert(std::make_pair(0, 1339));
111 map
.insert(std::make_pair(1, 1340));
113 int key_count
= key::count_
;
115 contains
= map
.contains(0);
117 BOOST_TEST(contains
);
119 contains
= map
.contains(1);
121 BOOST_TEST(contains
);
123 contains
= map
.contains(2);
125 BOOST_TEST(!contains
);
127 BOOST_TEST_EQ(key::count_
, key_count
);
132 typedef boost::unordered_map
<key
, int, transparent_hasher
,
133 transparent_key_equal
>
136 typedef boost::unordered_map
<key
, int, transparent_hasher
, key_equal
>
137 non_transparent_map1
;
139 typedef boost::unordered_map
<key
, int, hasher
, transparent_key_equal
>
140 non_transparent_map2
;
142 typedef boost::unordered_map
<key
, int, hasher
, key_equal
>
143 non_transparent_map3
;
145 test_map_transparent_contains
<transparent_map
>();
146 test_map_non_transparent_contains
<non_transparent_map1
>();
147 test_map_non_transparent_contains
<non_transparent_map2
>();
148 test_map_non_transparent_contains
<non_transparent_map3
>();
153 typedef boost::unordered_multimap
<key
, int, transparent_hasher
,
154 transparent_key_equal
>
155 transparent_multimap
;
157 typedef boost::unordered_multimap
<key
, int, transparent_hasher
, key_equal
>
158 non_transparent_multimap1
;
160 typedef boost::unordered_multimap
<key
, int, hasher
, transparent_key_equal
>
161 non_transparent_multimap2
;
163 typedef boost::unordered_multimap
<key
, int, hasher
, key_equal
>
164 non_transparent_multimap3
;
166 test_map_transparent_contains
<transparent_multimap
>();
167 test_map_non_transparent_contains
<non_transparent_multimap1
>();
168 test_map_non_transparent_contains
<non_transparent_multimap2
>();
169 test_map_non_transparent_contains
<non_transparent_multimap3
>();
172 template <class UnorderedSet
> void test_set_transparent_contains()
177 bool contains
= set
.contains(0);
178 BOOST_TEST(!contains
);
180 BOOST_TEST_EQ(key::count_
, 0);
187 int const expected_key_count
= key::count_
;
189 contains
= set
.contains(0);
190 BOOST_TEST(contains
);
192 contains
= set
.contains(1);
193 BOOST_TEST(contains
);
195 contains
= set
.contains(2);
196 BOOST_TEST(!contains
);
198 BOOST_TEST_EQ(key::count_
, expected_key_count
);
201 template <class UnorderedSet
> void test_set_non_transparent_contains()
206 bool contains
= set
.contains(0);
207 BOOST_TEST(!contains
);
208 BOOST_TEST_EQ(key::count_
, 1);
215 int key_count
= key::count_
;
217 contains
= set
.contains(0);
219 BOOST_TEST(contains
);
221 contains
= set
.contains(1);
223 BOOST_TEST(contains
);
225 contains
= set
.contains(2);
227 BOOST_TEST(!contains
);
229 BOOST_TEST_EQ(key::count_
, key_count
);
234 typedef boost::unordered_set
<key
, transparent_hasher
, transparent_key_equal
>
237 typedef boost::unordered_set
<key
, transparent_hasher
, key_equal
>
238 non_transparent_set1
;
239 typedef boost::unordered_set
<key
, hasher
, transparent_key_equal
>
240 non_transparent_set2
;
241 typedef boost::unordered_set
<key
, hasher
, key_equal
> non_transparent_set3
;
243 test_set_transparent_contains
<transparent_set
>();
244 test_set_non_transparent_contains
<non_transparent_set1
>();
245 test_set_non_transparent_contains
<non_transparent_set2
>();
246 test_set_non_transparent_contains
<non_transparent_set3
>();
251 typedef boost::unordered_multiset
<key
, transparent_hasher
,
252 transparent_key_equal
>
253 transparent_multiset
;
255 typedef boost::unordered_multiset
<key
, transparent_hasher
, key_equal
>
256 non_transparent_multiset1
;
257 typedef boost::unordered_multiset
<key
, hasher
, transparent_key_equal
>
258 non_transparent_multiset2
;
259 typedef boost::unordered_multiset
<key
, hasher
, key_equal
>
260 non_transparent_multiset3
;
262 test_set_transparent_contains
<transparent_multiset
>();
263 test_set_non_transparent_contains
<non_transparent_multiset1
>();
264 test_set_non_transparent_contains
<non_transparent_multiset2
>();
265 test_set_non_transparent_contains
<non_transparent_multiset3
>();
268 UNORDERED_AUTO_TEST (contains_
) { // avoid -Wshadow warning with `bool contains`