2 // Copyright 2006-2009 Daniel James.
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // 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"
11 #include "../helpers/test.hpp"
12 #include "../helpers/random_values.hpp"
13 #include "../helpers/tracker.hpp"
14 #include "../helpers/metafunctions.hpp"
15 #include "../objects/test.hpp"
17 namespace rehash_tests
20 test::seed_t
initialize_seed(2974);
23 bool postcondition(X
const& x
, BOOST_DEDUCED_TYPENAME
X::size_type n
)
25 return static_cast<double>(x
.bucket_count()) >=
26 static_cast<double>(x
.size()) / x
.max_load_factor() &&
27 x
.bucket_count() >= n
;
31 void rehash_empty_test1(X
*)
36 BOOST_TEST(postcondition(x
, 10000));
39 BOOST_TEST(postcondition(x
, 0));
42 BOOST_TEST(postcondition(x
, 10000000));
46 void rehash_empty_test2(X
*, test::random_generator generator
)
48 test::random_values
<X
> v(1000, generator
);
49 test::ordered
<X
> tracker
;
54 BOOST_TEST(postcondition(x
, 10000));
56 tracker
.insert_range(v
.begin(), v
.end());
57 x
.insert(v
.begin(), v
.end());
60 BOOST_TEST(postcondition(x
, 10000));
64 BOOST_TEST(postcondition(x
, 10000000));
68 void rehash_empty_test3(X
*, test::random_generator generator
)
70 test::random_values
<X
> v(1000, generator
);
71 test::ordered
<X
> tracker
;
76 BOOST_TEST(postcondition(x
, 0));
78 tracker
.insert_range(v
.begin(), v
.end());
79 x
.insert(v
.begin(), v
.end());
82 BOOST_TEST(postcondition(x
, 0));
86 void rehash_test1(X
*, test::random_generator generator
)
88 test::random_values
<X
> v(1000, generator
);
89 test::ordered
<X
> tracker
;
90 tracker
.insert_range(v
.begin(), v
.end());
91 X
x(v
.begin(), v
.end());
93 x
.rehash(0); BOOST_TEST(postcondition(x
, 0));
96 x
.max_load_factor(0.25);
97 x
.rehash(0); BOOST_TEST(postcondition(x
, 0));
100 x
.max_load_factor(50.0);
101 x
.rehash(0); BOOST_TEST(postcondition(x
, 0));
104 x
.rehash(1000); BOOST_TEST(postcondition(x
, 1000));
109 void reserve_empty_test1(X
*)
114 BOOST_TEST(x
.bucket_count() >= 10000);
119 BOOST_TEST(x
.bucket_count() >= 10000000);
123 void reserve_empty_test2(X
*)
126 x
.max_load_factor(0.25);
129 BOOST_TEST(x
.bucket_count() >= 40000);
134 BOOST_TEST(x
.bucket_count() >= 40000000);
138 void reserve_test1(X
*, test::random_generator generator
)
140 for (int random_mlf
= 0; random_mlf
< 2; ++random_mlf
)
142 for (std::size_t i
= 1; i
< 2000; i
+= i
< 50 ? 1 : 13)
144 test::random_values
<X
> v(i
, generator
);
146 test::ordered
<X
> tracker
;
147 tracker
.insert_range(v
.begin(), v
.end());
150 x
.max_load_factor(random_mlf
?
151 static_cast<float>(std::rand() % 1000) / 500.0f
+ 0.5f
: 1.0f
);
152 x
.reserve(test::has_unique_keys
<X
>::value
? i
: v
.size());
154 // Insert an element before the range insert, otherwise there are
155 // no iterators to invalidate in the range insert, and it can
157 typename
test::random_values
<X
>::iterator it
= v
.begin();
161 std::size_t bucket_count
= x
.bucket_count();
162 x
.insert(it
, v
.end());
163 BOOST_TEST(bucket_count
== x
.bucket_count());
170 void reserve_test2(X
*, test::random_generator generator
)
172 for (int random_mlf
= 0; random_mlf
< 2; ++random_mlf
)
174 for (std::size_t i
= 0; i
< 2000; i
+= i
< 50 ? 1 : 13)
176 test::random_values
<X
> v(i
, generator
);
178 test::ordered
<X
> tracker
;
179 tracker
.insert_range(v
.begin(), v
.end());
182 x
.max_load_factor(random_mlf
?
183 static_cast<float>(std::rand() % 1000) / 500.0f
+ 0.5f
: 1.0f
);
185 x
.reserve(test::has_unique_keys
<X
>::value
? i
: v
.size());
187 std::size_t bucket_count
= x
.bucket_count();
188 for (typename
test::random_values
<X
>::iterator it
= v
.begin();
194 BOOST_TEST(bucket_count
== x
.bucket_count());
200 boost::unordered_set
<int>* int_set_ptr
;
201 boost::unordered_multiset
<test::object
,
202 test::hash
, test::equal_to
,
203 test::allocator2
<test::object
> >* test_multiset_ptr
;
204 boost::unordered_map
<test::movable
, test::movable
,
205 test::hash
, test::equal_to
,
206 test::allocator2
<test::movable
> >* test_map_ptr
;
207 boost::unordered_multimap
<int, int>* int_multimap_ptr
;
209 using test::default_generator
;
210 using test::generate_collisions
;
211 using test::limited_range
;
213 UNORDERED_TEST(rehash_empty_test1
,
214 ((int_set_ptr
)(test_multiset_ptr
)(test_map_ptr
)(int_multimap_ptr
))
216 UNORDERED_TEST(rehash_empty_test2
,
217 ((int_set_ptr
)(test_multiset_ptr
)(test_map_ptr
)(int_multimap_ptr
))
218 ((default_generator
)(generate_collisions
)(limited_range
))
220 UNORDERED_TEST(rehash_empty_test3
,
221 ((int_set_ptr
)(test_multiset_ptr
)(test_map_ptr
)(int_multimap_ptr
))
222 ((default_generator
)(generate_collisions
)(limited_range
))
224 UNORDERED_TEST(rehash_test1
,
225 ((int_set_ptr
)(test_multiset_ptr
)(test_map_ptr
)(int_multimap_ptr
))
226 ((default_generator
)(generate_collisions
)(limited_range
))
228 UNORDERED_TEST(reserve_empty_test1
,
229 ((int_set_ptr
)(test_multiset_ptr
)(test_map_ptr
)(int_multimap_ptr
))
231 UNORDERED_TEST(reserve_empty_test2
,
232 ((int_set_ptr
)(test_multiset_ptr
)(test_map_ptr
)(int_multimap_ptr
))
234 UNORDERED_TEST(reserve_test1
,
235 ((int_set_ptr
)(test_multiset_ptr
)(test_map_ptr
)(int_multimap_ptr
))
236 ((default_generator
)(generate_collisions
)(limited_range
))
238 UNORDERED_TEST(reserve_test2
,
239 ((int_set_ptr
)(test_multiset_ptr
)(test_map_ptr
)(int_multimap_ptr
))
240 ((default_generator
)(generate_collisions
)(limited_range
))