// Copyright Daniel James 2006. Use, modification, and distribution are // subject to 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) #include #include #include #include #include "../objects/test.hpp" #include "../helpers/random_values.hpp" #include "../helpers/tracker.hpp" #include "../helpers/equivalent.hpp" #include "../helpers/invariants.hpp" #include template void unique_insert_tests1(X* = 0) { typedef typename X::iterator iterator; typedef test::ordered ordered; typedef typename test::ordered::iterator ordered_iterator; std::cerr<<"insert(value) tests for containers with unique keys.\n"; X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000); for(typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); std::pair r1 = x.insert(*it); std::pair r2 = tracker.insert(*it); BOOST_TEST(r1.second == r2.second); BOOST_TEST(*r1.first == *r2.first); tracker.compare_key(x, *it); if(x.size() < b * old_bucket_count) BOOST_TEST(x.bucket_count() == old_bucket_count); } test::check_equivalent_keys(x); } template void equivalent_insert_tests1(X* = 0) { std::cerr<<"insert(value) tests for containers with equivalent keys.\n"; X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000); for(typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); typename X::iterator r1 = x.insert(*it); typename test::ordered::iterator r2 = tracker.insert(*it); BOOST_TEST(*r1 == *r2); tracker.compare_key(x, *it); if(x.size() < b * old_bucket_count) BOOST_TEST(x.bucket_count() == old_bucket_count); } test::check_equivalent_keys(x); } template void insert_tests2(X* = 0) { typedef typename test::ordered tracker_type; typedef typename X::iterator iterator; typedef typename X::const_iterator const_iterator; typedef typename tracker_type::iterator tracker_iterator; std::cerr<<"insert(begin(), value) tests.\n"; { X x; tracker_type tracker = test::create_ordered(x); test::random_values v(1000); for(typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); iterator r1 = x.insert(x.begin(), *it); tracker_iterator r2 = tracker.insert(tracker.begin(), *it); BOOST_TEST(*r1 == *r2); tracker.compare_key(x, *it); if(x.size() < b * old_bucket_count) BOOST_TEST(x.bucket_count() == old_bucket_count); } test::check_equivalent_keys(x); } std::cerr<<"insert(end(), value) tests.\n"; { X x; X const& x_const = x; tracker_type tracker = test::create_ordered(x); test::random_values v(100); for(typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); const_iterator r1 = x.insert(x_const.end(), *it); tracker_iterator r2 = tracker.insert(tracker.end(), *it); BOOST_TEST(*r1 == *r2); tracker.compare_key(x, *it); if(x.size() < b * old_bucket_count) BOOST_TEST(x.bucket_count() == old_bucket_count); } test::check_equivalent_keys(x); } std::cerr<<"insert(pos, value) tests.\n"; { X x; const_iterator pos = x.begin(); tracker_type tracker = test::create_ordered(x); test::random_values v(1000); for(typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); pos = x.insert(pos, *it); tracker_iterator r2 = tracker.insert(tracker.begin(), *it); BOOST_TEST(*pos == *r2); tracker.compare_key(x, *it); if(x.size() < b * old_bucket_count) BOOST_TEST(x.bucket_count() == old_bucket_count); } test::check_equivalent_keys(x); } std::cerr<<"insert single item range tests.\n"; { X x; tracker_type tracker = test::create_ordered(x); test::random_values v(1000); for(typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); x.insert(it, boost::next(it)); tracker.insert(*it); tracker.compare_key(x, *it); if(x.size() < b * old_bucket_count) BOOST_TEST(x.bucket_count() == old_bucket_count); } test::check_equivalent_keys(x); } std::cerr<<"insert range tests.\n"; { X x; const_iterator pos = x.begin(); test::random_values v(1000); x.insert(v.begin(), v.end()); test::check_container(x, v); test::check_equivalent_keys(x); } } template void map_tests(X* = 0) { X x; test::ordered tracker = test::create_ordered(x); test::random_values v(1000); for(typename test::random_values::iterator it = v.begin(); it != v.end(); ++it) { typename X::size_type old_bucket_count = x.bucket_count(); float b = x.max_load_factor(); x[it->first] = it->second; tracker[it->first] = it->second; tracker.compare_key(x, *it); if(x.size() < b * old_bucket_count) BOOST_TEST(x.bucket_count() == old_bucket_count); } test::check_equivalent_keys(x); } int main() { unique_insert_tests1((boost::unordered_set*) 0); equivalent_insert_tests1((boost::unordered_multiset*) 0); unique_insert_tests1((boost::unordered_map*) 0); equivalent_insert_tests1((boost::unordered_multimap*) 0); unique_insert_tests1((boost::unordered_set >*) 0); equivalent_insert_tests1((boost::unordered_multiset >*) 0); unique_insert_tests1((boost::unordered_map >*) 0); equivalent_insert_tests1((boost::unordered_multimap >*) 0); insert_tests2((boost::unordered_set*) 0); insert_tests2((boost::unordered_multiset*) 0); insert_tests2((boost::unordered_map*) 0); insert_tests2((boost::unordered_multimap*) 0); insert_tests2((boost::unordered_set >*) 0); insert_tests2((boost::unordered_multiset >*) 0); insert_tests2((boost::unordered_map >*) 0); insert_tests2((boost::unordered_multimap >*) 0); map_tests((boost::unordered_map*) 0); map_tests((boost::unordered_map >*) 0); return boost::report_errors(); }