$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: daniel_james_at_[hidden]
Date: 2008-03-24 13:22:26
Author: danieljames
Date: 2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
New Revision: 43839
URL: http://svn.boost.org/trac/boost/changeset/43839
Log:
Merged revisions 42740-43816,43819-43838 via svnmerge from 
https://svn.boost.org/svn/boost/branches/unordered/trunk
Added:
   branches/unordered/dev/libs/unordered/doc/src_code/dictionary.cpp   (contents, props changed)
   branches/unordered/dev/libs/unordered/doc/src_code/intro.cpp   (contents, props changed)
Removed:
   branches/unordered/dev/Jamfile.v2
   branches/unordered/dev/libs/unordered/doc/src_code/insensitive.cpp
Properties modified: 
   branches/unordered/dev/   (props changed)
Text files modified: 
   branches/unordered/dev/boost/functional/hash.hpp                                |     3 -                                       
   branches/unordered/dev/boost/functional/hash/hash.hpp                           |    21 ++++---                                 
   branches/unordered/dev/boost/unordered/detail/hash_table.hpp                    |    12 ++++                                    
   branches/unordered/dev/boost/unordered/detail/hash_table_impl.hpp               |     8 +-                                      
   branches/unordered/dev/doc/Jamfile.v2                                           |    10 +++                                     
   branches/unordered/dev/libs/functional/hash/doc/Jamfile.v2                      |    15 ++++-                                   
   branches/unordered/dev/libs/functional/hash/doc/intro.qbk                       |     3                                         
   branches/unordered/dev/libs/functional/hash/test/hash_number_test.cpp           |     4                                         
   branches/unordered/dev/libs/unordered/doc/Jamfile.v2                            |    15 ++++-                                   
   branches/unordered/dev/libs/unordered/doc/comparison.qbk                        |     2                                         
   branches/unordered/dev/libs/unordered/doc/hash_equality.qbk                     |    36 +++++++------                           
   branches/unordered/dev/libs/unordered/doc/intro.qbk                             |    20 +------                                 
   branches/unordered/dev/libs/unordered/doc/rationale.qbk                         |     2                                         
   branches/unordered/dev/libs/unordered/doc/src_code/point1.cpp                   |     3                                         
   branches/unordered/dev/libs/unordered/doc/unordered.qbk                         |     2                                         
   branches/unordered/dev/libs/unordered/examples/hash_functions/fnv-1.hpp         |     4                                         
   branches/unordered/dev/libs/unordered/test/exception/assign_exception_tests.cpp |     8 ++                                      
   branches/unordered/dev/libs/unordered/test/exception/swap_exception_tests.cpp   |    12 +++-                                    
   branches/unordered/dev/libs/unordered/test/helpers/allocator.hpp                |    15 ++---                                   
   branches/unordered/dev/libs/unordered/test/helpers/exception_test.hpp           |    14 ++---                                   
   branches/unordered/dev/libs/unordered/test/helpers/fwd.hpp                      |     2                                         
   branches/unordered/dev/libs/unordered/test/helpers/generators.hpp               |    28 ---------                               
   branches/unordered/dev/libs/unordered/test/helpers/random_values.hpp            |    92 +++++++++++++++++++++++++++++++++-      
   branches/unordered/dev/libs/unordered/test/helpers/test.hpp                     |    79 +++++++++++++++++++++++++++++           
   branches/unordered/dev/libs/unordered/test/objects/exception.hpp                |    12 +---                                    
   branches/unordered/dev/libs/unordered/test/objects/memory.hpp                   |    28 ++++++++--                              
   branches/unordered/dev/libs/unordered/test/objects/minimal.hpp                  |     3                                         
   branches/unordered/dev/libs/unordered/test/objects/test.hpp                     |    62 +----------------------                 
   branches/unordered/dev/libs/unordered/test/unordered/assign_tests.cpp           |    55 ++++++++++----------                    
   branches/unordered/dev/libs/unordered/test/unordered/at_tests.cpp               |    10 ++-                                     
   branches/unordered/dev/libs/unordered/test/unordered/bucket_tests.cpp           |    24 ++++----                                
   branches/unordered/dev/libs/unordered/test/unordered/compile_map.cpp            |    21 ++-----                                 
   branches/unordered/dev/libs/unordered/test/unordered/compile_set.cpp            |    16 +----                                   
   branches/unordered/dev/libs/unordered/test/unordered/constructor_tests.cpp      |   105 ++++++++++++++------------------------- 
   branches/unordered/dev/libs/unordered/test/unordered/copy_tests.cpp             |    44 +++++++++-------                        
   branches/unordered/dev/libs/unordered/test/unordered/equivalent_keys_tests.cpp  |    18 ++----                                  
   branches/unordered/dev/libs/unordered/test/unordered/erase_equiv_tests.cpp      |    24 ++------                                
   branches/unordered/dev/libs/unordered/test/unordered/erase_tests.cpp            |    62 +++++++++-------------                  
   branches/unordered/dev/libs/unordered/test/unordered/find_tests.cpp             |    44 ++++++++--------                        
   branches/unordered/dev/libs/unordered/test/unordered/insert_stable_tests.cpp    |    14 +---                                    
   branches/unordered/dev/libs/unordered/test/unordered/insert_tests.cpp           |   102 ++++++++++++++++++--------------------  
   branches/unordered/dev/libs/unordered/test/unordered/load_factor_tests.cpp      |    31 ++++++----                              
   branches/unordered/dev/libs/unordered/test/unordered/rehash_tests.cpp           |    21 +++++--                                 
   branches/unordered/dev/libs/unordered/test/unordered/simple_tests.cpp           |    27 +++++----                               
   branches/unordered/dev/libs/unordered/test/unordered/swap_tests.cpp             |    38 ++++++--------                          
   branches/unordered/dev/libs/unordered/test/unordered/unnecessary_copy_tests.cpp |    32 ++++++-----                             
   branches/unordered/dev/project-root.jam                                         |     9 --                                      
   47 files changed, 636 insertions(+), 576 deletions(-)
Deleted: branches/unordered/dev/Jamfile.v2
==============================================================================
--- branches/unordered/dev/Jamfile.v2	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
+++ (empty file)
@@ -1,14 +0,0 @@
-#  (C) Copyright Daniel James 2005-2006.
-#  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)
-
-project /unordered
-        : requirements
-            <include>.
-            <include>$(BOOST_ROOT)
-        : usage-requirements
-            <include>.
-            <include>$(BOOST_ROOT)
-        ;
-
-#use-project /boost/test : $(BOOST_ROOT)/libs/test/build ;
Modified: branches/unordered/dev/boost/functional/hash.hpp
==============================================================================
--- branches/unordered/dev/boost/functional/hash.hpp	(original)
+++ branches/unordered/dev/boost/functional/hash.hpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -9,6 +9,3 @@
 
 #include <boost/functional/hash/hash.hpp>
 
-#if !defined(BOOST_HASH_NO_EXTENSIONS)
-#include <boost/functional/hash/extensions.hpp>
-#endif
Modified: branches/unordered/dev/boost/functional/hash/hash.hpp
==============================================================================
--- branches/unordered/dev/boost/functional/hash/hash.hpp	(original)
+++ branches/unordered/dev/boost/functional/hash/hash.hpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -10,10 +10,6 @@
 #if !defined(BOOST_FUNCTIONAL_HASH_HASH_HPP)
 #define BOOST_FUNCTIONAL_HASH_HASH_HPP
 
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
 #include <boost/functional/hash_fwd.hpp>
 #include <functional>
 #include <boost/functional/detail/hash_float.hpp>
@@ -50,8 +46,8 @@
 #endif
     
 #if defined(BOOST_HAS_LONG_LONG)
-    std::size_t hash_value(long long);
-    std::size_t hash_value(unsigned long long);
+    std::size_t hash_value(boost::long_long_type);
+    std::size_t hash_value(boost::ulong_long_type);
 #endif
 
 #if !BOOST_WORKAROUND(__DMC__, <= 0x848)
@@ -199,12 +195,12 @@
 #endif
 
 #if defined(BOOST_HAS_LONG_LONG)
-    inline std::size_t hash_value(long long v)
+    inline std::size_t hash_value(boost::long_long_type v)
     {
         return hash_detail::hash_value_signed(v);
     }
 
-    inline std::size_t hash_value(unsigned long long v)
+    inline std::size_t hash_value(boost::ulong_long_type v)
     {
         return hash_detail::hash_value_unsigned(v);
     }
@@ -522,3 +518,12 @@
 }
 
 #endif // BOOST_FUNCTIONAL_HASH_HASH_HPP
+
+// Include this outside of the include guards in case the file is included
+// twice - once with BOOST_HASH_NO_EXTENSIONS defined, and then with it
+// undefined.
+
+#if !defined(BOOST_HASH_NO_EXTENSIONS) \
+    && !defined(BOOST_FUNCTIONAL_HASH_EXTENSIONS_HPP)
+#include <boost/functional/hash/extensions.hpp>
+#endif
Modified: branches/unordered/dev/boost/unordered/detail/hash_table.hpp
==============================================================================
--- branches/unordered/dev/boost/unordered/detail/hash_table.hpp	(original)
+++ branches/unordered/dev/boost/unordered/detail/hash_table.hpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -109,6 +109,18 @@
         {
             return std::pair<Dst1, Dst2>(Dst1(x.first), Dst2(x.second));
         }
+
+#if !defined(BOOST_NO_STD_DISTANCE)
+        using ::std::distance;
+#else
+        template <class ForwardIterator>
+        inline std::size_t distance(ForwardIterator i, ForwardIterator j) {
+            std::size_t x;
+            std::distance(i, j, x);
+            return x;
+        }
+#endif
+
     }
 }
 
Modified: branches/unordered/dev/boost/unordered/detail/hash_table_impl.hpp
==============================================================================
--- branches/unordered/dev/boost/unordered/detail/hash_table_impl.hpp	(original)
+++ branches/unordered/dev/boost/unordered/detail/hash_table_impl.hpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -1045,7 +1045,7 @@
                     boost::forward_traversal_tag)
             {
                 // max load factor isn't set yet, but when it is, it'll be 1.0.
-                return (std::max)(static_cast<size_type>(std::distance(i, j)) + 1, n);
+                return (std::max)(static_cast<size_type>(unordered_detail::distance(i, j)) + 1, n);
             }
 
             template <typename I>
@@ -1312,7 +1312,7 @@
                 // throws - basic:
                 if (need_to_reserve) {
                     rehash_impl(double_to_size_t(floor(
-                    	n / (double) mlf_ * 1.25)) + 1);
+                        n / (double) mlf_ * 1.25)) + 1);
                 }
                 BOOST_ASSERT(n < max_load_ || n > max_size());
                 return need_to_reserve;
@@ -1545,7 +1545,7 @@
             template <typename I>
             void insert_for_range(I i, I j, forward_traversal_tag)
             {
-                size_type distance = std::distance(i, j);
+                size_type distance = unordered_detail::distance(i, j);
                 if(distance == 1) {
                     insert(*i);
                 }
@@ -1687,7 +1687,7 @@
             template <typename I>
             size_type insert_size(I i, I j, boost::forward_traversal_tag)
             {
-                return std::distance(i, j);
+                return unordered_detail::distance(i, j);
             }
 
             template <typename I>
Modified: branches/unordered/dev/doc/Jamfile.v2
==============================================================================
--- branches/unordered/dev/doc/Jamfile.v2	(original)
+++ branches/unordered/dev/doc/Jamfile.v2	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -12,4 +12,14 @@
      <implicit-dependency>../libs/functional/hash/doc//hash
 
      <xsl:param>boost.libraries=../../libs/libraries.htm
+
+     <dependency>css
+     <dependency>images
     ;
+
+install css : [ glob $(BOOST_ROOT)/doc/src/*.css ]
+    : <location>html ;
+install images : [ glob $(BOOST_ROOT)/doc/src/images/*.png ]
+    : <location>html/images ;
+explicit css ;
+explicit images ;
Modified: branches/unordered/dev/libs/functional/hash/doc/Jamfile.v2
==============================================================================
--- branches/unordered/dev/libs/functional/hash/doc/Jamfile.v2	(original)
+++ branches/unordered/dev/libs/functional/hash/doc/Jamfile.v2	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -3,8 +3,6 @@
 # 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)
 
-using quickbook ;
-
 xml hash : hash.qbk ;
 boostbook standalone : hash :
     <xsl:param>boost.root=../../../../..
@@ -14,4 +12,15 @@
     <xsl:param>chunk.section.depth=2
     <xsl:param>generate.section.toc.level=2
     <xsl:param>toc.section.depth=1
-    <xsl:param>toc.max.depth=1 ;
+    <xsl:param>toc.max.depth=1
+
+    <dependency>css
+    <dependency>images
+    ;
+
+install css : [ glob $(BOOST_ROOT)/doc/src/*.css ]
+    : <location>html ;
+install images : [ glob $(BOOST_ROOT)/doc/src/images/*.png ]
+    : <location>html/images ;
+explicit css ;
+explicit images ;
Modified: branches/unordered/dev/libs/functional/hash/doc/intro.qbk
==============================================================================
--- branches/unordered/dev/libs/functional/hash/doc/intro.qbk	(original)
+++ branches/unordered/dev/libs/functional/hash/doc/intro.qbk	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -17,8 +17,7 @@
     Boost Multi-Index Containers Library]]
 [def __multi-index-short__ [@../../libs/multi_index/doc/index.html
     Boost.MultiIndex]]
-[def __bimap__ [@../../libs/bimap/doc/index.html
-    Boost.Bimap]]
+[def __bimap__ [@../../libs/bimap/index.html Boost.Bimap]]
 [def __issues__
     [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1837.pdf
     Library Extension Technical Report Issues List]]
Modified: branches/unordered/dev/libs/functional/hash/test/hash_number_test.cpp
==============================================================================
--- branches/unordered/dev/libs/functional/hash/test/hash_number_test.cpp	(original)
+++ branches/unordered/dev/libs/functional/hash/test/hash_number_test.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -150,8 +150,8 @@
     NUMERIC_TEST(unsigned long, ulong)
 
 #if defined(BOOST_HAS_LONG_LONG)
-    NUMERIC_TEST_NO_LIMITS(long long, hash_longlong)
-    NUMERIC_TEST_NO_LIMITS(unsigned long long, ulonglong)
+    NUMERIC_TEST_NO_LIMITS(boost::long_long_type, long_long)
+    NUMERIC_TEST_NO_LIMITS(boost::ulong_long_type, ulong_long)
 #endif
 
     NUMERIC_TEST(float, float)
Modified: branches/unordered/dev/libs/unordered/doc/Jamfile.v2
==============================================================================
--- branches/unordered/dev/libs/unordered/doc/Jamfile.v2	(original)
+++ branches/unordered/dev/libs/unordered/doc/Jamfile.v2	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -3,8 +3,6 @@
 # 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)
 
-using quickbook ;
-
 xml unordered : unordered.qbk ;
 boostbook standalone : unordered :
     <xsl:param>boost.root=../../../..
@@ -14,4 +12,15 @@
     <xsl:param>chunk.section.depth=2
     <xsl:param>generate.section.toc.level=2
     <xsl:param>toc.section.depth=1
-    <xsl:param>toc.max.depth=1 ;
+    <xsl:param>toc.max.depth=1
+
+    <dependency>css
+    <dependency>images
+    ;
+
+install css : [ glob $(BOOST_ROOT)/doc/src/*.css ]
+    : <location>html ;
+install images : [ glob $(BOOST_ROOT)/doc/src/images/*.png ]
+    : <location>html/images ;
+explicit css ;
+explicit images ;
Modified: branches/unordered/dev/libs/unordered/doc/comparison.qbk
==============================================================================
--- branches/unordered/dev/libs/unordered/doc/comparison.qbk	(original)
+++ branches/unordered/dev/libs/unordered/doc/comparison.qbk	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -83,7 +83,7 @@
     ]
     [
         [`erase` never throws an exception]
-        [The containers hash or predicate function can throw exceptions
+        [The containers' hash or predicate function can throw exceptions
             from `erase`]
     ]
 ]
Modified: branches/unordered/dev/libs/unordered/doc/hash_equality.qbk
==============================================================================
--- branches/unordered/dev/libs/unordered/doc/hash_equality.qbk	(original)
+++ branches/unordered/dev/libs/unordered/doc/hash_equality.qbk	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -6,32 +6,35 @@
 
 While the associative containers use an ordering relation to specify how the
 elements are stored, the unordered associative containers use an equality
-predicate and a hash function. For example, [classref boost::unordered_set]
+predicate and a hash function. For example, [classref boost::unordered_map]
 is declared as:
 
-    template<typename Value,
-           typename Hash = ``[classref boost::hash]``<Value>, 
-           typename Pred = std::equal_to<Value>, 
-           typename Alloc = std::allocator<Value> > 
-    class ``[classref boost::unordered_set unordered_set]``;
+        template <
+            class Key, class Mapped,
+            class Hash = ``[classref boost::hash]``<Key>,
+            class Pred = std::equal_to<Key>,
+            class Alloc = std::allocator<Key> >
+        class ``[classref boost::unordered_map unordered_map]``;
 
 The hash function comes first as you might want to change the hash function
-but not the equality predicate, while if you were to change the behavior
-of the equality predicate you would have to change the hash function to match
-it.  So, if you wanted to use the
+but not the equality predicate. For example, if you wanted to use the
 [@http://www.isthe.com/chongo/tech/comp/fnv/ FNV-1 hash] you could write:
 
-    ``[classref boost::unordered_set]``<std::string, hash::fnv_1> words;
+[import src_code/dictionary.cpp]
+[case_sensitive_dictionary_fnv]
 
 An example implementation of FNV-1, and some other hash functions are supplied
 in the examples directory.
 
-Alternatively, you might wish to use a different equality function. If you do
-this you will need to use a hash function that matches it. So to implement a
-case-insensitive dictionary:
+If you wish to use a different equality function,
+you will also need to use a matching hash function. For
+example, to implement a case insensitive dictionary you need to define a
+case insensitive equality predicate and hash function:
 
-[import src_code/insensitive.cpp]
 [case_insensitive_functions]
+
+Which you can then use in a case insensitive dictionary:
+
 [case_insensitive_dictionary]
 
 This is a simplified version of the example at
@@ -45,8 +48,9 @@
 [import src_code/point1.cpp]
 [point_example1]
 
-Although, [link hash.custom extending boost::hash to support the type] is
-probably a better solution:
+Since the default hash function is [link hash Boost.Hash],
+we can [link hash.custom extend it to support the type]
+so that the hash function doesn't need to be explicitly given:
 
 [import src_code/point2.cpp]
 [point_example2]
Modified: branches/unordered/dev/libs/unordered/doc/intro.qbk
==============================================================================
--- branches/unordered/dev/libs/unordered/doc/intro.qbk	(original)
+++ branches/unordered/dev/libs/unordered/doc/intro.qbk	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -84,32 +84,18 @@
 The containers are used in a similar manner to the normal associative
 containers:
 
-    #include <``[headerref boost/unordered_map.hpp]``>
-    #include <cassert>
-
-    int main()
-    {
-        boost::unordered_map<std::string, int> x;
-        x["one"] = 1;
-        x["two"] = 2;
-        x["three"] = 3;
-
-        assert(x["one"] == 1);
-        assert(x["missing"] == 0);
-    }
+[import src_code/intro.cpp]
+[intro_example1_2]
 
 But since the elements aren't ordered, the output of:
 
-    BOOST_FOREACH(map::value_type i, x) {
-        std::cout<<i.first<<","<<i.second<<"\n";
-    }
+[intro_example1_3]
 
 can be in any order. For example, it might be:
 
     two,2
     one,1
     three,3
-    missing,0
 
 To store an object in an unordered associative container requires both an
 key equality function and a hash function. The default function objects in
Modified: branches/unordered/dev/libs/unordered/doc/rationale.qbk
==============================================================================
--- branches/unordered/dev/libs/unordered/doc/rationale.qbk	(original)
+++ branches/unordered/dev/libs/unordered/doc/rationale.qbk	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -10,7 +10,7 @@
     N2345, 'Placement Insert for Containers']]
 [def __n2369__
     [@http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2007/n2369.pdf
-    the August 2008 version of the working draft standard]]
+    the August 2007 version of the working draft standard]]
 
 [section:rationale Implementation Rationale]
 
Added: branches/unordered/dev/libs/unordered/doc/src_code/dictionary.cpp
==============================================================================
--- (empty file)
+++ branches/unordered/dev/libs/unordered/doc/src_code/dictionary.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -0,0 +1,103 @@
+
+// Copyright 2006-2007 Daniel James.
+// 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)
+
+#include <boost/unordered_map.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/algorithm/string/predicate.hpp>
+#include "../../examples/hash_functions/fnv-1.hpp"
+
+//[case_insensitive_functions
+    struct iequal_to
+        : std::binary_function<std::string, std::string, bool>
+    {
+        bool operator()(std::string const& x,
+            std::string const& y) const
+        {
+            return boost::algorithm::iequals(x, y, std::locale());
+        }
+    };
+
+    struct ihash
+        : std::unary_function<std::string, std::size_t>
+    {
+        std::size_t operator()(std::string const& x) const
+        {
+            std::size_t seed = 0;
+            std::locale locale;
+
+            for(std::string::const_iterator it = x.begin();
+                it != x.end(); ++it)
+            {
+                boost::hash_combine(seed, std::toupper(*it, locale));
+            }
+
+            return seed;
+        }
+    };
+//]
+
+int main() {
+//[case_sensitive_dictionary_fnv
+    boost::unordered_map<std::string, int, hash::fnv_1>
+        dictionary;
+//]
+
+    BOOST_TEST(dictionary.empty());
+
+    dictionary["one"] = 1;
+    BOOST_TEST(dictionary.size() == 1);
+    BOOST_TEST(dictionary.find("ONE") == dictionary.end());
+
+    dictionary.insert(std::make_pair("ONE", 2));
+    BOOST_TEST(dictionary.size() == 2);
+    BOOST_TEST(dictionary.find("ONE") != dictionary.end() &&
+            dictionary.find("ONE")->first == "ONE" &&
+            dictionary.find("ONE")->second == 2);
+
+    dictionary["One"] = 3;
+    BOOST_TEST(dictionary.size() == 3);
+    BOOST_TEST(dictionary.find("One") != dictionary.end() &&
+            dictionary.find("One")->first == "One" &&
+            dictionary.find("One")->second == 3);
+
+    dictionary["two"] = 4;
+    BOOST_TEST(dictionary.size() == 4);
+    BOOST_TEST(dictionary.find("Two") == dictionary.end() &&
+            dictionary.find("two") != dictionary.end() &&
+            dictionary.find("two")->second == 4);
+
+
+//[case_insensitive_dictionary
+    boost::unordered_map<std::string, int, ihash, iequal_to>
+        idictionary;
+//]
+
+    BOOST_TEST(idictionary.empty());
+
+    idictionary["one"] = 1;
+    BOOST_TEST(idictionary.size() == 1);
+    BOOST_TEST(idictionary.find("ONE") != idictionary.end() &&
+        idictionary.find("ONE") == idictionary.find("one"));
+
+    idictionary.insert(std::make_pair("ONE", 2));
+    BOOST_TEST(idictionary.size() == 1);
+    BOOST_TEST(idictionary.find("ONE") != idictionary.end() &&
+            idictionary.find("ONE")->first == "one" &&
+            idictionary.find("ONE")->second == 1);
+
+    idictionary["One"] = 3;
+    BOOST_TEST(idictionary.size() == 1);
+    BOOST_TEST(idictionary.find("ONE") != idictionary.end() &&
+            idictionary.find("ONE")->first == "one" &&
+            idictionary.find("ONE")->second == 3);
+
+    idictionary["two"] = 4;
+    BOOST_TEST(idictionary.size() == 2);
+    BOOST_TEST(idictionary.find("two") != idictionary.end() &&
+            idictionary.find("TWO")->first == "two" &&
+            idictionary.find("Two")->second == 4);
+
+    return boost::report_errors();
+}
Deleted: branches/unordered/dev/libs/unordered/doc/src_code/insensitive.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/doc/src_code/insensitive.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
+++ (empty file)
@@ -1,79 +0,0 @@
-
-// Copyright 2006-2007 Daniel James.
-// 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)
-
-#include <boost/unordered_map.hpp>
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/algorithm/string/predicate.hpp>
-
-//[case_insensitive_functions
-    struct iequal_to
-        : std::binary_function<std::string, std::string, bool>
-    {
-        bool operator()(std::string const& x,
-            std::string const& y) const
-        {
-            return boost::algorithm::iequals(x, y, std::locale());
-        }
-    };
-
-    struct ihash
-        : std::unary_function<std::string, std::size_t>
-    {
-        std::size_t operator()(std::string const& x) const
-        {
-            std::size_t seed = 0;
-            std::locale locale;
-
-            for(std::string::const_iterator it = x.begin();
-                it != x.end(); ++it)
-            {
-                boost::hash_combine(seed, std::toupper(*it, locale));
-            }
-
-            return seed;
-        }
-    };
-
-    struct word_info;
-//]
-
-    struct word_info {
-        int tag;
-        explicit word_info(int t = 0) : tag(t) {}
-    };
-
-int main() {
-//[case_insensitive_dictionary
-    boost::unordered_map<std::string, word_info, ihash, iequal_to>
-        idictionary;
-//]
-
-    BOOST_TEST(idictionary.empty());
-
-    idictionary["one"] = word_info(1);
-    BOOST_TEST(idictionary.size() == 1);
-    BOOST_TEST(idictionary.find("ONE") != idictionary.end() &&
-        idictionary.find("ONE") == idictionary.find("one"));
-
-    idictionary.insert(std::make_pair("ONE", word_info(2)));
-    BOOST_TEST(idictionary.size() == 1);
-    BOOST_TEST(idictionary.find("ONE") != idictionary.end() &&
-            idictionary.find("ONE")->first == "one" &&
-            idictionary.find("ONE")->second.tag == 1);
-
-    idictionary["One"] = word_info(3);
-    BOOST_TEST(idictionary.size() == 1);
-    BOOST_TEST(idictionary.find("ONE") != idictionary.end() &&
-            idictionary.find("ONE")->first == "one" &&
-            idictionary.find("ONE")->second.tag == 3);
-
-    idictionary["two"] = word_info(4);
-    BOOST_TEST(idictionary.size() == 2);
-    BOOST_TEST(idictionary.find("two") != idictionary.end() &&
-            idictionary.find("TWO")->first == "two" &&
-            idictionary.find("Two")->second.tag == 4);
-
-    return boost::report_errors();
-}
Added: branches/unordered/dev/libs/unordered/doc/src_code/intro.cpp
==============================================================================
--- (empty file)
+++ branches/unordered/dev/libs/unordered/doc/src_code/intro.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -0,0 +1,30 @@
+
+// Copyright 2006-2008 Daniel James.
+// 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)
+
+//[intro_example1_1
+#include <boost/unordered_map.hpp>
+#include <boost/foreach.hpp>
+#include <cassert>
+#include <iostream>
+//]
+
+int main() {
+//[intro_example1_2
+    typedef boost::unordered_map<std::string, int> map;
+    map x;
+    x["one"] = 1;
+    x["two"] = 2;
+    x["three"] = 3;
+
+    assert(x.at("one") == 1);
+    assert(x.find("missing") == x.end());
+//]
+
+//[intro_example1_3
+    BOOST_FOREACH(map::value_type i, x) {
+        std::cout<<i.first<<","<<i.second<<"\n";
+    }
+//]
+}
Modified: branches/unordered/dev/libs/unordered/doc/src_code/point1.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/doc/src_code/point1.cpp	(original)
+++ branches/unordered/dev/libs/unordered/doc/src_code/point1.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -29,8 +29,7 @@
         }
     };
 
-    boost::unordered_multiset<point, point_hash, std::equal_to<point> >
-        points;
+    boost::unordered_multiset<point, point_hash> points;
 //]
 
 int main() {
Modified: branches/unordered/dev/libs/unordered/doc/unordered.qbk
==============================================================================
--- branches/unordered/dev/libs/unordered/doc/unordered.qbk	(original)
+++ branches/unordered/dev/libs/unordered/doc/unordered.qbk	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -2,7 +2,7 @@
  / 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) ]
 
-[library Unordered Associative Containers
+[library Boost.Unordered
     [quickbook 1.4]
     [authors [James, Daniel]]
     [copyright 2003 2004 Jeremy B. Maitin-Shepard]
Modified: branches/unordered/dev/libs/unordered/examples/hash_functions/fnv-1.hpp
==============================================================================
--- branches/unordered/dev/libs/unordered/examples/hash_functions/fnv-1.hpp	(original)
+++ branches/unordered/dev/libs/unordered/examples/hash_functions/fnv-1.hpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -7,7 +7,7 @@
     template <std::size_t FnvPrime, std::size_t OffsetBias>
     struct basic_fnv_1
     {
-        std::size_t operator()(std::string const& text)
+        std::size_t operator()(std::string const& text) const
         {
             std::size_t hash = OffsetBias;
             for(std::string::const_iterator it = text.begin(), end = text.end();
@@ -24,7 +24,7 @@
     template <std::size_t FnvPrime, std::size_t OffsetBias>
     struct basic_fnv_1a
     {
-        std::size_t operator()(std::string const& text)
+        std::size_t operator()(std::string const& text) const
         {
             std::size_t hash = OffsetBias;
             for(std::string::const_iterator it = text.begin(), end = text.end();
Modified: branches/unordered/dev/libs/unordered/test/exception/assign_exception_tests.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/exception/assign_exception_tests.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/exception/assign_exception_tests.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -36,10 +36,14 @@
     const test::random_values<T> x_values, y_values;
     const T x,y;
 
+    typedef BOOST_DEDUCED_TYPENAME T::hasher hasher;
+    typedef BOOST_DEDUCED_TYPENAME T::key_equal key_equal;
+    typedef BOOST_DEDUCED_TYPENAME T::allocator_type allocator_type;
+
     assign_base(unsigned int count1, unsigned int count2, int tag1, int tag2)
         : x_values(count1), y_values(count2),
-        x(x_values.begin(), x_values.end(), 0, BOOST_DEDUCED_TYPENAME T::hasher(tag1), BOOST_DEDUCED_TYPENAME T::key_equal(tag1), BOOST_DEDUCED_TYPENAME T::allocator_type(tag1)),
-        y(y_values.begin(), y_values.end(), 0, BOOST_DEDUCED_TYPENAME T::hasher(tag2), BOOST_DEDUCED_TYPENAME T::key_equal(tag2), BOOST_DEDUCED_TYPENAME T::allocator_type(tag2)) {}
+        x(x_values.begin(), x_values.end(), 0, hasher(tag1), key_equal(tag1), allocator_type(tag1)),
+        y(y_values.begin(), y_values.end(), 0, hasher(tag2), key_equal(tag2), allocator_type(tag2)) {}
 
     typedef T data_type;
     T init() const { return T(x); }
Modified: branches/unordered/dev/libs/unordered/test/exception/swap_exception_tests.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/exception/swap_exception_tests.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/exception/swap_exception_tests.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -48,12 +48,16 @@
     const test::random_values<T> x_values, y_values;
     const T initial_x, initial_y;
 
+    typedef BOOST_DEDUCED_TYPENAME T::hasher hasher;
+    typedef BOOST_DEDUCED_TYPENAME T::key_equal key_equal;
+    typedef BOOST_DEDUCED_TYPENAME T::allocator_type allocator_type;
+
     swap_base(unsigned int count1, unsigned int count2, int tag1, int tag2)
         : x_values(count1), y_values(count2),
-        initial_x(x_values.begin(), x_values.end(), 0, BOOST_DEDUCED_TYPENAME T::hasher(tag1),
-                BOOST_DEDUCED_TYPENAME T::key_equal(tag1), BOOST_DEDUCED_TYPENAME T::allocator_type(tag1)),
-        initial_y(y_values.begin(), y_values.end(), 0, BOOST_DEDUCED_TYPENAME T::hasher(tag2),
-                BOOST_DEDUCED_TYPENAME T::key_equal(tag2), BOOST_DEDUCED_TYPENAME T::allocator_type(tag2))
+        initial_x(x_values.begin(), x_values.end(), 0, hasher(tag1),
+                key_equal(tag1), allocator_type(tag1)),
+        initial_y(y_values.begin(), y_values.end(), 0, hasher(tag2),
+                key_equal(tag2), allocator_type(tag2))
     {}
 
     struct data_type {
Modified: branches/unordered/dev/libs/unordered/test/helpers/allocator.hpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/helpers/allocator.hpp	(original)
+++ branches/unordered/dev/libs/unordered/test/helpers/allocator.hpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -9,6 +9,7 @@
 #include <cstddef>
 #include <cstdlib>
 #include <boost/limits.hpp>
+#include <new>
 
 #if defined(BOOST_MSVC)
 #pragma warning(push)
@@ -39,16 +40,12 @@
 
         pointer allocate(size_type n) {
             using namespace std;
-            return static_cast<T*>(malloc(n * sizeof(T)));
+            T* ptr = static_cast<T*>(malloc(n * sizeof(T)));
+            if(!ptr) throw std::bad_alloc();
+            return ptr;
         }
 
-        pointer allocate(size_type n, const_pointer u) { return allocate(n); }
-
-#if defined(__IBMCPP__)
-        // Workaround for IBM Visual Age which seems to use a void pointer
-        // for the second argument.
         pointer allocate(size_type n, void const* u) { return allocate(n); }
-#endif
 
         void deallocate(pointer p, size_type) {
             using namespace std;
@@ -71,7 +68,9 @@
         }
         char* _Charalloc(size_type n) {
             using namespace std;
-            return static_cast<char*>(malloc(n * sizeof(char)));
+            T* ptr = static_cast<T*>(malloc(n * sizeof(char)));
+            if(!ptr) throw std::bad_alloc();
+            return ptr;
         }
 #endif
     };
Modified: branches/unordered/dev/libs/unordered/test/helpers/exception_test.hpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/helpers/exception_test.hpp	(original)
+++ branches/unordered/dev/libs/unordered/test/helpers/exception_test.hpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -19,30 +19,28 @@
 #include <boost/preprocessor/cat.hpp>
 
 #if defined(BOOST_UNORDERED_USE_TEST)
-#   define UNORDERED_EXCEPTION_TEST_PREFIX
 #   define UNORDERED_EXCEPTION_TEST_CASE(name, test_func, type) \
-        BOOST_AUTO_TEST_CASE(name) \
+        UNORDERED_AUTO_TEST(name) \
         { \
             test_func< type > fixture; \
             ::test::exception_safety(fixture, BOOST_STRINGIZE(test_func<type>)); \
         }
-#    define UNORDERED_EXCEPTION_TEST_POSTFIX
 #    define UNORDERED_EPOINT_IMPL BOOST_ITEST_EPOINT
 #else
-#    define UNORDERED_EXCEPTION_TEST_PREFIX int main() {
-#    define UNORDERED_EXCEPTION_TEST_CASE(name, test_func, type) \
+#   define UNORDERED_EXCEPTION_TEST_CASE(name, test_func, type) \
+        UNORDERED_AUTO_TEST(name) \
         { \
             test_func< type > fixture; \
             ::test::lightweight::exception_safety(fixture, BOOST_STRINGIZE(test_func<type>)); \
         }
-#    define UNORDERED_EXCEPTION_TEST_POSTFIX return boost::report_errors(); }
 #    define UNORDERED_EPOINT_IMPL ::test::lightweight::epoint
 #endif
 
+#define UNORDERED_EXCEPTION_TEST_POSTFIX RUN_TESTS()
+
 #define RUN_EXCEPTION_TESTS(test_seq, param_seq) \
-    UNORDERED_EXCEPTION_TEST_PREFIX \
     BOOST_PP_SEQ_FOR_EACH_PRODUCT(RUN_EXCEPTION_TESTS_OP, (test_seq)(param_seq)) \
-    UNORDERED_EXCEPTION_TEST_POSTFIX
+    RUN_TESTS()
 
 #define RUN_EXCEPTION_TESTS_OP(r, product) \
     UNORDERED_EXCEPTION_TEST_CASE( \
Modified: branches/unordered/dev/libs/unordered/test/helpers/fwd.hpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/helpers/fwd.hpp	(original)
+++ branches/unordered/dev/libs/unordered/test/helpers/fwd.hpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -15,8 +15,6 @@
     signed char generate(signed char const*);
     std::string generate(std::string*);
     float generate(float const*);
-    template <class T1, class T2>
-    std::pair<T1, T2> generate(std::pair<T1, T2>*);
 
     struct base_type {} base;
     struct derived_type : base_type {} derived;
Modified: branches/unordered/dev/libs/unordered/test/helpers/generators.hpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/helpers/generators.hpp	(original)
+++ branches/unordered/dev/libs/unordered/test/helpers/generators.hpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -16,7 +16,6 @@
 #include <stdexcept>
 #include <cstdlib>
 #include <boost/type_traits/add_const.hpp>
-
 #include "./fwd.hpp"
 
 namespace test
@@ -27,29 +26,6 @@
             srand(x);
         }
     };
-    
-    template <class T>
-    struct generator;
-
-    template <class T1, class T2> std::pair<T1, T2> generate(
-            std::pair<T1, T2> const*)
-    {
-        static generator<T1> g1;
-        static generator<T2> g2;
-
-        return std::pair<T1, T2>(g1(), g2());
-    }
-
-    template <class T>
-    struct generator
-    {
-        typedef T value_type;
-        typedef BOOST_DEDUCED_TYPENAME boost::add_const<T>::type const_value_type;
-        value_type operator()() const
-        {
-            return generate((const_value_type*) 0);
-        }
-    };
 
     inline int generate(int const*)
     {
@@ -73,13 +49,13 @@
     {
         using namespace std;
 
-        static test::generator<char> char_gen;
+        char* char_ptr = 0;
 
         std::string result;
 
         int length = rand() % 10;
         for(int i = 0; i < length; ++i)
-            result += char_gen();
+            result += generate(char_ptr);
 
         return result;
     }
Modified: branches/unordered/dev/libs/unordered/test/helpers/random_values.hpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/helpers/random_values.hpp	(original)
+++ branches/unordered/dev/libs/unordered/test/helpers/random_values.hpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -8,18 +8,102 @@
 
 #include <list>
 #include <algorithm>
+#include <boost/mpl/if.hpp>
 #include "./generators.hpp"
+#include "./metafunctions.hpp"
 
 namespace test
 {
+    typedef enum {
+        default_generator,
+        generate_collisions
+    } random_generator;
+
+    template <class X>
+    struct unordered_generator_set
+    {
+        typedef BOOST_DEDUCED_TYPENAME X::value_type value_type;
+
+        random_generator type_;
+
+        unordered_generator_set(random_generator type)
+            : type_(type) {}
+
+        template <class T>
+        void fill(T& x, std::size_t len) {
+            value_type* value_ptr = 0;
+            int* int_ptr = 0;
+
+            for(std::size_t i = 0; i < len; ++i) {
+                value_type value = generate(value_ptr);
+
+                for(int count =
+                    type_ == generate_collisions ?
+                    generate(int_ptr) % 10 : 1;
+                    count; --count) {
+                    x.push_back(value);
+                }
+            }
+        }
+    };
+
+    template <class X>
+    struct unordered_generator_map
+    {
+        typedef BOOST_DEDUCED_TYPENAME X::key_type key_type;
+        typedef BOOST_DEDUCED_TYPENAME X::mapped_type mapped_type;
+
+        random_generator type_;
+
+        unordered_generator_map(random_generator type)
+            : type_(type) {}
+
+        template <class T>
+        void fill(T& x, std::size_t len) {
+            key_type* key_ptr = 0;
+            mapped_type* mapped_ptr = 0;
+            int* int_ptr = 0;
+
+            for(std::size_t i = 0; i < len; ++i) {
+                key_type key = generate(key_ptr);
+
+                for(int count =
+                    type_ == generate_collisions ?
+                    generate(int_ptr) % 10 : 1;
+                    count; --count) {
+                    x.push_back(std::pair<key_type const, mapped_type>(key, generate(mapped_ptr)));
+                }
+            }
+        }
+    };
+
+    template <class X>
+    struct unordered_generator_base
+        : public boost::mpl::if_<
+            test::is_set<X>,
+            test::unordered_generator_set<X>,
+            test::unordered_generator_map<X> >
+    {
+    };
+
+    template <class X>
+    struct unordered_generator : public unordered_generator_base<X>::type
+    {
+        typedef BOOST_DEDUCED_TYPENAME unordered_generator_base<X>::type base;
+
+        unordered_generator(random_generator const& type = default_generator)
+            : base(type) {}
+    };
+
     template <class X>
     struct random_values
         : public std::list<BOOST_DEDUCED_TYPENAME X::value_type>
     {
-        random_values(int count) {
-            typedef BOOST_DEDUCED_TYPENAME X::value_type value_type;
-            static test::generator<value_type> gen;
-            std::generate_n(std::back_inserter(*this), count, gen);
+        random_values(int count, test::random_generator const& generator =
+            test::default_generator)
+        {
+            static test::unordered_generator<X> gen(generator);
+            gen.fill(*this, count);
         }
     };
 }
Modified: branches/unordered/dev/libs/unordered/test/helpers/test.hpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/helpers/test.hpp	(original)
+++ branches/unordered/dev/libs/unordered/test/helpers/test.hpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -7,13 +7,90 @@
 #define BOOST_UNORDERED_TEST_TEST_HEADER
 
 #if defined(BOOST_UNORDERED_USE_TEST)
+
 #include <boost/test/test_tools.hpp>
 #define UNORDERED_CHECK(x) BOOST_CHECK(x)
 #define UNORDERED_REQUIRE(x) BOOST_REQUIRE(x)
+#define UNORDERED_AUTO_TEST(x) BOOST_AUTO_TEST_CASE(x)
+#define RUN_TESTS()
+
 #else
+
 #include <boost/detail/lightweight_test.hpp>
+#include <boost/preprocessor/cat.hpp>
+
 #define UNORDERED_CHECK(x) BOOST_TEST(x)
-#define UNORDERED_REQUIRE(x) if(!(x)) { BOOST_ERROR(BOOST_STRINGIZE(x)); throw test::lightweight::test_failure(); }
+#define UNORDERED_REQUIRE(x) if(!(x)) { BOOST_ERROR(BOOST_STRINGIZE(x)); throw ::test::lightweight::test_failure(); }
+#define UNORDERED_AUTO_TEST(x) \
+    struct BOOST_PP_CAT(x, _type) : public ::test::registered_test_base { \
+        BOOST_PP_CAT(x, _type)() { \
+            ::test::test_list::add_test(this); \
+        } \
+        void run(); \
+    }; \
+    BOOST_PP_CAT(x, _type) x; \
+    void BOOST_PP_CAT(x, _type)::run()
+#define RUN_TESTS() int main() { ::test::test_list::run_tests(); return boost::report_errors(); }
+
+namespace test {
+    struct registered_test_base {
+        registered_test_base* next;
+        virtual void run() = 0;
+        virtual ~registered_test_base() {}
+    };
+
+    namespace test_list {
+        static inline registered_test_base*& first() {
+            static registered_test_base* ptr = 0;
+            return ptr;
+        }
+
+        static inline registered_test_base*& last() {
+            static registered_test_base* ptr = 0;
+            return ptr;
+        }
+
+        static inline void add_test(registered_test_base* test) {
+            if(last()) {
+                last()->next = test;
+            }
+            else {
+                first() = test;
+            }
+
+            last() = test;
+        }
+
+        static inline void run_tests() {
+            for(registered_test_base* i = first(); i; i = i->next)
+                i->run();
+        }
+    };
+}
+
 #endif
 
+#include <boost/preprocessor/seq/for_each_product.hpp>
+#include <boost/preprocessor/seq/fold_left.hpp>
+#include <boost/preprocessor/seq/to_tuple.hpp>
+#include <boost/preprocessor/seq/seq.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+// Run test with every combination of the parameters (a sequence of sequences)
+#define UNORDERED_TEST(name, parameters) \
+    BOOST_PP_SEQ_FOR_EACH_PRODUCT(UNORDERED_TEST_OP, ((name)) parameters)
+
+#define UNORDERED_TEST_OP(r, product) \
+    UNORDERED_TEST_OP2( \
+        BOOST_PP_SEQ_HEAD(product), \
+        BOOST_PP_SEQ_TAIL(product))
+
+#define UNORDERED_TEST_OP2(name, params) \
+    UNORDERED_AUTO_TEST(BOOST_PP_SEQ_FOLD_LEFT(UNORDERED_TEST_OP_JOIN, name, params)) { \
+        name BOOST_PP_SEQ_TO_TUPLE(params); \
+    }
+
+#define UNORDERED_TEST_OP_JOIN(s, state, elem) \
+    BOOST_PP_CAT(state, BOOST_PP_CAT(_, elem))
+
 #endif
Modified: branches/unordered/dev/libs/unordered/test/objects/exception.hpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/objects/exception.hpp	(original)
+++ branches/unordered/dev/libs/unordered/test/objects/exception.hpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -11,6 +11,7 @@
 #include <cstddef>
 #include <iostream>
 #include <boost/limits.hpp>
+#include <new>
 #include "../helpers/fwd.hpp"
 #include "../helpers/allocator.hpp"
 #include "./memory.hpp"
@@ -21,15 +22,9 @@
 {
     namespace detail
     {
-        struct malloc_allocator_holder {
-            template <class T> struct apply {
-                typedef test::malloc_allocator<T> type;
-            };
-        };
-
         namespace
         {
-            test::detail::memory_tracker<malloc_allocator_holder> tracker;
+            test::detail::memory_tracker<test::malloc_allocator<int> > tracker;
         }
     }
 
@@ -37,6 +32,7 @@
     class hash;
     class equal_to;
     template <class T> class allocator;
+    object generate(object const*);
 
     class object
     {
@@ -317,7 +313,7 @@
             //return pointer(static_cast<T*>(::operator new(n * sizeof(T))));
         }
 
-        pointer allocate(size_type n, const_pointer u)
+        pointer allocate(size_type n, void const* u)
         {
             T* ptr = 0;
             UNORDERED_SCOPE(allocator::allocate(size_type, const_pointer)) {
Modified: branches/unordered/dev/libs/unordered/test/objects/memory.hpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/objects/memory.hpp	(original)
+++ branches/unordered/dev/libs/unordered/test/objects/memory.hpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -10,6 +10,8 @@
 #include <map>
 #include <boost/mpl/apply.hpp>
 #include <boost/assert.hpp>
+#include <boost/unordered/detail/allocator.hpp>
+#include <boost/mpl/aux_/config/eti.hpp>
 #include "../helpers/test.hpp"
 
 namespace test
@@ -56,14 +58,28 @@
             }
         };
 
-        struct default_allocator_holder { template <class T> struct apply {
-            typedef std::allocator<T> type; }; };
+        template <class Alloc>
+        struct allocator_memory_type_gen {
+            typedef std::map<memory_area, memory_track, memory_area_compare,
+                Alloc> type;
+        };
 
-        template <class AllocatorHolder = default_allocator_holder>
+#if defined(BOOST_MPL_CFG_MSVC_ETI_BUG)
+        template <>
+        struct allocator_memory_type_gen<int> {
+            typedef std::map<memory_area, memory_track, memory_area_compare> type;
+        };
+#endif
+
+        template <class Alloc = std::allocator<int> >
         struct memory_tracker {
-            typedef std::map<memory_area, memory_track, memory_area_compare,
-                BOOST_DEDUCED_TYPENAME boost::mpl::apply1<AllocatorHolder, std::pair<memory_area const, memory_track> >::type
-            > allocated_memory_type;
+            typedef BOOST_DEDUCED_TYPENAME
+                boost::unordered_detail::rebind_wrap<Alloc,
+                    std::pair<memory_area const, memory_track> >::type
+                allocator_type;
+
+            typedef BOOST_DEDUCED_TYPENAME allocator_memory_type_gen<allocator_type>::type
+                allocated_memory_type;
 
             allocated_memory_type allocated_memory;
             unsigned int count_allocators;
Modified: branches/unordered/dev/libs/unordered/test/objects/minimal.hpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/objects/minimal.hpp	(original)
+++ branches/unordered/dev/libs/unordered/test/objects/minimal.hpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -219,7 +219,8 @@
             return pointer(static_cast<T*>(::operator new(n * sizeof(T))));
         }
 
-        pointer allocate(size_type n, const_pointer u)
+        template <class Y>
+        pointer allocate(size_type n, const_ptr<Y> u)
         {
             return pointer(static_cast<T*>(::operator new(n * sizeof(T))));
         }
Modified: branches/unordered/dev/libs/unordered/test/objects/test.hpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/objects/test.hpp	(original)
+++ branches/unordered/dev/libs/unordered/test/objects/test.hpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -23,6 +23,7 @@
     class less;
     class equal_to;
     template <class T> class allocator;
+    object generate(object const*);
 
     class object
     {
@@ -62,44 +63,6 @@
         }
     };
 
-    // 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_;
@@ -117,10 +80,6 @@
             }
         }
 
-        std::size_t operator()(equivalent_object const& x) const {
-            return x.tag1_;
-        }
-
         std::size_t operator()(int x) const {
             return x;
         }
@@ -151,10 +110,6 @@
             }
         }
 
-        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;
         }
@@ -181,10 +136,6 @@
             }
         }
 
-        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;
         }
@@ -205,7 +156,7 @@
     namespace detail
     {
         namespace {
-            test::detail::memory_tracker<test::detail::default_allocator_holder> tracker;
+            test::detail::memory_tracker<std::allocator<int> > tracker;
         }
     }
 
@@ -243,7 +194,7 @@
             return ptr;
         }
 
-        pointer allocate(size_type n, const_pointer u)
+        pointer allocate(size_type n, void const* u)
         {
             pointer ptr(static_cast<T*>(::operator new(n * sizeof(T))));
             detail::tracker.track_allocate((void*) ptr, n, sizeof(T), tag_);
@@ -294,13 +245,6 @@
         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;
Modified: branches/unordered/dev/libs/unordered/test/unordered/assign_tests.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/unordered/assign_tests.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/unordered/assign_tests.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -5,7 +5,7 @@
 
 #include <boost/unordered_set.hpp>
 #include <boost/unordered_map.hpp>
-#include <boost/detail/lightweight_test.hpp>
+#include "../helpers/test.hpp"
 #include "../objects/test.hpp"
 #include "../helpers/random_values.hpp"
 #include "../helpers/tracker.hpp"
@@ -13,10 +13,12 @@
 
 #include <iostream>
 
+namespace assign_tests {
+
 test::seed_t seed(96785);
 
 template <class T>
-void assign_tests1(T* = 0)
+void assign_tests1(T*, test::random_generator generator = test::default_generator)
 {
     BOOST_DEDUCED_TYPENAME T::hasher hf;
     BOOST_DEDUCED_TYPENAME T::key_equal eq;
@@ -32,7 +34,7 @@
 
     std::cerr<<"assign_tests1.2\n";
     {
-        test::random_values<T> v(1000);
+        test::random_values<T> v(1000, generator);
         T x(v.begin(), v.end());
 
         test::ordered<T> tracker = test::create_ordered(x);
@@ -50,7 +52,7 @@
 }
 
 template <class T>
-void assign_tests2(T* = 0)
+void assign_tests2(T*, test::random_generator generator = test::default_generator)
 {
     BOOST_DEDUCED_TYPENAME T::hasher hf1(1);
     BOOST_DEDUCED_TYPENAME T::hasher hf2(2);
@@ -61,7 +63,7 @@
 
     std::cerr<<"assign_tests2.1\n";
     {
-        test::random_values<T> v(1000);
+        test::random_values<T> v(1000, generator);
         T x1(v.begin(), v.end(), 0, hf1, eq1);
         T x2(0, hf2, eq2);
         x2 = x1;
@@ -72,7 +74,7 @@
 
     std::cerr<<"assign_tests2.2\n";
     {
-        test::random_values<T> v1(100), v2(100);
+        test::random_values<T> v1(100, generator), v2(100, generator);
         T x1(v1.begin(), v1.end(), 0, hf1, eq1, al1);
         T x2(v2.begin(), v2.end(), 0, hf2, eq2, al2);
         x2 = x1;
@@ -83,27 +85,24 @@
     }
 }
 
-int main()
-{
-    assign_tests1((boost::unordered_set<int>*) 0);
-    assign_tests1((boost::unordered_multiset<int>*) 0);
-    assign_tests1((boost::unordered_map<int, int>*) 0);
-    assign_tests1((boost::unordered_multimap<int, int>*) 0);
-
-    assign_tests1((boost::unordered_set<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    assign_tests1((boost::unordered_multiset<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    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::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);
+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;
+
+using test::default_generator;
+using test::generate_collisions;
+
+UNORDERED_TEST(assign_tests1,
+    ((test_set)(test_multiset)(test_map)(test_multimap))
+    ((default_generator)(generate_collisions))
+)
+
+UNORDERED_TEST(assign_tests2,
+    ((test_set)(test_multiset)(test_map)(test_multimap))
+    ((default_generator)(generate_collisions))
+)
 
-    return boost::report_errors();
 }
+
+RUN_TESTS()
Modified: branches/unordered/dev/libs/unordered/test/unordered/at_tests.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/unordered/at_tests.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/unordered/at_tests.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -4,10 +4,12 @@
 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
 #include <boost/unordered_map.hpp>
-#include <boost/detail/lightweight_test.hpp>
+#include "../helpers/test.hpp"
 #include <string>
 
-int main() {
+namespace at_tests {
+
+UNORDERED_AUTO_TEST(at_tests) {
     boost::unordered_map<std::string, int> x;
     typedef boost::unordered_map<std::string, int>::iterator iterator;
 
@@ -23,6 +25,8 @@
     }
     catch(std::out_of_range) {
     }
+}
 
-    return boost::report_errors();
 }
+
+RUN_TESTS()
Modified: branches/unordered/dev/libs/unordered/test/unordered/bucket_tests.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/unordered/bucket_tests.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/unordered/bucket_tests.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -5,12 +5,14 @@
 
 #include <boost/unordered_set.hpp>
 #include <boost/unordered_map.hpp>
-#include <boost/detail/lightweight_test.hpp>
+#include "../helpers/test.hpp"
 #include <algorithm>
 #include "../objects/test.hpp"
 #include "../helpers/random_values.hpp"
 #include "../helpers/helpers.hpp"
 
+namespace bucket_tests {
+
 test::seed_t seed(54635);
 
 template <class X>
@@ -48,17 +50,13 @@
     }
 }
 
-int main()
-{
-    bucket_tests((boost::unordered_set<int>*) 0);
-    bucket_tests((boost::unordered_multiset<int>*) 0);
-    bucket_tests((boost::unordered_map<int, int>*) 0);
-    bucket_tests((boost::unordered_multimap<int, int>*) 0);
-
-    bucket_tests((boost::unordered_set<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    bucket_tests((boost::unordered_multiset<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    bucket_tests((boost::unordered_map<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    bucket_tests((boost::unordered_multimap<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
+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;
+
+UNORDERED_TEST(bucket_tests, ((test_set)(test_multiset)(test_map)(test_multimap)))
 
-    return boost::report_errors();
 }
+
+RUN_TESTS()
Modified: branches/unordered/dev/libs/unordered/test/unordered/compile_map.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/unordered/compile_map.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/unordered/compile_map.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -9,11 +9,11 @@
 #include <boost/unordered_map.hpp>
 
 #include <iostream>
-#include <boost/detail/lightweight_test.hpp>
+#include "../helpers/test.hpp"
 #include "../objects/minimal.hpp"
 #include "./compile_tests.hpp"
 
-void test0()
+UNORDERED_AUTO_TEST(test0)
 {
     typedef std::pair<test::minimal::assignable const,
             test::minimal::copy_constructible> value_type;
@@ -42,7 +42,7 @@
     container_test(multimap, value);
 }
 
-void equality_tests() {
+UNORDERED_AUTO_TEST(equality_tests) {
     typedef std::pair<test::minimal::assignable const,
             test::minimal::copy_constructible_equality_comparable> value_type;
     value_type value(
@@ -68,8 +68,7 @@
     equality_test(multimap, value);
 }
 
-void test1()
-{
+UNORDERED_AUTO_TEST(test1) {
     boost::hash<int> hash;
     std::equal_to<int> equal_to;
     int value = 0;
@@ -93,7 +92,7 @@
     unordered_test(multimap, value, map_value, hash, equal_to);
 }
 
-void test2()
+UNORDERED_AUTO_TEST(test2)
 {
     test::minimal::assignable assignable
         = test::minimal::assignable::create();
@@ -147,12 +146,4 @@
     unordered_test(multimap, assignable, map_value, hash, equal_to);
 }
 
-int main()
-{
-    test0();
-    equality_tests();
-    test1();
-    test2();
-
-    return boost::report_errors();
-}
+RUN_TESTS()
Modified: branches/unordered/dev/libs/unordered/test/unordered/compile_set.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/unordered/compile_set.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/unordered/compile_set.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -9,11 +9,11 @@
 #include <boost/unordered_set.hpp>
 
 #include <iostream>
-#include <boost/detail/lightweight_test.hpp>
+#include "../helpers/test.hpp"
 #include "../objects/minimal.hpp"
 #include "./compile_tests.hpp"
 
-void test0()
+UNORDERED_AUTO_TEST(test0)
 {
     test::minimal::assignable assignable = test::minimal::assignable::create();
 
@@ -38,7 +38,7 @@
     equality_test(multiset, assignable);
 }
 
-void test1()
+UNORDERED_AUTO_TEST(test1)
 {
     boost::hash<int> hash;
     std::equal_to<int> equal_to;
@@ -61,7 +61,7 @@
     unordered_test(multiset, value, value, hash, equal_to);
 }
 
-void test2()
+UNORDERED_AUTO_TEST(test2)
 {
     test::minimal::assignable assignable
         = test::minimal::assignable::create();
@@ -97,10 +97,4 @@
     unordered_test(multiset, assignable, assignable, hash, equal_to);
 }
 
-int main() {
-    test0();
-    test1();
-    test2();
-
-    return boost::report_errors();
-}
+RUN_TESTS()
Modified: branches/unordered/dev/libs/unordered/test/unordered/constructor_tests.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/unordered/constructor_tests.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/unordered/constructor_tests.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -5,7 +5,7 @@
 
 #include <boost/unordered_set.hpp>
 #include <boost/unordered_map.hpp>
-#include <boost/detail/lightweight_test.hpp>
+#include "../helpers/test.hpp"
 #include "../objects/test.hpp"
 #include "../helpers/random_values.hpp"
 #include "../helpers/tracker.hpp"
@@ -15,10 +15,12 @@
 
 #include <iostream>
 
+namespace constructor_tests {
+
 test::seed_t seed(356730);
 
 template <class T>
-void constructor_tests1(T* = 0)
+void constructor_tests1(T*, test::random_generator generator = test::default_generator)
 {
     BOOST_DEDUCED_TYPENAME T::hasher hf;
     BOOST_DEDUCED_TYPENAME T::key_equal eq;
@@ -68,7 +70,7 @@
 
     std::cerr<<"Construct 5\n";
     {
-        test::random_values<T> v(1000);
+        test::random_values<T> v(1000, generator);
         T x(v.begin(), v.end(), 10000, hf, eq);
         BOOST_TEST(x.bucket_count() >= 10000);
         BOOST_TEST(test::equivalent(x.hash_function(), hf));
@@ -80,7 +82,7 @@
 
     std::cerr<<"Construct 6\n";
     {
-        test::random_values<T> v(10);
+        test::random_values<T> v(10, generator);
         T x(v.begin(), v.end(), 10000, hf);
         BOOST_TEST(x.bucket_count() >= 10000);
         BOOST_TEST(test::equivalent(x.hash_function(), hf));
@@ -92,7 +94,7 @@
 
     std::cerr<<"Construct 7\n";
     {
-        test::random_values<T> v(100);
+        test::random_values<T> v(100, generator);
         T x(v.begin(), v.end(), 100);
         BOOST_TEST(x.bucket_count() >= 100);
         BOOST_TEST(test::equivalent(x.hash_function(), hf));
@@ -104,7 +106,7 @@
 
     std::cerr<<"Construct 8\n";
     {
-        test::random_values<T> v(1);
+        test::random_values<T> v(1, generator);
         T x(v.begin(), v.end());
         BOOST_TEST(test::equivalent(x.hash_function(), hf));
         BOOST_TEST(test::equivalent(x.key_eq(), eq));
@@ -125,7 +127,7 @@
 
     std::cerr<<"Construct 10\n";
     {
-        test::random_values<T> v(1000);
+        test::random_values<T> v(1000, generator);
         T x(v.begin(), v.end(), 10000, hf, eq, al);
         BOOST_TEST(x.bucket_count() >= 10000);
         BOOST_TEST(test::equivalent(x.hash_function(), hf));
@@ -137,7 +139,7 @@
 }
 
 template <class T>
-void constructor_tests2(T* = 0)
+void constructor_tests2(T*, test::random_generator const& generator = test::default_generator)
 {
     BOOST_DEDUCED_TYPENAME T::hasher hf;
     BOOST_DEDUCED_TYPENAME T::hasher hf1(1);
@@ -172,7 +174,7 @@
 
     std::cerr<<"Construct 3\n";
     {
-        test::random_values<T> v(100);
+        test::random_values<T> v(100, generator);
         T x(v.begin(), v.end(), 0, hf1, eq1);
         BOOST_TEST(test::equivalent(x.hash_function(), hf1));
         BOOST_TEST(test::equivalent(x.key_eq(), eq1));
@@ -183,7 +185,7 @@
 
     std::cerr<<"Construct 4\n";
     {
-        test::random_values<T> v(5);
+        test::random_values<T> v(5, generator);
         T x(v.begin(), v.end(), 1000, hf1);
         BOOST_TEST(x.bucket_count() >= 1000);
         BOOST_TEST(test::equivalent(x.hash_function(), hf1));
@@ -196,7 +198,7 @@
 
     std::cerr<<"Construct 5\n";
     {
-        test::random_values<T> v(100);
+        test::random_values<T> v(100, generator);
         T x(v.begin(), v.end(), 0, hf, eq, al1);
         T y(x.begin(), x.end(), 0, hf1, eq1, al2);
         test::check_container(x, v);
@@ -207,7 +209,7 @@
 
     std::cerr<<"Construct 6\n";
     {
-        test::random_values<T> v(100);
+        test::random_values<T> v(100, generator);
         T x(v.begin(), v.end(), 0, hf1, eq1);
         T y(x.begin(), x.end(), 0, hf, eq);
         test::check_container(x, v);
@@ -218,7 +220,7 @@
 
     std::cerr<<"Construct 7\n";
     {
-        test::random_values<T> v(100);
+        test::random_values<T> v(100, generator);
         T x(v.begin(), v.end(), 0, hf1, eq1);
         T y(x.begin(), x.end(), 0, hf2, eq2);
         test::check_container(x, v);
@@ -229,7 +231,7 @@
 
     std::cerr<<"Construct 8 - from input iterator\n";
     {
-        test::random_values<T> v(100);
+        test::random_values<T> v(100, generator);
         T x(test::input_iterator(v.begin()), test::input_iterator(v.end()), 0, hf1, eq1);
         T y(test::input_iterator(x.begin()), test::input_iterator(x.end()), 0, hf2, eq2);
         test::check_container(x, v);
@@ -255,57 +257,28 @@
     test::check_equivalent_keys(x);
 }
 
-int main()
-{
-    std::cerr<<"Test1 unordered_set<int>\n";
-    constructor_tests1((boost::unordered_set<int>*) 0);
-    std::cerr<<"Test1 unordered_multiset<int>\n";
-    constructor_tests1((boost::unordered_multiset<int>*) 0);
-    std::cerr<<"Test1 unordered_map<int, int>\n";
-    constructor_tests1((boost::unordered_map<int, int>*) 0);
-    std::cerr<<"Test1 unordered_multimap<int, int>\n";
-    constructor_tests1((boost::unordered_multimap<int, int>*) 0);
-
-    std::cerr<<"Test1 unordered_set<test::object>\n";
-    constructor_tests1((boost::unordered_set<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    std::cerr<<"Test1 unordered_multiset<test::object>\n";
-    constructor_tests1((boost::unordered_multiset<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    std::cerr<<"Test1 unordered_map<test::object, test::object>\n";
-    constructor_tests1((boost::unordered_map<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    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";
-    constructor_tests2((boost::unordered_multiset<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    std::cerr<<"Test2 unordered_map<test::object, test::object>\n";
-    constructor_tests2((boost::unordered_map<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    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";
-    map_constructor_test((boost::unordered_multimap<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
+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;
+
+using test::default_generator;
+using test::generate_collisions;
+
+UNORDERED_TEST(constructor_tests1,
+    ((test_set)(test_multiset)(test_map)(test_multimap))
+    ((default_generator)(generate_collisions))
+)
+
+UNORDERED_TEST(constructor_tests2,
+    ((test_set)(test_multiset)(test_map)(test_multimap))
+    ((default_generator)(generate_collisions))
+)
+
+UNORDERED_TEST(map_constructor_test,
+    ((test_map)(test_multimap))
+)
 
-    return boost::report_errors();
 }
+
+RUN_TESTS()
Modified: branches/unordered/dev/libs/unordered/test/unordered/copy_tests.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/unordered/copy_tests.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/unordered/copy_tests.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -5,7 +5,7 @@
 
 #include <boost/unordered_set.hpp>
 #include <boost/unordered_map.hpp>
-#include <boost/detail/lightweight_test.hpp>
+#include "../helpers/test.hpp"
 #include "../objects/test.hpp"
 #include "../helpers/random_values.hpp"
 #include "../helpers/tracker.hpp"
@@ -14,8 +14,11 @@
 
 test::seed_t seed(9063);
 
+namespace copy_tests
+{
+
 template <class T>
-void copy_construct_tests1(T* = 0)
+void copy_construct_tests1(T*, test::random_generator const& generator = test::default_generator)
 {
     BOOST_DEDUCED_TYPENAME T::hasher hf;
     BOOST_DEDUCED_TYPENAME T::key_equal eq;
@@ -60,7 +63,7 @@
 }
 
 template <class T>
-void copy_construct_tests2(T* ptr = 0)
+void copy_construct_tests2(T* ptr, test::random_generator const& generator = test::default_generator)
 {
     copy_construct_tests1(ptr);
 
@@ -90,22 +93,23 @@
     }
 }
 
-int main()
-{
-    copy_construct_tests1((boost::unordered_set<int>*) 0);
-    copy_construct_tests1((boost::unordered_multiset<int>*) 0);
-    copy_construct_tests1((boost::unordered_map<int, int>*) 0);
-    copy_construct_tests1((boost::unordered_multimap<int, int>*) 0);
-
-    copy_construct_tests2((boost::unordered_set<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    copy_construct_tests2((boost::unordered_multiset<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    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);
+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;
+
+using test::default_generator;
+using test::generate_collisions;
+
+UNORDERED_TEST(copy_construct_tests1,
+    ((test_set)(test_multiset)(test_map)(test_multimap))
+)
+
+UNORDERED_TEST(copy_construct_tests2,
+    ((test_set)(test_multiset)(test_map)(test_multimap))
+    ((default_generator)(generate_collisions))
+)
 
-    return boost::report_errors();
 }
+
+RUN_TESTS()
Modified: branches/unordered/dev/libs/unordered/test/unordered/equivalent_keys_tests.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/unordered/equivalent_keys_tests.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/unordered/equivalent_keys_tests.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -5,10 +5,10 @@
 
 #include <boost/unordered_set.hpp>
 #include <boost/unordered_map.hpp>
-#include <boost/detail/lightweight_test.hpp>
+#include "../helpers/test.hpp"
 #include <algorithm>
 #include <map>
-#include <deque>
+#include <list>
 #include "../helpers/tracker.hpp"
 #include "../helpers/invariants.hpp"
 
@@ -32,7 +32,7 @@
     test::check_equivalent_keys(x1);
 }
 
-void set_tests()
+UNORDERED_AUTO_TEST(set_tests)
 {
     int values[][5] = {
         {1},
@@ -55,9 +55,9 @@
     test_equal_insertion<boost::unordered_multiset<int> >(values[4], values[4] + 3);
 }
 
-void map_tests()
+UNORDERED_AUTO_TEST(map_tests)
 {
-    typedef std::deque<std::pair<int const, int> > values_type;
+    typedef std::list<std::pair<int const, int> > values_type;
     values_type v[5];
     v[0].push_back(std::pair<int const, int>(1,1));
     v[1].push_back(std::pair<int const, int>(28,34));
@@ -76,10 +76,4 @@
             v[i2].begin(), v[i2].end());
 }
 
-int main()
-{
-    set_tests();
-    map_tests();
-
-    return boost::report_errors();
-}
+RUN_TESTS()
Modified: branches/unordered/dev/libs/unordered/test/unordered/erase_equiv_tests.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/unordered/erase_equiv_tests.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/unordered/erase_equiv_tests.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -7,7 +7,7 @@
 // hairy with several tricky edge cases - so explicitly test each one.
 
 #include <boost/unordered_map.hpp>
-#include <boost/detail/lightweight_test.hpp>
+#include "../helpers/test.hpp"
 #include <list>
 #include <set>
 #include <iostream>
@@ -52,8 +52,7 @@
 typedef collide_map::value_type collide_value;
 typedef std::list<collide_value> collide_list;
 
-
-void empty_range_tests()
+UNORDERED_AUTO_TEST(empty_range_tests)
 {
     collide_map x;
     x.erase(x.begin(), x.end());
@@ -61,7 +60,7 @@
     x.erase(x.end(), x.end());
 }
 
-void single_item_tests()
+UNORDERED_AUTO_TEST(single_item_tests)
 {
     collide_list init;
     init.push_back(collide_value(1,1));
@@ -75,7 +74,7 @@
     BOOST_TEST(x.count(1) == 0 && x.size() == 0);
 }
 
-void two_equivalent_item_tests()
+UNORDERED_AUTO_TEST(two_equivalent_item_tests)
 {
     collide_list init;
     init.push_back(collide_value(1,1));
@@ -172,7 +171,7 @@
     }
 }
 
-void exhaustive_collide_tests() 
+UNORDERED_AUTO_TEST(exhaustive_collide_tests) 
 {
     std::cout<<"exhaustive_collide_tests:\n";
     collide_map m;
@@ -180,20 +179,11 @@
     std::cout<<"\n";
 }
 
-void exhaustive_collide2_tests() 
+UNORDERED_AUTO_TEST(exhaustive_collide2_tests)
 {
     std::cout<<"exhaustive_collide2_tests:\n";
     exhaustive_erase_tests((collide_map2*) 0, 8, 4);
     std::cout<<"\n";
 }
 
-int main()
-{
-    empty_range_tests();
-    single_item_tests();
-    two_equivalent_item_tests();
-    exhaustive_collide_tests();
-    exhaustive_collide2_tests();
-
-    return boost::report_errors();
-}
+RUN_TESTS()
Modified: branches/unordered/dev/libs/unordered/test/unordered/erase_tests.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/unordered/erase_tests.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/unordered/erase_tests.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -5,7 +5,7 @@
 
 #include <boost/unordered_set.hpp>
 #include <boost/unordered_map.hpp>
-#include <boost/detail/lightweight_test.hpp>
+#include "../helpers/test.hpp"
 #include <boost/next_prior.hpp>
 #include "../objects/test.hpp"
 #include "../helpers/random_values.hpp"
@@ -15,14 +15,17 @@
 
 #include <iostream>
 
+namespace erase_tests
+{
+
 test::seed_t seed(85638);
 
 template <class Container>
-void erase_tests1(Container* = 0)
+void erase_tests1(Container*, test::random_generator generator = test::default_generator)
 {
     std::cerr<<"Erase by key.\n";
     {
-        test::random_values<Container> v(1000);
+        test::random_values<Container> v(1000, generator);
         Container x(v.begin(), v.end());
         for(BOOST_DEDUCED_TYPENAME test::random_values<Container>::iterator it = v.begin();
             it != v.end(); ++it)
@@ -38,7 +41,7 @@
 
     std::cerr<<"erase(begin()).\n";
     {
-        test::random_values<Container> v(1000);
+        test::random_values<Container> v(1000, generator);
         Container x(v.begin(), v.end());
         std::size_t size = x.size();
         while(size > 0 && !x.empty())
@@ -56,7 +59,7 @@
 
     std::cerr<<"erase(random position).\n";
     {
-        test::random_values<Container> v(1000);
+        test::random_values<Container> v(1000, generator);
         Container x(v.begin(), v.end());
         std::size_t size = x.size();
         while(size > 0 && !x.empty())
@@ -87,7 +90,7 @@
 
     std::cerr<<"erase(ranges).\n";
     {
-        test::random_values<Container> v(500);
+        test::random_values<Container> v(500, generator);
         Container x(v.begin(), v.end());
 
         std::size_t size = x.size();
@@ -109,42 +112,29 @@
 
     std::cerr<<"clear().\n";
     {
-        test::random_values<Container> v(500);
+        test::random_values<Container> v(500, generator);
         Container x(v.begin(), v.end());
         x.clear();
         BOOST_TEST(x.empty());
         BOOST_TEST(x.begin() == x.end());
     }
+
+    std::cerr<<"\n";
 }
 
-int main()
-{
-    std::cerr<<"Erase unordered_set<int>.\n";
-    erase_tests1((boost::unordered_set<int>*) 0);
-    std::cerr<<"\nErase unordered_multiset<int>.\n";
-    erase_tests1((boost::unordered_multiset<int>*) 0);
-    std::cerr<<"\nErase unordered_map<int>.\n";
-    erase_tests1((boost::unordered_map<int, int>*) 0);
-    std::cerr<<"\nErase unordered_multimap<int>.\n";
-    erase_tests1((boost::unordered_multimap<int, int>*) 0);
-
-    std::cerr<<"\nErase unordered_set<test::object,..>.\n";
-    erase_tests1((boost::unordered_set<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    std::cerr<<"\nErase unordered_multiset<test::object,..>.\n";
-    erase_tests1((boost::unordered_multiset<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    std::cerr<<"\nErase unordered_map<test::object,..>.\n";
-    erase_tests1((boost::unordered_map<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    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);
+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;
+
+using test::default_generator;
+using test::generate_collisions;
+
+UNORDERED_TEST(erase_tests1,
+    ((test_set)(test_multiset)(test_map)(test_multimap))
+    ((default_generator)(generate_collisions))
+)
 
-    return boost::report_errors();
 }
+
+RUN_TESTS()
Modified: branches/unordered/dev/libs/unordered/test/unordered/find_tests.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/unordered/find_tests.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/unordered/find_tests.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -5,21 +5,24 @@
 
 #include <boost/unordered_set.hpp>
 #include <boost/unordered_map.hpp>
-#include <boost/detail/lightweight_test.hpp>
+#include "../helpers/test.hpp"
 #include "../objects/test.hpp"
 #include "../helpers/random_values.hpp"
 #include "../helpers/tracker.hpp"
 #include "../helpers/helpers.hpp"
 
+namespace find_tests
+{
+
 test::seed_t seed(78937);
 
 template <class X>
-void find_tests1(X*)
+void find_tests1(X*, test::random_generator generator = test::default_generator)
 {
     typedef BOOST_DEDUCED_TYPENAME X::iterator iterator;
 
     {
-        test::random_values<X> v(500);
+        test::random_values<X> v(500, generator);
         X x(v.begin(), v.end());
         X const& x_const = x;
         test::ordered<X> tracker = test::create_ordered(x);
@@ -46,7 +49,7 @@
                     (BOOST_DEDUCED_TYPENAME test::non_const_value_type<X>::type*) 0);
         }
 
-        test::random_values<X> v2(500);
+        test::random_values<X> v2(500, generator);
         for(BOOST_DEDUCED_TYPENAME test::random_values<X>::const_iterator it2 =
                 v2.begin(); it2 != v2.end(); ++it2)
         {
@@ -65,7 +68,7 @@
     {
         X x;
 
-        test::random_values<X> v2(5);
+        test::random_values<X> v2(5, generator);
         for(BOOST_DEDUCED_TYPENAME test::random_values<X>::const_iterator it3 =
                 v2.begin(); it3 != v2.end(); ++it3)
         {
@@ -78,22 +81,19 @@
     }
 }
 
-int main()
-{
-    find_tests1((boost::unordered_set<int>*) 0);
-    find_tests1((boost::unordered_multiset<int>*) 0);
-    find_tests1((boost::unordered_map<int, int>*) 0);
-    find_tests1((boost::unordered_multimap<int, int>*) 0);
-
-    find_tests1((boost::unordered_set<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    find_tests1((boost::unordered_multiset<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    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);
+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;
+
+using test::default_generator;
+using test::generate_collisions;
+
+UNORDERED_TEST(find_tests1,
+    ((test_set)(test_multiset)(test_map)(test_multimap))
+    ((default_generator)(generate_collisions))
+)
 
-    return 0;
 }
+
+RUN_TESTS()
Modified: branches/unordered/dev/libs/unordered/test/unordered/insert_stable_tests.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/unordered/insert_stable_tests.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/unordered/insert_stable_tests.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -5,7 +5,7 @@
 
 #include <boost/unordered_set.hpp>
 #include <boost/unordered_map.hpp>
-#include <boost/detail/lightweight_test.hpp>
+#include "../helpers/test.hpp"
 
 #include <iostream>
 
@@ -39,7 +39,7 @@
     }
 }
 
-void stable_insert_test1() {
+UNORDERED_AUTO_TEST(stable_insert_test1) {
     boost::unordered_multiset<insert_stable::member> x;
 
     x.insert(insert_stable::member(1,1));
@@ -56,7 +56,7 @@
     BOOST_TEST(it == end);
 }
 
-void stable_insert_test2() {
+UNORDERED_AUTO_TEST(stable_insert_test2) {
     boost::unordered_multimap<insert_stable::member, int> x;
     typedef boost::unordered_multimap<insert_stable::member, int>::const_iterator iterator;
 
@@ -75,10 +75,4 @@
     BOOST_TEST(it == end);
 }
 
-int main()
-{
-    stable_insert_test1();
-    stable_insert_test2();
-
-    return boost::report_errors();
-}
+RUN_TESTS()
Modified: branches/unordered/dev/libs/unordered/test/unordered/insert_tests.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/unordered/insert_tests.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/unordered/insert_tests.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -5,7 +5,7 @@
 
 #include <boost/unordered_set.hpp>
 #include <boost/unordered_map.hpp>
-#include <boost/detail/lightweight_test.hpp>
+#include "../helpers/test.hpp"
 #include <boost/next_prior.hpp>
 #include "../objects/test.hpp"
 #include "../helpers/random_values.hpp"
@@ -19,7 +19,7 @@
 test::seed_t seed(243432);
 
 template <class X>
-void unique_insert_tests1(X* = 0)
+void unique_insert_tests1(X*, test::random_generator generator = test::default_generator)
 {
     typedef BOOST_DEDUCED_TYPENAME X::iterator iterator;
     typedef test::ordered<X> ordered;
@@ -29,7 +29,7 @@
     X x;
     test::ordered<X> tracker = test::create_ordered(x);
 
-    test::random_values<X> v(1000);
+    test::random_values<X> v(1000, generator);
 
     for(BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it = v.begin();
             it != v.end(); ++it)
@@ -54,14 +54,14 @@
 }
 
 template <class X>
-void equivalent_insert_tests1(X* = 0)
+void equivalent_insert_tests1(X*, test::random_generator generator = test::default_generator)
 {
     std::cerr<<"insert(value) tests for containers with equivalent keys.\n";
 
     X x;
     test::ordered<X> tracker = test::create_ordered(x);
 
-    test::random_values<X> v(1000);
+    test::random_values<X> v(1000, generator);
     for(BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it = v.begin();
             it != v.end(); ++it)
     {
@@ -83,7 +83,7 @@
 }
 
 template <class X>
-void insert_tests2(X* = 0)
+void insert_tests2(X*, test::random_generator generator = test::default_generator)
 {
     typedef BOOST_DEDUCED_TYPENAME test::ordered<X> tracker_type;
     typedef BOOST_DEDUCED_TYPENAME X::iterator iterator;
@@ -96,7 +96,7 @@
         X x;
         tracker_type tracker = test::create_ordered(x);
 
-        test::random_values<X> v(1000);
+        test::random_values<X> v(1000, generator);
         for(BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it = v.begin();
                 it != v.end(); ++it)
         {
@@ -122,7 +122,7 @@
         X const& x_const = x;
         tracker_type tracker = test::create_ordered(x);
 
-        test::random_values<X> v(100);
+        test::random_values<X> v(100, generator);
         for(BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it = v.begin();
                 it != v.end(); ++it)
         {
@@ -148,7 +148,7 @@
         const_iterator pos = x.begin();
         tracker_type tracker = test::create_ordered(x);
 
-        test::random_values<X> v(1000);
+        test::random_values<X> v(1000, generator);
         for(BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it = v.begin();
                 it != v.end(); ++it)
         {
@@ -173,7 +173,7 @@
         X x;
         tracker_type tracker = test::create_ordered(x);
 
-        test::random_values<X> v(1000);
+        test::random_values<X> v(1000, generator);
         for(BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it = v.begin();
                 it != v.end(); ++it)
         {
@@ -196,7 +196,7 @@
     {
         X x;
 
-        test::random_values<X> v(1000);
+        test::random_values<X> v(1000, generator);
         x.insert(v.begin(), v.end());
 
         test::check_container(x, v);
@@ -208,7 +208,7 @@
     {
         X x;
 
-        test::random_values<X> v(1000);
+        test::random_values<X> v(1000, generator);
         x.insert(test::input_iterator(v.begin()), test::input_iterator(v.end()));
         test::check_container(x, v);
 
@@ -217,14 +217,14 @@
 }
 
 template <class X>
-void map_tests(X* = 0)
+void map_tests(X*, test::random_generator generator = test::default_generator)
 {
     std::cerr<<"map tests.\n";
 
     X x;
     test::ordered<X> tracker = test::create_ordered(x);
 
-    test::random_values<X> v(1000);
+    test::random_values<X> v(1000, generator);
     for(BOOST_DEDUCED_TYPENAME test::random_values<X>::iterator it = v.begin();
             it != v.end(); ++it)
     {
@@ -244,12 +244,12 @@
 }
 
 template <class X>
-void associative_insert_range_test(X* = 0)
+void associative_insert_range_test(X*, test::random_generator generator = test::default_generator)
 {
     std::cerr<<"associative_insert_range_test\n";
 
     typedef std::list<std::pair<BOOST_DEDUCED_TYPENAME X::key_type, BOOST_DEDUCED_TYPENAME X::mapped_type> > list;
-    test::random_values<X> v(1000);
+    test::random_values<X> v(1000, generator);
     list l;
     std::copy(v.begin(), v.end(), std::back_inserter(l));
 
@@ -260,42 +260,38 @@
 
 int main()
 {
-    unique_insert_tests1((boost::unordered_set<int>*) 0);
-    equivalent_insert_tests1((boost::unordered_multiset<int>*) 0);
-    unique_insert_tests1((boost::unordered_map<int, int>*) 0);
-    equivalent_insert_tests1((boost::unordered_multimap<int, int>*) 0);
-
-    unique_insert_tests1((boost::unordered_set<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    equivalent_insert_tests1((boost::unordered_multiset<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    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);
-    insert_tests2((boost::unordered_multimap<int, int>*) 0);
-
-    insert_tests2((boost::unordered_set<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    insert_tests2((boost::unordered_multiset<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    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);
+    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;
+
+    unique_insert_tests1(test_set);
+    equivalent_insert_tests1(test_multiset);
+    unique_insert_tests1(test_map);
+    equivalent_insert_tests1(test_multimap);
+
+    unique_insert_tests1(test_set, test::generate_collisions);
+    equivalent_insert_tests1(test_multiset, test::generate_collisions);
+    unique_insert_tests1(test_map, test::generate_collisions);
+    equivalent_insert_tests1(test_multimap, test::generate_collisions);
+
+    insert_tests2(test_set);
+    insert_tests2(test_multiset);
+    insert_tests2(test_map);
+    insert_tests2(test_multimap);
+
+    insert_tests2(test_set, test::generate_collisions);
+    insert_tests2(test_multiset, test::generate_collisions);
+    insert_tests2(test_map, test::generate_collisions);
+    insert_tests2(test_multimap, test::generate_collisions);
+
+    map_tests(test_map);
+    map_tests(test_map, test::generate_collisions);
+
+    associative_insert_range_test(test_map);
+    associative_insert_range_test(test_map, test::generate_collisions);
+    associative_insert_range_test(test_multimap);
+    associative_insert_range_test(test_multimap, test::generate_collisions);
+
     return boost::report_errors();
 }
Modified: branches/unordered/dev/libs/unordered/test/unordered/load_factor_tests.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/unordered/load_factor_tests.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/unordered/load_factor_tests.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -5,7 +5,7 @@
 
 #include <boost/unordered_set.hpp>
 #include <boost/unordered_map.hpp>
-#include <boost/detail/lightweight_test.hpp>
+#include "../helpers/test.hpp"
 #include <boost/limits.hpp>
 #include "../helpers/random_values.hpp"
 
@@ -14,6 +14,9 @@
 #pragma warning(disable:4127) // conditional expression is constant
 #endif
 
+namespace load_factor_tests
+{
+
 test::seed_t seed(783656);
 
 template <class X>
@@ -63,21 +66,23 @@
         insert_test(ptr, std::numeric_limits<float>::infinity());
 }
 
-int main()
-{
-    load_factor_tests((boost::unordered_set<int>*) 0);
-    load_factor_tests((boost::unordered_multiset<int>*) 0);
-    load_factor_tests((boost::unordered_map<int, int>*) 0);
-    load_factor_tests((boost::unordered_multimap<int, int>*) 0);
-
-    load_factor_insert_tests((boost::unordered_set<int>*) 0);
-    load_factor_insert_tests((boost::unordered_multiset<int>*) 0);
-    load_factor_insert_tests((boost::unordered_map<int, int>*) 0);
-    load_factor_insert_tests((boost::unordered_multimap<int, int>*) 0);
+boost::unordered_set<int>* int_set_ptr;
+boost::unordered_multiset<int>* int_multiset_ptr;
+boost::unordered_map<int, int>* int_map_ptr;
+boost::unordered_multimap<int, int>* int_multimap_ptr;
+
+UNORDERED_TEST(load_factor_tests,
+    ((int_set_ptr)(int_multiset_ptr)(int_map_ptr)(int_multimap_ptr))
+)
+
+UNORDERED_TEST(load_factor_insert_tests,
+    ((int_set_ptr)(int_multiset_ptr)(int_map_ptr)(int_multimap_ptr))
+)
 
-    return boost::report_errors();
 }
 
+RUN_TESTS()
+
 #if defined(BOOST_MSVC)
 #pragma warning(pop)
 #pragma warning(disable:4127) // conditional expression is constant
Modified: branches/unordered/dev/libs/unordered/test/unordered/rehash_tests.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/unordered/rehash_tests.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/unordered/rehash_tests.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -5,10 +5,13 @@
 
 #include <boost/unordered_set.hpp>
 #include <boost/unordered_map.hpp>
-#include <boost/detail/lightweight_test.hpp>
+#include "../helpers/test.hpp"
 #include "../helpers/random_values.hpp"
 #include "../helpers/tracker.hpp"
 
+namespace rehash_tests
+{
+
 test::seed_t seed(2974);
 
 template <class X>
@@ -59,11 +62,15 @@
     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);
+boost::unordered_set<int>* int_set_ptr;
+boost::unordered_multiset<int>* int_multiset_ptr;
+boost::unordered_map<int, int>* int_map_ptr;
+boost::unordered_multimap<int, int>* int_multimap_ptr;
+
+UNORDERED_TEST(rehash_tests,
+    ((int_set_ptr)(int_multiset_ptr)(int_map_ptr)(int_multimap_ptr))
+)
 
-    return boost::report_errors();
 }
+
+RUN_TESTS()
Modified: branches/unordered/dev/libs/unordered/test/unordered/simple_tests.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/unordered/simple_tests.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/unordered/simple_tests.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -7,7 +7,8 @@
 
 #include <boost/unordered_set.hpp>
 #include <boost/unordered_map.hpp>
-#include <boost/detail/lightweight_test.hpp>
+#include "../helpers/test.hpp"
+#include <cstdlib>
 #include <algorithm>
 #include "../helpers/equivalent.hpp"
 
@@ -82,10 +83,10 @@
     }
 }
 
-int main()
+UNORDERED_AUTO_TEST(simple_tests)
 {
-  	using namespace std;
-   	srand(14878);
+    using namespace std;
+    srand(14878);
 
     std::cout<<"Test unordered_set.\n";
     boost::unordered_set<int> set;
@@ -99,9 +100,9 @@
     simple_test(multiset);
     
     for(int i1 = 0; i1 < 1000; ++i1) {
-    	int count = rand() % 10, index = rand();
-    	for(int j = 0; j < count; ++j)
-	    	multiset.insert(index);
+        int count = rand() % 10, index = rand();
+        for(int j = 0; j < count; ++j)
+            multiset.insert(index);
     }
     simple_test(multiset);
     
@@ -109,7 +110,7 @@
     boost::unordered_map<int, int> map;
 
     for(int i2 = 0; i2 < 1000; ++i2) {
-    	map.insert(std::pair<const int, int>(rand(), rand()));
+        map.insert(std::pair<const int, int>(rand(), rand()));
     }
     simple_test(map);
 
@@ -117,11 +118,11 @@
     boost::unordered_multimap<int, int> multimap;
 
     for(int i3 = 0; i3 < 1000; ++i3) {
-    	int count = rand() % 10, index = rand();
-    	for(int j = 0; j < count; ++j)
-	    	multimap.insert(std::pair<const int, int>(index, rand()));
+        int count = rand() % 10, index = rand();
+        for(int j = 0; j < count; ++j)
+            multimap.insert(std::pair<const int, int>(index, rand()));
     }
     simple_test(multimap);
-
-    return boost::report_errors();
 }
+
+RUN_TESTS()
Modified: branches/unordered/dev/libs/unordered/test/unordered/swap_tests.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/unordered/swap_tests.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/unordered/swap_tests.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -8,12 +8,15 @@
 #include <iterator>
 #include <boost/unordered_set.hpp>
 #include <boost/unordered_map.hpp>
-#include <boost/detail/lightweight_test.hpp>
+#include "../helpers/test.hpp"
 #include "../objects/test.hpp"
 #include "../helpers/random_values.hpp"
 #include "../helpers/tracker.hpp"
 #include "../helpers/invariants.hpp"
 
+namespace swap_tests
+{
+
 test::seed_t seed(783472);
 
 template <class X>
@@ -114,25 +117,18 @@
 #endif
 }
 
-int main()
-{
-    std::cerr<<"Erase unordered_set<int>.\n";
-    swap_tests1((boost::unordered_set<int>*) 0);
-    std::cerr<<"\nErase unordered_multiset<int>.\n";
-    swap_tests1((boost::unordered_multiset<int>*) 0);
-    std::cerr<<"\nErase unordered_map<int>.\n";
-    swap_tests1((boost::unordered_map<int, int>*) 0);
-    std::cerr<<"\nErase unordered_multimap<int>.\n";
-    swap_tests1((boost::unordered_multimap<int, int>*) 0);
-
-    std::cerr<<"\nErase unordered_set<test::object,..>.\n";
-    swap_tests2((boost::unordered_set<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    std::cerr<<"\nErase unordered_multiset<test::object,..>.\n";
-    swap_tests2((boost::unordered_multiset<test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    std::cerr<<"\nErase unordered_map<test::object,..>.\n";
-    swap_tests2((boost::unordered_map<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
-    std::cerr<<"\nErase unordered_multimap<test::object,..>.\n";
-    swap_tests2((boost::unordered_multimap<test::object, test::object, test::hash, test::equal_to, test::allocator<test::object> >*) 0);
+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;
+
+UNORDERED_TEST(swap_tests1,
+    ((test_set)(test_multiset)(test_map)(test_multimap))
+)
+
+UNORDERED_TEST(swap_tests2,
+    ((test_set)(test_multiset)(test_map)(test_multimap))
+)
 
-    return boost::report_errors();
 }
+RUN_TESTS()
Modified: branches/unordered/dev/libs/unordered/test/unordered/unnecessary_copy_tests.cpp
==============================================================================
--- branches/unordered/dev/libs/unordered/test/unordered/unnecessary_copy_tests.cpp	(original)
+++ branches/unordered/dev/libs/unordered/test/unordered/unnecessary_copy_tests.cpp	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -5,9 +5,10 @@
 
 #include <boost/unordered_set.hpp>
 #include <boost/unordered_map.hpp>
-#include <boost/detail/lightweight_test.hpp>
+#include "../helpers/test.hpp"
 
-namespace test {
+namespace unnecessary_copy_tests
+{
     struct count_copies
     {
         static int count;
@@ -17,22 +18,24 @@
        count_copies& operator=(count_copies const&);
     };
 
-    bool operator==(test::count_copies const&, test::count_copies const&) {
+    bool operator==(count_copies const&, count_copies const&) {
         return true;
     }
 }
 
 #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
-namespace boost {
+namespace boost
 #else
-namespace test {
+namespace unnecessary_copy_tests
 #endif
-    std::size_t hash_value(test::count_copies const&) {
+{
+    std::size_t hash_value(unnecessary_copy_tests::count_copies const&) {
         return 0;
     }
 }
 
-namespace test {
+namespace unnecessary_copy_tests
+{
     int count_copies::count;
 
     template <class T>
@@ -45,14 +48,13 @@
         x.insert(a);
         BOOST_TEST(count_copies::count == 2);
     }
-}
 
-int main()
-{
-    test::unnecessary_copy_test((boost::unordered_set<test::count_copies>*) 0);
-    test::unnecessary_copy_test((boost::unordered_multiset<test::count_copies>*) 0);
-    test::unnecessary_copy_test((boost::unordered_map<int, test::count_copies>*) 0);
-    test::unnecessary_copy_test((boost::unordered_multimap<int, test::count_copies>*) 0);
+    boost::unordered_set<count_copies>* set;
+    boost::unordered_multiset<count_copies>* multiset;
+    boost::unordered_map<int, count_copies>* map;
+    boost::unordered_multimap<int, count_copies>* multimap;
 
-    return boost::report_errors();
+    UNORDERED_TEST(unnecessary_copy_test, ((set)(multiset)(map)(multimap)))
 }
+
+RUN_TESTS()
Modified: branches/unordered/dev/project-root.jam
==============================================================================
--- branches/unordered/dev/project-root.jam	(original)
+++ branches/unordered/dev/project-root.jam	2008-03-24 13:22:22 EDT (Mon, 24 Mar 2008)
@@ -44,15 +44,10 @@
 
 project unordered
     : requirements
+        <include>.
         <include>$(boost-root)
     :   #   build everything in ./bin.v2
         build-dir bin.v2
     ;
 
-
-
-
-
-
-
-
+path-constant BOOST_ROOT : $(boost-root) ;