| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-09 20:56:23 +00:00
										 |  |  | // Copyright 2006-2009 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-17 17:19:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-26 23:15:30 +00:00
										 |  |  | #include "../helpers/prefix.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  | #include <boost/unordered_set.hpp>
 | 
					
						
							|  |  |  | #include <boost/unordered_map.hpp>
 | 
					
						
							| 
									
										
										
										
											2008-03-24 17:03:15 +00:00
										 |  |  | #include "../helpers/test.hpp"
 | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  | #include "../objects/test.hpp"
 | 
					
						
							| 
									
										
										
										
											2011-08-14 18:53:29 +00:00
										 |  |  | #include "../objects/cxx11_allocator.hpp"
 | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  | #include "../helpers/random_values.hpp"
 | 
					
						
							|  |  |  | #include "../helpers/tracker.hpp"
 | 
					
						
							|  |  |  | #include "../helpers/equivalent.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <iostream>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-14 21:03:18 +00:00
										 |  |  | #if defined(BOOST_MSVC)
 | 
					
						
							|  |  |  | #pragma warning(disable:4127) // conditional expression is constant
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-24 17:03:15 +00:00
										 |  |  | namespace assign_tests { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-06 11:42:28 +00:00
										 |  |  | test::seed_t seed(96785); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  | template <class T> | 
					
						
							| 
									
										
										
										
											2010-01-04 22:49:39 +00:00
										 |  |  | void assign_tests1(T*, | 
					
						
							|  |  |  |     test::random_generator generator = test::default_generator) | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-01-10 22:30:46 +00:00
										 |  |  |     BOOST_DEDUCED_TYPENAME T::hasher hf; | 
					
						
							|  |  |  |     BOOST_DEDUCED_TYPENAME T::key_equal eq; | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     std::cerr<<"assign_tests1.1\n"; | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-08-14 18:52:43 +00:00
										 |  |  |         test::check_instances check_; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  |         T x; | 
					
						
							|  |  |  |         x = x; | 
					
						
							| 
									
										
										
										
											2009-05-27 17:44:09 +00:00
										 |  |  |         BOOST_TEST(x.empty()); | 
					
						
							|  |  |  |         BOOST_TEST(test::equivalent(x.hash_function(), hf)); | 
					
						
							|  |  |  |         BOOST_TEST(test::equivalent(x.key_eq(), eq)); | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::cerr<<"assign_tests1.2\n"; | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-08-14 18:52:43 +00:00
										 |  |  |         test::check_instances check_; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 18:55:57 +00:00
										 |  |  |         test::random_values<T> v(1000, generator); | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  |         T x(v.begin(), v.end()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         test::ordered<T> tracker = test::create_ordered(x); | 
					
						
							| 
									
										
										
										
											2006-06-12 23:30:46 +00:00
										 |  |  |         tracker.insert_range(v.begin(), v.end()); | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         x = x; | 
					
						
							|  |  |  |         tracker.compare(x); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         T y; | 
					
						
							|  |  |  |         y.max_load_factor(x.max_load_factor() / 20); | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  |         float mlf = x.max_load_factor(); | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  |         y = x; | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  |         tracker.compare(x); | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  |         tracker.compare(y); | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  |         BOOST_TEST(x.max_load_factor() == mlf); | 
					
						
							|  |  |  |         BOOST_TEST(y.max_load_factor() == mlf); | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template <class T> | 
					
						
							| 
									
										
										
										
											2010-01-04 22:49:39 +00:00
										 |  |  | void assign_tests2(T*, | 
					
						
							|  |  |  |     test::random_generator generator = test::default_generator) | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-01-10 22:30:46 +00:00
										 |  |  |     BOOST_DEDUCED_TYPENAME T::hasher hf1(1); | 
					
						
							|  |  |  |     BOOST_DEDUCED_TYPENAME T::hasher hf2(2); | 
					
						
							|  |  |  |     BOOST_DEDUCED_TYPENAME T::key_equal eq1(1); | 
					
						
							|  |  |  |     BOOST_DEDUCED_TYPENAME T::key_equal eq2(2); | 
					
						
							|  |  |  |     BOOST_DEDUCED_TYPENAME T::allocator_type al1(1); | 
					
						
							|  |  |  |     BOOST_DEDUCED_TYPENAME T::allocator_type al2(2); | 
					
						
							| 
									
										
										
										
											2011-08-14 18:53:29 +00:00
										 |  |  |      | 
					
						
							|  |  |  |     typedef BOOST_DEDUCED_TYPENAME T::allocator_type allocator_type; | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  |     std::cerr<<"assign_tests2.1\n"; | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-08-14 18:52:43 +00:00
										 |  |  |         test::check_instances check_; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 18:55:57 +00:00
										 |  |  |         test::random_values<T> v(1000, generator); | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  |         T x1(v.begin(), v.end(), 0, hf1, eq1); | 
					
						
							|  |  |  |         T x2(0, hf2, eq2); | 
					
						
							|  |  |  |         x2 = x1; | 
					
						
							| 
									
										
										
										
											2009-05-27 17:44:09 +00:00
										 |  |  |         BOOST_TEST(test::equivalent(x2.hash_function(), hf1)); | 
					
						
							|  |  |  |         BOOST_TEST(test::equivalent(x2.key_eq(), eq1)); | 
					
						
							| 
									
										
										
										
											2006-06-12 23:30:46 +00:00
										 |  |  |         test::check_container(x2, v); | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2006-05-21 17:14:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     std::cerr<<"assign_tests2.2\n"; | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-08-14 18:52:43 +00:00
										 |  |  |         test::check_instances check_; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 18:55:57 +00:00
										 |  |  |         test::random_values<T> v1(100, generator), v2(100, generator); | 
					
						
							| 
									
										
										
										
											2006-05-21 17:14:11 +00:00
										 |  |  |         T x1(v1.begin(), v1.end(), 0, hf1, eq1, al1); | 
					
						
							|  |  |  |         T x2(v2.begin(), v2.end(), 0, hf2, eq2, al2); | 
					
						
							|  |  |  |         x2 = x1; | 
					
						
							| 
									
										
										
										
											2009-05-27 17:44:09 +00:00
										 |  |  |         BOOST_TEST(test::equivalent(x2.hash_function(), hf1)); | 
					
						
							|  |  |  |         BOOST_TEST(test::equivalent(x2.key_eq(), eq1)); | 
					
						
							| 
									
										
										
										
											2011-08-15 20:23:29 +00:00
										 |  |  |         if (allocator_type::is_propagate_on_assign) { | 
					
						
							| 
									
										
										
										
											2011-08-14 18:53:29 +00:00
										 |  |  |             BOOST_TEST(test::equivalent(x2.get_allocator(), al1)); | 
					
						
							|  |  |  |             BOOST_TEST(!test::equivalent(x2.get_allocator(), al2)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else { | 
					
						
							|  |  |  |             BOOST_TEST(test::equivalent(x2.get_allocator(), al2)); | 
					
						
							|  |  |  |             BOOST_TEST(!test::equivalent(x2.get_allocator(), al1)); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2006-06-12 23:30:46 +00:00
										 |  |  |         test::check_container(x2, v1); | 
					
						
							| 
									
										
										
										
											2006-05-21 17:14:11 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-04 22:49:39 +00:00
										 |  |  | boost::unordered_set<test::object, | 
					
						
							|  |  |  |     test::hash, test::equal_to, | 
					
						
							|  |  |  |     test::allocator<test::object> >* test_set; | 
					
						
							|  |  |  | boost::unordered_multiset<test::object, | 
					
						
							|  |  |  |     test::hash, test::equal_to, | 
					
						
							|  |  |  |     test::allocator<test::object> >* test_multiset; | 
					
						
							|  |  |  | boost::unordered_map<test::object, test::object, | 
					
						
							|  |  |  |     test::hash, test::equal_to, | 
					
						
							|  |  |  |     test::allocator<test::object> >* test_map; | 
					
						
							|  |  |  | boost::unordered_multimap<test::object, test::object, | 
					
						
							|  |  |  |     test::hash, test::equal_to, | 
					
						
							|  |  |  |     test::allocator<test::object> >* test_multimap; | 
					
						
							| 
									
										
										
										
											2008-03-24 17:03:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-14 18:53:29 +00:00
										 |  |  | boost::unordered_set<test::object, | 
					
						
							|  |  |  |         test::hash, test::equal_to, | 
					
						
							|  |  |  |         test::cxx11_allocator<test::object, test::propagate_assign> >* | 
					
						
							|  |  |  |     test_set_prop_assign; | 
					
						
							|  |  |  | boost::unordered_multiset<test::object, | 
					
						
							|  |  |  |         test::hash, test::equal_to, | 
					
						
							|  |  |  |         test::cxx11_allocator<test::object, test::propagate_assign> >* | 
					
						
							|  |  |  |     test_multiset_prop_assign; | 
					
						
							|  |  |  | boost::unordered_map<test::object, test::object, | 
					
						
							|  |  |  |         test::hash, test::equal_to, | 
					
						
							|  |  |  |         test::cxx11_allocator<test::object, test::propagate_assign> >* | 
					
						
							|  |  |  |     test_map_prop_assign; | 
					
						
							|  |  |  | boost::unordered_multimap<test::object, test::object, | 
					
						
							|  |  |  |         test::hash, test::equal_to, | 
					
						
							|  |  |  |         test::cxx11_allocator<test::object, test::propagate_assign> >* | 
					
						
							|  |  |  |     test_multimap_prop_assign; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | boost::unordered_set<test::object, | 
					
						
							|  |  |  |         test::hash, test::equal_to, | 
					
						
							|  |  |  |         test::cxx11_allocator<test::object, test::no_propagate_assign> >* | 
					
						
							|  |  |  |     test_set_no_prop_assign; | 
					
						
							|  |  |  | boost::unordered_multiset<test::object, | 
					
						
							|  |  |  |         test::hash, test::equal_to, | 
					
						
							|  |  |  |         test::cxx11_allocator<test::object, test::no_propagate_assign> >* | 
					
						
							|  |  |  |     test_multiset_no_prop_assign; | 
					
						
							|  |  |  | boost::unordered_map<test::object, test::object, | 
					
						
							|  |  |  |         test::hash, test::equal_to, | 
					
						
							|  |  |  |         test::cxx11_allocator<test::object, test::no_propagate_assign> >* | 
					
						
							|  |  |  |     test_map_no_prop_assign; | 
					
						
							|  |  |  | boost::unordered_multimap<test::object, test::object, | 
					
						
							|  |  |  |         test::hash, test::equal_to, | 
					
						
							|  |  |  |         test::cxx11_allocator<test::object, test::no_propagate_assign> >* | 
					
						
							|  |  |  |     test_multimap_no_prop_assign; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-24 17:03:15 +00:00
										 |  |  | using test::default_generator; | 
					
						
							|  |  |  | using test::generate_collisions; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-15 20:23:29 +00:00
										 |  |  | template <typename T> | 
					
						
							|  |  |  | bool is_propagate(T*) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return T::allocator_type::is_propagate_on_assign; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | UNORDERED_AUTO_TEST(check_traits) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     BOOST_TEST(!is_propagate(test_set)); | 
					
						
							|  |  |  |     BOOST_TEST(is_propagate(test_set_prop_assign)); | 
					
						
							|  |  |  |     BOOST_TEST(!is_propagate(test_set_no_prop_assign)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-14 18:53:29 +00:00
										 |  |  | UNORDERED_TEST(assign_tests1, ( | 
					
						
							|  |  |  |         (test_set)(test_multiset)(test_map)(test_multimap) | 
					
						
							|  |  |  |         (test_set_prop_assign)(test_multiset_prop_assign)(test_map_prop_assign)(test_multimap_prop_assign) | 
					
						
							|  |  |  |         (test_set_no_prop_assign)(test_multiset_no_prop_assign)(test_map_no_prop_assign)(test_multimap_no_prop_assign) | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2008-03-24 17:03:15 +00:00
										 |  |  |     ((default_generator)(generate_collisions)) | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-14 18:53:29 +00:00
										 |  |  | UNORDERED_TEST(assign_tests2, ( | 
					
						
							|  |  |  |         (test_set)(test_multiset)(test_map)(test_multimap) | 
					
						
							|  |  |  |         (test_set_prop_assign)(test_multiset_prop_assign)(test_map_prop_assign)(test_multimap_prop_assign) | 
					
						
							|  |  |  |         (test_set_no_prop_assign)(test_multiset_no_prop_assign)(test_map_no_prop_assign)(test_multimap_no_prop_assign) | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2008-03-24 17:03:15 +00:00
										 |  |  |     ((default_generator)(generate_collisions)) | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-28 22:06:42 +00:00
										 |  |  | #if !defined(BOOST_NO_0X_HDR_INITIALIZER_LIST)
 | 
					
						
							| 
									
										
										
										
											2008-12-04 21:30:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-01 06:50:37 +00:00
										 |  |  | UNORDERED_AUTO_TEST(assign_default_initializer_list) { | 
					
						
							|  |  |  |     std::cerr<<"Initializer List Tests\n"; | 
					
						
							| 
									
										
										
										
											2009-06-01 19:17:49 +00:00
										 |  |  |     std::initializer_list<std::pair<int const, int> > init; | 
					
						
							| 
									
										
										
										
											2009-06-01 06:50:37 +00:00
										 |  |  |     boost::unordered_map<int, int> x1; | 
					
						
							|  |  |  |     x1[25] = 3; | 
					
						
							|  |  |  |     x1[16] = 10; | 
					
						
							|  |  |  |     BOOST_TEST(!x1.empty()); | 
					
						
							|  |  |  |     x1 = init; | 
					
						
							|  |  |  |     BOOST_TEST(x1.empty()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-14 20:30:48 +00:00
										 |  |  | #if !defined(BOOST_NO_0X_HDR_INITIALIZER_LIST) && \
 | 
					
						
							|  |  |  |     !defined(BOOST_NO_INITIALIZER_LISTS) | 
					
						
							| 
									
										
										
										
											2009-06-01 06:50:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-04 21:30:19 +00:00
										 |  |  | UNORDERED_AUTO_TEST(assign_initializer_list) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     std::cerr<<"Initializer List Tests\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     boost::unordered_set<int> x; | 
					
						
							|  |  |  |     x.insert(10); | 
					
						
							|  |  |  |     x.insert(20); | 
					
						
							|  |  |  |     x = { 1, 2, -10 }; | 
					
						
							| 
									
										
										
										
											2009-05-27 17:44:09 +00:00
										 |  |  |     BOOST_TEST(x.find(10) == x.end()); | 
					
						
							|  |  |  |     BOOST_TEST(x.find(-10) != x.end()); | 
					
						
							| 
									
										
										
										
											2008-12-04 21:30:19 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-17 17:19:16 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-03-24 17:03:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | RUN_TESTS() |