$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: danieljames_at_[hidden]
Date: 2007-07-17 19:17:22
Author: danieljames
Date: 2007-07-17 19:17:21 EDT (Tue, 17 Jul 2007)
New Revision: 7458
URL: http://svn.boost.org/trac/boost/changeset/7458
Log:
Improve the unordered tests support for some older compilers.
Better testing of elements with equivalent keys.
Text files modified: 
   sandbox/unordered/libs/unordered/test/helpers/fwd.hpp                 |     1                                         
   sandbox/unordered/libs/unordered/test/helpers/generators.hpp          |     6 ++                                      
   sandbox/unordered/libs/unordered/test/objects/exception.hpp           |    11 ++--                                    
   sandbox/unordered/libs/unordered/test/objects/test.hpp                |    96 +++++++++++++++++++++++++++++++++++++++ 
   sandbox/unordered/libs/unordered/test/unordered/assign_tests.cpp      |     9 ++                                      
   sandbox/unordered/libs/unordered/test/unordered/constructor_tests.cpp |    18 +++++++                                 
   sandbox/unordered/libs/unordered/test/unordered/copy_tests.cpp        |     5 ++                                      
   sandbox/unordered/libs/unordered/test/unordered/erase_equiv_tests.cpp |    24 +++++-----                              
   sandbox/unordered/libs/unordered/test/unordered/erase_tests.cpp       |     9 +++                                     
   sandbox/unordered/libs/unordered/test/unordered/find_tests.cpp        |     5 ++                                      
   sandbox/unordered/libs/unordered/test/unordered/insert_tests.cpp      |    12 +++++                                   
   11 files changed, 176 insertions(+), 20 deletions(-)
Modified: sandbox/unordered/libs/unordered/test/helpers/fwd.hpp
==============================================================================
--- sandbox/unordered/libs/unordered/test/helpers/fwd.hpp	(original)
+++ sandbox/unordered/libs/unordered/test/helpers/fwd.hpp	2007-07-17 19:17:21 EDT (Tue, 17 Jul 2007)
@@ -12,6 +12,7 @@
 {
     int generate(int const*);
     char generate(char const*);
+    signed char generate(signed char const*);
     std::string generate(std::string*);
     float generate(float const*);
     template <class T1, class T2>
Modified: sandbox/unordered/libs/unordered/test/helpers/generators.hpp
==============================================================================
--- sandbox/unordered/libs/unordered/test/helpers/generators.hpp	(original)
+++ sandbox/unordered/libs/unordered/test/helpers/generators.hpp	2007-07-17 19:17:21 EDT (Tue, 17 Jul 2007)
@@ -56,6 +56,12 @@
         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;
Modified: sandbox/unordered/libs/unordered/test/objects/exception.hpp
==============================================================================
--- sandbox/unordered/libs/unordered/test/objects/exception.hpp	(original)
+++ sandbox/unordered/libs/unordered/test/objects/exception.hpp	2007-07-17 19:17:21 EDT (Tue, 17 Jul 2007)
@@ -624,13 +624,14 @@
             }
             return (std::numeric_limits<std::size_t>::max)();
         }
-
-        friend void swap(allocator<T>& x, allocator<T>& y)
-        {
-            std::swap(x.tag_, y.tag_);
-        }
     };
 
+    template <class T>
+    void swap(allocator<T>& x, allocator<T>& 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.
 
Modified: sandbox/unordered/libs/unordered/test/objects/test.hpp
==============================================================================
--- sandbox/unordered/libs/unordered/test/objects/test.hpp	(original)
+++ sandbox/unordered/libs/unordered/test/objects/test.hpp	2007-07-17 19:17:21 EDT (Tue, 17 Jul 2007)
@@ -50,7 +50,6 @@
                 (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 @@
         }
     };
 
+    // 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<<"("<<o.tag1_<<","<<o.tag2_<<")";
+        }
+    };
+
     class hash
     {
         int type_;
@@ -79,6 +116,10 @@
             }
         }
 
+        std::size_t operator()(equivalent_object const& x) const {
+            return x.tag1_;
+        }
+
         std::size_t operator()(int x) const {
             return x;
         }
@@ -109,6 +150,10 @@
             }
         }
 
+        bool operator()(equivalent_object const& x1, equivalent_object const& x2) const {
+            return x1 < x2;
+        }
+
         std::size_t operator()(int x1, int x2) const {
             return x1 < x2;
         }
@@ -135,6 +180,10 @@
             }
         }
 
+        bool operator()(equivalent_object const& x1, equivalent_object const& x2) const {
+            return x1 == x2;
+        }
+
         std::size_t operator()(int x1, int x2) const {
             return x1 == x2;
         }
@@ -359,6 +408,51 @@
     bool equivalent_impl(allocator<T> const& x, allocator<T> 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 <class T>
+    void swap(test::allocator<T>& x, test::allocator<T>& y) {
+        test::allocator<T> tmp;
+        tmp = x;
+        x = y;
+        y = tmp;
+    }
+#endif
 }
 
 #endif
Modified: sandbox/unordered/libs/unordered/test/unordered/assign_tests.cpp
==============================================================================
--- sandbox/unordered/libs/unordered/test/unordered/assign_tests.cpp	(original)
+++ sandbox/unordered/libs/unordered/test/unordered/assign_tests.cpp	2007-07-17 19:17:21 EDT (Tue, 17 Jul 2007)
@@ -95,9 +95,14 @@
     assign_tests1((boost::unordered_map<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
     assign_tests1((boost::unordered_multimap<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
 
+    assign_tests1((boost::unordered_set<test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    assign_tests1((boost::unordered_multiset<test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    assign_tests1((boost::unordered_map<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    assign_tests1((boost::unordered_multimap<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+
     assign_tests2((boost::unordered_set<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    assign_tests2((boost::unordered_multiset<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    assign_tests2((boost::unordered_map<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
+    assign_tests2((boost::unordered_multiset<test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    assign_tests2((boost::unordered_map<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
     assign_tests2((boost::unordered_multimap<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
 
     return boost::report_errors();
Modified: sandbox/unordered/libs/unordered/test/unordered/constructor_tests.cpp
==============================================================================
--- sandbox/unordered/libs/unordered/test/unordered/constructor_tests.cpp	(original)
+++ sandbox/unordered/libs/unordered/test/unordered/constructor_tests.cpp	2007-07-17 19:17:21 EDT (Tue, 17 Jul 2007)
@@ -273,6 +273,15 @@
     std::cerr<<"Test1 unordered_multimap<test::object, test::object>\n";
     constructor_tests1((boost::unordered_multimap<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
 
+    std::cerr<<"Test1 unordered_set<test::equivalent_object>\n";
+    constructor_tests1((boost::unordered_set<test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    std::cerr<<"Test1 unordered_multiset<test::equivalent_object>\n";
+    constructor_tests1((boost::unordered_multiset<test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    std::cerr<<"Test1 unordered_map<test::equivalent_object, test::equivalent_object>\n";
+    constructor_tests1((boost::unordered_map<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    std::cerr<<"Test1 unordered_multimap<test::equivalent_object, test::equivalent_object>\n";
+    constructor_tests1((boost::unordered_multimap<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+
     std::cerr<<"Test2 unordered_set<test::object>\n";
     constructor_tests2((boost::unordered_set<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
     std::cerr<<"Test2 unordered_multiset<test::object>\n";
@@ -282,6 +291,15 @@
     std::cerr<<"Test2 unordered_multimap<test::object, test::object>\n";
     constructor_tests2((boost::unordered_multimap<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
 
+    std::cerr<<"Test2 unordered_set<test::equivalent_object>\n";
+    constructor_tests2((boost::unordered_set<test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    std::cerr<<"Test2 unordered_multiset<test::equivalent_object>\n";
+    constructor_tests2((boost::unordered_multiset<test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    std::cerr<<"Test2 unordered_map<test::equivalent_object, test::equivalent_object>\n";
+    constructor_tests2((boost::unordered_map<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    std::cerr<<"Test2 unordered_multimap<test::equivalent_object, test::equivalent_object>\n";
+    constructor_tests2((boost::unordered_multimap<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+
     std::cerr<<"Map Test unordered_map<test::object, test::object>\n";
     map_constructor_test((boost::unordered_map<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
     std::cerr<<"Map Test unordered_multimap<test::object, test::object>\n";
Modified: sandbox/unordered/libs/unordered/test/unordered/copy_tests.cpp
==============================================================================
--- sandbox/unordered/libs/unordered/test/unordered/copy_tests.cpp	(original)
+++ sandbox/unordered/libs/unordered/test/unordered/copy_tests.cpp	2007-07-17 19:17:21 EDT (Tue, 17 Jul 2007)
@@ -100,5 +100,10 @@
     copy_construct_tests2((boost::unordered_map<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
     copy_construct_tests2((boost::unordered_multimap<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
 
+    copy_construct_tests2((boost::unordered_set<test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    copy_construct_tests2((boost::unordered_multiset<test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    copy_construct_tests2((boost::unordered_map<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    copy_construct_tests2((boost::unordered_multimap<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+
     return boost::report_errors();
 }
Modified: sandbox/unordered/libs/unordered/test/unordered/erase_equiv_tests.cpp
==============================================================================
--- sandbox/unordered/libs/unordered/test/unordered/erase_equiv_tests.cpp	(original)
+++ sandbox/unordered/libs/unordered/test/unordered/erase_equiv_tests.cpp	2007-07-17 19:17:21 EDT (Tue, 17 Jul 2007)
@@ -49,8 +49,8 @@
 typedef boost::unordered_multimap<int, int,
     collision2_hash, std::equal_to<int>,
     test::allocator<std::pair<int const, int> > > collide_map2;
-typedef collide_map::value_type pair;
-typedef std::list<pair> list;
+typedef collide_map::value_type collide_value;
+typedef std::list<collide_value> collide_list;
 
 
 void empty_range_tests()
@@ -63,8 +63,8 @@
 
 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 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 @@
 template<class Range1, class Range2>
 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 @@
 template <class Container>
 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 @@
     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 @@
 
     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));
         }
     }
 
Modified: sandbox/unordered/libs/unordered/test/unordered/erase_tests.cpp
==============================================================================
--- sandbox/unordered/libs/unordered/test/unordered/erase_tests.cpp	(original)
+++ sandbox/unordered/libs/unordered/test/unordered/erase_tests.cpp	2007-07-17 19:17:21 EDT (Tue, 17 Jul 2007)
@@ -135,5 +135,14 @@
     std::cerr<<"\nErase unordered_multimap<test::object,..>.\n";
     erase_tests1((boost::unordered_multimap<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
 
+    std::cerr<<"\nErase unordered_set<test::equivalent_object,..>.\n";
+    erase_tests1((boost::unordered_set<test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    std::cerr<<"\nErase unordered_multiset<test::equivalent_object,..>.\n";
+    erase_tests1((boost::unordered_multiset<test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    std::cerr<<"\nErase unordered_map<test::equivalent_object,..>.\n";
+    erase_tests1((boost::unordered_map<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    std::cerr<<"\nErase unordered_multimap<test::equivalent_object,..>.\n";
+    erase_tests1((boost::unordered_multimap<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+
     return boost::report_errors();
 }
Modified: sandbox/unordered/libs/unordered/test/unordered/find_tests.cpp
==============================================================================
--- sandbox/unordered/libs/unordered/test/unordered/find_tests.cpp	(original)
+++ sandbox/unordered/libs/unordered/test/unordered/find_tests.cpp	2007-07-17 19:17:21 EDT (Tue, 17 Jul 2007)
@@ -88,5 +88,10 @@
     find_tests1((boost::unordered_map<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
     find_tests1((boost::unordered_multimap<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
 
+    find_tests1((boost::unordered_set<test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    find_tests1((boost::unordered_multiset<test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    find_tests1((boost::unordered_map<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    find_tests1((boost::unordered_multimap<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+
     return 0;
 }
Modified: sandbox/unordered/libs/unordered/test/unordered/insert_tests.cpp
==============================================================================
--- sandbox/unordered/libs/unordered/test/unordered/insert_tests.cpp	(original)
+++ sandbox/unordered/libs/unordered/test/unordered/insert_tests.cpp	2007-07-17 19:17:21 EDT (Tue, 17 Jul 2007)
@@ -269,6 +269,11 @@
     unique_insert_tests1((boost::unordered_map<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
     equivalent_insert_tests1((boost::unordered_multimap<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
 
+    unique_insert_tests1((boost::unordered_set<test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    equivalent_insert_tests1((boost::unordered_multiset<test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    unique_insert_tests1((boost::unordered_map<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    equivalent_insert_tests1((boost::unordered_multimap<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+
     insert_tests2((boost::unordered_set<int>*) 0);
     insert_tests2((boost::unordered_multiset<int>*) 0);
     insert_tests2((boost::unordered_map<int, int>*) 0);
@@ -279,11 +284,18 @@
     insert_tests2((boost::unordered_map<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
     insert_tests2((boost::unordered_multimap<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
 
+    insert_tests2((boost::unordered_set<test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    insert_tests2((boost::unordered_multiset<test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    insert_tests2((boost::unordered_map<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+    insert_tests2((boost::unordered_multimap<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
+
     map_tests((boost::unordered_map<int, int>*) 0);
     map_tests((boost::unordered_map<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
+    map_tests((boost::unordered_map<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
 
     associative_insert_range_test((boost::unordered_map<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
     associative_insert_range_test((boost::unordered_multimap<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
+    associative_insert_range_test((boost::unordered_multimap<test::equivalent_object, test::equivalent_object, test::hash, test::equal_to, test::allocator<test::equivalent_object> >*) 0);
 
     return boost::report_errors();
 }