| 
									
										
										
										
											2006-05-21 17:14:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-18 20:00:59 +00:00
										 |  |  | // Copyright 2006-2007 Daniel James.
 | 
					
						
							| 
									
										
										
										
											2006-07-01 22:31:26 +00:00
										 |  |  | // 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)
 | 
					
						
							| 
									
										
										
										
											2006-05-21 17:14:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <boost/unordered_set.hpp>
 | 
					
						
							|  |  |  | #include <boost/unordered_map.hpp>
 | 
					
						
							|  |  |  | #include <boost/detail/lightweight_test.hpp>
 | 
					
						
							|  |  |  | #include "../helpers/random_values.hpp"
 | 
					
						
							|  |  |  | #include "../helpers/tracker.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-06 11:42:28 +00:00
										 |  |  | test::seed_t seed(2974); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-21 17:14:11 +00:00
										 |  |  | template <class X> | 
					
						
							| 
									
										
										
										
											2008-01-10 22:30:46 +00:00
										 |  |  | bool postcondition(X const& x, BOOST_DEDUCED_TYPENAME X::size_type n) | 
					
						
							| 
									
										
										
										
											2006-05-21 17:14:11 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     return x.bucket_count() > x.size() / x.max_load_factor() && x.bucket_count() >= n; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <class X> | 
					
						
							|  |  |  | void rehash_empty_test1(X* = 0) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     X x; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     x.rehash(10000); | 
					
						
							|  |  |  |     BOOST_TEST(postcondition(x, 10000)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     x.rehash(0); | 
					
						
							|  |  |  |     BOOST_TEST(postcondition(x, 0)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <class X> | 
					
						
							|  |  |  | void rehash_test1(X* = 0) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     test::random_values<X> v(1000); | 
					
						
							|  |  |  |     test::ordered<X> tracker; | 
					
						
							| 
									
										
										
										
											2006-06-12 23:30:46 +00:00
										 |  |  |     tracker.insert_range(v.begin(), v.end()); | 
					
						
							| 
									
										
										
										
											2006-05-21 17:14:11 +00:00
										 |  |  |     X x(v.begin(), v.end()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     x.rehash(0); BOOST_TEST(postcondition(x, 0)); | 
					
						
							|  |  |  |     tracker.compare(x); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     x.max_load_factor(0.25); | 
					
						
							|  |  |  |     x.rehash(0); BOOST_TEST(postcondition(x, 0)); | 
					
						
							|  |  |  |     tracker.compare(x); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     x.max_load_factor(50.0); | 
					
						
							|  |  |  |     x.rehash(0); BOOST_TEST(postcondition(x, 0)); | 
					
						
							|  |  |  |     tracker.compare(x); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     x.rehash(1000); BOOST_TEST(postcondition(x, 1000)); | 
					
						
							|  |  |  |     tracker.compare(x); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <class X> | 
					
						
							|  |  |  | void rehash_tests(X* ptr = 0) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     rehash_empty_test1(ptr); | 
					
						
							|  |  |  |     rehash_test1(ptr); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int main() { | 
					
						
							|  |  |  |     rehash_tests((boost::unordered_set<int>*) 0); | 
					
						
							|  |  |  |     rehash_tests((boost::unordered_multiset<int>*) 0); | 
					
						
							|  |  |  |     rehash_tests((boost::unordered_map<int, int>*) 0); | 
					
						
							|  |  |  |     rehash_tests((boost::unordered_multimap<int, int>*) 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return boost::report_errors(); | 
					
						
							|  |  |  | } |