From aabf1a408b2edbe38f7e0a52aaec50d372551cf7 Mon Sep 17 00:00:00 2001 From: Daniel James Date: Tue, 17 Jul 2007 23:17:21 +0000 Subject: [PATCH] Improve the unordered tests support for some older compilers. Better testing of elements with equivalent keys. [SVN r7458] --- test/helpers/fwd.hpp | 1 + test/helpers/generators.hpp | 6 ++ test/objects/exception.hpp | 11 ++-- test/objects/test.hpp | 96 +++++++++++++++++++++++++++- test/unordered/assign_tests.cpp | 9 ++- test/unordered/constructor_tests.cpp | 18 ++++++ test/unordered/copy_tests.cpp | 5 ++ test/unordered/erase_equiv_tests.cpp | 24 +++---- test/unordered/erase_tests.cpp | 9 +++ test/unordered/find_tests.cpp | 5 ++ test/unordered/insert_tests.cpp | 12 ++++ 11 files changed, 176 insertions(+), 20 deletions(-) diff --git a/test/helpers/fwd.hpp b/test/helpers/fwd.hpp index 7efd7d44..cc04ad85 100644 --- a/test/helpers/fwd.hpp +++ b/test/helpers/fwd.hpp @@ -12,6 +12,7 @@ namespace test { int generate(int const*); char generate(char const*); + signed char generate(signed char const*); std::string generate(std::string*); float generate(float const*); template diff --git a/test/helpers/generators.hpp b/test/helpers/generators.hpp index 86be1d4d..d6c875b0 100644 --- a/test/helpers/generators.hpp +++ b/test/helpers/generators.hpp @@ -56,6 +56,12 @@ namespace test return (rand() >> 1) % (128-32) + 32; } + inline signed char generate(signed char const*) + { + using namespace std; + return rand(); + } + inline std::string generate(std::string const*) { using namespace std; diff --git a/test/objects/exception.hpp b/test/objects/exception.hpp index 5cb90c18..a20588e6 100644 --- a/test/objects/exception.hpp +++ b/test/objects/exception.hpp @@ -624,13 +624,14 @@ namespace exception } return (std::numeric_limits::max)(); } - - friend void swap(allocator& x, allocator& y) - { - std::swap(x.tag_, y.tag_); - } }; + template + void swap(allocator& x, allocator& y) + { + std::swap(x.tag_, y.tag_); + } + // It's pretty much impossible to write a compliant swap when these // two can throw. So they don't. diff --git a/test/objects/test.hpp b/test/objects/test.hpp index ba6d4bf0..5f473070 100644 --- a/test/objects/test.hpp +++ b/test/objects/test.hpp @@ -50,7 +50,6 @@ namespace test (x1.tag1_ == x2.tag1_ && x1.tag2_ < x2.tag2_); } - friend object generate(object const*) { int* x = 0; return object(generate(x), generate(x)); @@ -62,6 +61,44 @@ namespace test } }; + // This object is usd to test how well the containers cope with equivalent keys. + class equivalent_object + { + friend class hash; + friend class equal_to; + friend class less; + int tag1_, tag2_; + public: + explicit equivalent_object(int t1 = 0, int t2 = 0) : tag1_(t1), tag2_(t2) {} + + ~equivalent_object() { + tag1_ = -1; + tag2_ = -1; + } + + friend bool operator==(equivalent_object const& x1, equivalent_object const& x2) { + return x1.tag1_ == x2.tag1_; + } + + friend bool operator!=(equivalent_object const& x1, equivalent_object const& x2) { + return x1.tag1_ != x2.tag1_; + } + + friend bool operator<(equivalent_object const& x1, equivalent_object const& x2) { + return x1.tag1_ < x2.tag1_; + } + + friend equivalent_object generate(equivalent_object const*) { + signed char* x = 0; + return equivalent_object(generate(x), generate(x)); + } + + friend std::ostream& operator<<(std::ostream& out, equivalent_object const& o) + { + return out<<"("< const& x, allocator const& y, test::derived_type) { return x == y; } + +#if BOOST_WORKAROUND(__GNUC__, < 3) + void swap(test::object& x, test::object& y) { + test::object tmp; + tmp = x; + x = y; + y = tmp; + } + + void swap(test::equivalent_object& x, test::equivalent_object& y) { + test::equivalent_object tmp; + tmp = x; + x = y; + y = tmp; + } + + void swap(test::hash& x, test::hash& y) { + test::hash tmp; + tmp = x; + x = y; + y = tmp; + } + + void swap(test::less& x, test::less& y) { + test::less tmp; + tmp = x; + x = y; + y = tmp; + } + + void swap(test::equal_to& x, test::equal_to& y) { + test::equal_to tmp; + tmp = x; + x = y; + y = tmp; + } + + template + void swap(test::allocator& x, test::allocator& y) { + test::allocator tmp; + tmp = x; + x = y; + y = tmp; + } +#endif } #endif diff --git a/test/unordered/assign_tests.cpp b/test/unordered/assign_tests.cpp index 7de95b89..4018192d 100644 --- a/test/unordered/assign_tests.cpp +++ b/test/unordered/assign_tests.cpp @@ -95,9 +95,14 @@ int main() assign_tests1((boost::unordered_map >*) 0); assign_tests1((boost::unordered_multimap >*) 0); + assign_tests1((boost::unordered_set >*) 0); + assign_tests1((boost::unordered_multiset >*) 0); + assign_tests1((boost::unordered_map >*) 0); + assign_tests1((boost::unordered_multimap >*) 0); + assign_tests2((boost::unordered_set >*) 0); - assign_tests2((boost::unordered_multiset >*) 0); - assign_tests2((boost::unordered_map >*) 0); + assign_tests2((boost::unordered_multiset >*) 0); + assign_tests2((boost::unordered_map >*) 0); assign_tests2((boost::unordered_multimap >*) 0); return boost::report_errors(); diff --git a/test/unordered/constructor_tests.cpp b/test/unordered/constructor_tests.cpp index 916a0810..36f15bef 100644 --- a/test/unordered/constructor_tests.cpp +++ b/test/unordered/constructor_tests.cpp @@ -273,6 +273,15 @@ int main() std::cerr<<"Test1 unordered_multimap\n"; constructor_tests1((boost::unordered_multimap >*) 0); + std::cerr<<"Test1 unordered_set\n"; + constructor_tests1((boost::unordered_set >*) 0); + std::cerr<<"Test1 unordered_multiset\n"; + constructor_tests1((boost::unordered_multiset >*) 0); + std::cerr<<"Test1 unordered_map\n"; + constructor_tests1((boost::unordered_map >*) 0); + std::cerr<<"Test1 unordered_multimap\n"; + constructor_tests1((boost::unordered_multimap >*) 0); + std::cerr<<"Test2 unordered_set\n"; constructor_tests2((boost::unordered_set >*) 0); std::cerr<<"Test2 unordered_multiset\n"; @@ -282,6 +291,15 @@ int main() std::cerr<<"Test2 unordered_multimap\n"; constructor_tests2((boost::unordered_multimap >*) 0); + std::cerr<<"Test2 unordered_set\n"; + constructor_tests2((boost::unordered_set >*) 0); + std::cerr<<"Test2 unordered_multiset\n"; + constructor_tests2((boost::unordered_multiset >*) 0); + std::cerr<<"Test2 unordered_map\n"; + constructor_tests2((boost::unordered_map >*) 0); + std::cerr<<"Test2 unordered_multimap\n"; + constructor_tests2((boost::unordered_multimap >*) 0); + std::cerr<<"Map Test unordered_map\n"; map_constructor_test((boost::unordered_map >*) 0); std::cerr<<"Map Test unordered_multimap\n"; diff --git a/test/unordered/copy_tests.cpp b/test/unordered/copy_tests.cpp index 190fdade..7cc46b72 100644 --- a/test/unordered/copy_tests.cpp +++ b/test/unordered/copy_tests.cpp @@ -100,5 +100,10 @@ int main() copy_construct_tests2((boost::unordered_map >*) 0); copy_construct_tests2((boost::unordered_multimap >*) 0); + copy_construct_tests2((boost::unordered_set >*) 0); + copy_construct_tests2((boost::unordered_multiset >*) 0); + copy_construct_tests2((boost::unordered_map >*) 0); + copy_construct_tests2((boost::unordered_multimap >*) 0); + return boost::report_errors(); } diff --git a/test/unordered/erase_equiv_tests.cpp b/test/unordered/erase_equiv_tests.cpp index d8f11e1a..e245b1ef 100644 --- a/test/unordered/erase_equiv_tests.cpp +++ b/test/unordered/erase_equiv_tests.cpp @@ -49,8 +49,8 @@ typedef boost::unordered_multimap, test::allocator > > collide_map2; -typedef collide_map::value_type pair; -typedef std::list list; +typedef collide_map::value_type collide_value; +typedef std::list collide_list; void empty_range_tests() @@ -63,8 +63,8 @@ void empty_range_tests() void single_item_tests() { - list init; - init.push_back(pair(1,1)); + collide_list init; + init.push_back(collide_value(1,1)); collide_map x(init.begin(), init.end()); x.erase(x.begin(), x.begin()); @@ -77,9 +77,9 @@ void single_item_tests() void two_equivalent_item_tests() { - list init; - init.push_back(pair(1,1)); - init.push_back(pair(1,2)); + collide_list init; + init.push_back(collide_value(1,1)); + init.push_back(collide_value(1,2)); { collide_map x(init.begin(), init.end()); @@ -109,8 +109,8 @@ void two_equivalent_item_tests() template bool compare(Range1 const& x, Range2 const& y) { - list a; - list b; + collide_list a; + collide_list b; std::copy(x.begin(), x.end(), std::back_inserter(a)); std::copy(y.begin(), y.end(), std::back_inserter(b)); a.sort(); @@ -121,7 +121,7 @@ bool compare(Range1 const& x, Range2 const& y) template bool general_erase_range_test(Container& x, int start, int end) { - list l; + collide_list l; std::copy(x.begin(), x.end(), std::back_inserter(l)); l.erase(boost::next(l.begin(), start), boost::next(l.begin(), end)); x.erase(boost::next(x.begin(), start), boost::next(x.begin(), end)); @@ -134,7 +134,7 @@ void erase_subrange_tests(Container const& x) for(std::size_t length = 0; length < x.size(); ++length) { for(std::size_t position = 0; position < x.size() - length; ++position) { Container y(x); - list init; + collide_list init; std::copy(y.begin(), y.end(), std::back_inserter(init)); if(!general_erase_range_test(y, position, position + length)) { BOOST_ERROR("general_erase_range_test failed."); @@ -153,7 +153,7 @@ void x_by_y_erase_range_tests(Container*, int values, int duplicates) for(int i = 0; i < values; ++i) { for(int j = 0; j < duplicates; ++j) { - y.insert(pair(i, j)); + y.insert(collide_value(i, j)); } } diff --git a/test/unordered/erase_tests.cpp b/test/unordered/erase_tests.cpp index f12e02e8..449ac392 100644 --- a/test/unordered/erase_tests.cpp +++ b/test/unordered/erase_tests.cpp @@ -135,5 +135,14 @@ int main() std::cerr<<"\nErase unordered_multimap.\n"; erase_tests1((boost::unordered_multimap >*) 0); + std::cerr<<"\nErase unordered_set.\n"; + erase_tests1((boost::unordered_set >*) 0); + std::cerr<<"\nErase unordered_multiset.\n"; + erase_tests1((boost::unordered_multiset >*) 0); + std::cerr<<"\nErase unordered_map.\n"; + erase_tests1((boost::unordered_map >*) 0); + std::cerr<<"\nErase unordered_multimap.\n"; + erase_tests1((boost::unordered_multimap >*) 0); + return boost::report_errors(); } diff --git a/test/unordered/find_tests.cpp b/test/unordered/find_tests.cpp index 7535d9e2..b551f509 100644 --- a/test/unordered/find_tests.cpp +++ b/test/unordered/find_tests.cpp @@ -88,5 +88,10 @@ int main() find_tests1((boost::unordered_map >*) 0); find_tests1((boost::unordered_multimap >*) 0); + find_tests1((boost::unordered_set >*) 0); + find_tests1((boost::unordered_multiset >*) 0); + find_tests1((boost::unordered_map >*) 0); + find_tests1((boost::unordered_multimap >*) 0); + return 0; } diff --git a/test/unordered/insert_tests.cpp b/test/unordered/insert_tests.cpp index 2a32307c..3e2281f9 100644 --- a/test/unordered/insert_tests.cpp +++ b/test/unordered/insert_tests.cpp @@ -269,6 +269,11 @@ int main() 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); @@ -279,11 +284,18 @@ int main() 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); + map_tests((boost::unordered_map >*) 0); associative_insert_range_test((boost::unordered_map >*) 0); associative_insert_range_test((boost::unordered_multimap >*) 0); + associative_insert_range_test((boost::unordered_multimap >*) 0); return boost::report_errors(); }