Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r57798 - in trunk: boost/unordered boost/unordered/detail libs/unordered/test/helpers libs/unordered/test/unordered
From: daniel_james_at_[hidden]
Date: 2009-11-20 03:03:27


Author: danieljames
Date: 2009-11-20 03:03:26 EST (Fri, 20 Nov 2009)
New Revision: 57798
URL: http://svn.boost.org/trac/boost/changeset/57798

Log:
Support incomplete template parameters to unordered containers.
Added:
   trunk/libs/unordered/test/unordered/incomplete_test.cpp (contents, props changed)
Text files modified:
   trunk/boost/unordered/detail/equivalent.hpp | 46 ++++----
   trunk/boost/unordered/detail/extract_key.hpp | 208 +++++++++++++++++++--------------------
   trunk/boost/unordered/detail/fwd.hpp | 199 +++++++++++++++++++++++++-------------
   trunk/boost/unordered/detail/table.hpp | 182 +++++++++++++++++-----------------
   trunk/boost/unordered/detail/unique.hpp | 92 ++++++++--------
   trunk/boost/unordered/unordered_map.hpp | 20 ++-
   trunk/boost/unordered/unordered_set.hpp | 21 ++-
   trunk/libs/unordered/test/helpers/allocator.hpp | 4
   trunk/libs/unordered/test/unordered/Jamfile.v2 | 1
   9 files changed, 419 insertions(+), 354 deletions(-)

Modified: trunk/boost/unordered/detail/equivalent.hpp
==============================================================================
--- trunk/boost/unordered/detail/equivalent.hpp (original)
+++ trunk/boost/unordered/detail/equivalent.hpp 2009-11-20 03:03:26 EST (Fri, 20 Nov 2009)
@@ -15,9 +15,9 @@
     ////////////////////////////////////////////////////////////////////////////
     // Equality
 
- template <class H, class P, class A, class E>
- bool hash_equivalent_table<H, P, A, E>
- ::equals(hash_equivalent_table<H, P, A, E> const& other) const
+ template <class T>
+ bool hash_equivalent_table<T>
+ ::equals(hash_equivalent_table<T> const& other) const
     {
         if(this->size_ != other.size_) return false;
         if(!this->size_) return true;
@@ -51,9 +51,9 @@
     ////////////////////////////////////////////////////////////////////////////
     // A convenience method for adding nodes.
 
- template <class H, class P, class A, class E>
- inline BOOST_DEDUCED_TYPENAME hash_equivalent_table<H, P, A, E>::node_ptr
- hash_equivalent_table<H, P, A, E>
+ template <class T>
+ inline BOOST_DEDUCED_TYPENAME hash_equivalent_table<T>::node_ptr
+ hash_equivalent_table<T>
             ::add_node(node_constructor& a, bucket_ptr bucket, node_ptr pos)
     {
         node_ptr n = a.release();
@@ -72,10 +72,10 @@
     ////////////////////////////////////////////////////////////////////////////
     // Insert methods
 
- template <class H, class P, class A, class E>
+ template <class T>
     inline BOOST_DEDUCED_TYPENAME
- hash_equivalent_table<H, P, A, E>::iterator_base
- hash_equivalent_table<H, P, A, E>::emplace_impl(node_constructor& a)
+ hash_equivalent_table<T>::iterator_base
+ hash_equivalent_table<T>::emplace_impl(node_constructor& a)
     {
         key_type const& k = this->get_key(a.value());
         std::size_t hash_value = this->hash_function()(k);
@@ -96,8 +96,8 @@
         }
     }
     
- template <class H, class P, class A, class E>
- inline void hash_equivalent_table<H, P, A, E>
+ template <class T>
+ inline void hash_equivalent_table<T>
             ::emplace_impl_no_rehash(node_constructor& a)
     {
         key_type const& k = this->get_key(a.value());
@@ -112,10 +112,10 @@
 
     // if hash function throws, basic exception safety
     // strong otherwise
- template <class H, class P, class A, class E>
+ template <class T>
     template <class... Args>
- BOOST_DEDUCED_TYPENAME hash_equivalent_table<H, P, A, E>::iterator_base
- hash_equivalent_table<H, P, A, E>
+ BOOST_DEDUCED_TYPENAME hash_equivalent_table<T>::iterator_base
+ hash_equivalent_table<T>
             ::emplace(Args&&... args)
     {
         // Create the node before rehashing in case it throws an
@@ -129,10 +129,10 @@
 #else
 
 #define BOOST_UNORDERED_INSERT_IMPL(z, num_params, _) \
- template <class H, class P, class A, class E> \
+ template <class T> \
     template <BOOST_UNORDERED_TEMPLATE_ARGS(z, num_params)> \
- BOOST_DEDUCED_TYPENAME hash_equivalent_table<H, P, A, E>::iterator_base \
- hash_equivalent_table<H, P, A, E> \
+ BOOST_DEDUCED_TYPENAME hash_equivalent_table<T>::iterator_base \
+ hash_equivalent_table<T> \
             ::emplace(BOOST_UNORDERED_FUNCTION_PARAMS(z, num_params)) \
     { \
         node_constructor a(*this); \
@@ -151,9 +151,9 @@
 
     // if hash function throws, or inserting > 1 element, basic exception safety
     // strong otherwise
- template <class H, class P, class A, class E>
+ template <class T>
     template <class I>
- inline void hash_equivalent_table<H, P, A, E>
+ inline void hash_equivalent_table<T>
         ::insert_for_range(I i, I j, forward_traversal_tag)
     {
         if(i == j) return;
@@ -182,9 +182,9 @@
 
     // if hash function throws, or inserting > 1 element, basic exception safety
     // strong otherwise
- template <class H, class P, class A, class E>
+ template <class T>
     template <class I>
- inline void hash_equivalent_table<H, P, A, E>
+ inline void hash_equivalent_table<T>
         ::insert_for_range(I i, I j, boost::incrementable_traversal_tag)
     {
         node_constructor a(*this);
@@ -196,9 +196,9 @@
 
     // if hash function throws, or inserting > 1 element, basic exception safety
     // strong otherwise
- template <class H, class P, class A, class E>
+ template <class T>
     template <class I>
- void hash_equivalent_table<H, P, A, E>::insert_range(I i, I j)
+ void hash_equivalent_table<T>::insert_range(I i, I j)
     {
         BOOST_DEDUCED_TYPENAME boost::iterator_traversal<I>::type
             iterator_traversal_tag;

Modified: trunk/boost/unordered/detail/extract_key.hpp
==============================================================================
--- trunk/boost/unordered/detail/extract_key.hpp (original)
+++ trunk/boost/unordered/detail/extract_key.hpp 2009-11-20 03:03:26 EST (Fri, 20 Nov 2009)
@@ -28,128 +28,120 @@
         template <class T> no_key(T const&) {}
     };
 
+ template <class ValueType>
     struct set_extractor
     {
- template <class ValueType>
- struct apply
+ typedef ValueType value_type;
+ typedef ValueType key_type;
+
+ static key_type const& extract(key_type const& v)
         {
- typedef ValueType value_type;
- typedef ValueType key_type;
+ return v;
+ }
 
- static key_type const& extract(key_type const& v)
- {
- return v;
- }
-
- static no_key extract()
- {
- return no_key();
- }
-
- #if defined(BOOST_UNORDERED_STD_FORWARD)
- template <class... Args>
- static no_key extract(Args const&...)
- {
- return no_key();
- }
-
- #else
- template <class Arg>
- static no_key extract(Arg const&)
- {
- return no_key();
- }
-
- template <class Arg>
- static no_key extract(Arg const&, Arg const&)
- {
- return no_key();
- }
- #endif
-
- static bool compare_mapped(value_type const&, value_type const&)
- {
- return true;
- }
- };
+ static no_key extract()
+ {
+ return no_key();
+ }
+
+#if defined(BOOST_UNORDERED_STD_FORWARD)
+ template <class... Args>
+ static no_key extract(Args const&...)
+ {
+ return no_key();
+ }
+
+#else
+ template <class Arg>
+ static no_key extract(Arg const&)
+ {
+ return no_key();
+ }
+
+ template <class Arg>
+ static no_key extract(Arg const&, Arg const&)
+ {
+ return no_key();
+ }
+#endif
+
+ static bool compare_mapped(value_type const&, value_type const&)
+ {
+ return true;
+ }
     };
 
+ template <class Key, class ValueType>
     struct map_extractor
     {
- template <class ValueType>
- struct apply
+ typedef ValueType value_type;
+ typedef Key key_type;
+
+ static key_type const& extract(value_type const& v)
+ {
+ return v.first;
+ }
+
+ static key_type const& extract(key_type const& v)
         {
- typedef ValueType value_type;
- typedef BOOST_DEDUCED_TYPENAME
- remove_const<BOOST_DEDUCED_TYPENAME ValueType::first_type>::type
- key_type;
-
- static key_type const& extract(value_type const& v)
- {
- return v.first;
- }
-
- static key_type const& extract(key_type const& v)
- {
- return v;
- }
-
- template <class Second>
- static key_type const& extract(std::pair<key_type, Second> const& v)
- {
- return v.first;
- }
-
- template <class Second>
- static key_type const& extract(
- std::pair<key_type const, Second> const& v)
- {
- return v.first;
- }
+ return v;
+ }
+
+ template <class Second>
+ static key_type const& extract(std::pair<key_type, Second> const& v)
+ {
+ return v.first;
+ }
+
+ template <class Second>
+ static key_type const& extract(
+ std::pair<key_type const, Second> const& v)
+ {
+ return v.first;
+ }
 
 #if defined(BOOST_UNORDERED_STD_FORWARD)
- template <class Arg1, class... Args>
- static key_type const& extract(key_type const& k,
- Arg1 const&, Args const&...)
- {
- return k;
- }
-
- template <class... Args>
- static no_key extract(Args const&...)
- {
- return no_key();
- }
+ template <class Arg1, class... Args>
+ static key_type const& extract(key_type const& k,
+ Arg1 const&, Args const&...)
+ {
+ return k;
+ }
+
+ template <class... Args>
+ static no_key extract(Args const&...)
+ {
+ return no_key();
+ }
 #else
- template <class Arg1>
- static key_type const& extract(key_type const& k, Arg1 const&)
- {
- return k;
- }
-
- static no_key extract()
- {
- return no_key();
- }
-
- template <class Arg>
- static no_key extract(Arg const&)
- {
- return no_key();
- }
-
- template <class Arg, class Arg1>
- static no_key extract(Arg const&, Arg1 const&)
- {
- return no_key();
- }
+ template <class Arg1>
+ static key_type const& extract(key_type const& k, Arg1 const&)
+ {
+ return k;
+ }
+
+ static no_key extract()
+ {
+ return no_key();
+ }
+
+ template <class Arg>
+ static no_key extract(Arg const&)
+ {
+ return no_key();
+ }
+
+ template <class Arg, class Arg1>
+ static no_key extract(Arg const&, Arg1 const&)
+ {
+ return no_key();
+ }
 #endif
 
- static bool compare_mapped(value_type const& x, value_type const& y)
- {
- return x.second == y.second;
- }
- };
+ static bool compare_mapped(value_type const& x, value_type const& y)
+ {
+ return x.second == y.second;
+ }
     };
 }}
 

Modified: trunk/boost/unordered/detail/fwd.hpp
==============================================================================
--- trunk/boost/unordered/detail/fwd.hpp (original)
+++ trunk/boost/unordered/detail/fwd.hpp 2009-11-20 03:03:26 EST (Fri, 20 Nov 2009)
@@ -66,7 +66,9 @@
 
     template <class Alloc, class Grouped>
     class hash_node_constructor;
+ template <class ValueType>
     struct set_extractor;
+ template <class Key, class ValueType>
     struct map_extractor;
     struct no_key;
 
@@ -208,9 +210,9 @@
         typedef A value_allocator;
         typedef hash_bucket<A> bucket;
         typedef hash_node<A, G> node;
- typedef BOOST_DEDUCED_TYPENAME node::value_type value_type;
- typedef BOOST_DEDUCED_TYPENAME node::bucket_ptr bucket_ptr;
- typedef BOOST_DEDUCED_TYPENAME node::node_ptr node_ptr;
+ typedef BOOST_DEDUCED_TYPENAME A::value_type value_type;
+ typedef BOOST_DEDUCED_TYPENAME bucket::bucket_ptr bucket_ptr;
+ typedef BOOST_DEDUCED_TYPENAME bucket::node_ptr node_ptr;
 
         bucket_ptr bucket_;
         node_ptr node_;
@@ -268,9 +270,9 @@
         typedef BOOST_DEDUCED_TYPENAME A::value_type value_type;
         typedef BOOST_DEDUCED_TYPENAME iterator_base::node node;
 
- typedef BOOST_DEDUCED_TYPENAME node::bucket_allocator bucket_allocator;
- typedef BOOST_DEDUCED_TYPENAME node::bucket_ptr bucket_ptr;
- typedef BOOST_DEDUCED_TYPENAME node::node_ptr node_ptr;
+ typedef BOOST_DEDUCED_TYPENAME bucket::bucket_allocator bucket_allocator;
+ typedef BOOST_DEDUCED_TYPENAME bucket::bucket_ptr bucket_ptr;
+ typedef BOOST_DEDUCED_TYPENAME bucket::node_ptr node_ptr;
 
         typedef BOOST_DEDUCED_TYPENAME rebind_wrap<value_allocator, node>::type
             node_allocator;
@@ -424,33 +426,28 @@
         }
     };
 
- template <class H, class P, class A, class G, class E>
- class hash_table :
- public hash_buckets<A, G>,
- public hash_buffered_functions<H, P>
+ template <class T>
+ class hash_table : public T::buckets, public T::buffered_functions
     {
         hash_table(hash_table const&);
     public:
- typedef H hasher;
- typedef P key_equal;
- typedef A value_allocator;
- typedef E key_extractor;
- typedef hash_buffered_functions<H, P> base;
- typedef hash_buckets<A, G> buckets;
-
- typedef BOOST_DEDUCED_TYPENAME value_allocator::value_type value_type;
- typedef BOOST_DEDUCED_TYPENAME key_extractor::BOOST_NESTED_TEMPLATE
- apply<value_type> extractor;
- typedef BOOST_DEDUCED_TYPENAME extractor::key_type key_type;
-
- typedef BOOST_DEDUCED_TYPENAME buckets::node node;
- typedef BOOST_DEDUCED_TYPENAME buckets::bucket bucket;
- typedef BOOST_DEDUCED_TYPENAME buckets::node_ptr node_ptr;
- typedef BOOST_DEDUCED_TYPENAME buckets::bucket_ptr bucket_ptr;
- typedef BOOST_DEDUCED_TYPENAME buckets::iterator_base iterator_base;
- typedef BOOST_DEDUCED_TYPENAME buckets::node_allocator node_allocator;
- typedef hash_node_constructor<A, G> node_constructor;
- typedef std::pair<iterator_base, iterator_base> iterator_pair;
+ typedef BOOST_DEDUCED_TYPENAME T::hasher hasher;
+ typedef BOOST_DEDUCED_TYPENAME T::key_equal key_equal;
+ typedef BOOST_DEDUCED_TYPENAME T::value_allocator value_allocator;
+ typedef BOOST_DEDUCED_TYPENAME T::key_type key_type;
+ typedef BOOST_DEDUCED_TYPENAME T::value_type value_type;
+ typedef BOOST_DEDUCED_TYPENAME T::buffered_functions base;
+ typedef BOOST_DEDUCED_TYPENAME T::buckets buckets;
+ typedef BOOST_DEDUCED_TYPENAME T::extractor extractor;
+ typedef BOOST_DEDUCED_TYPENAME T::node_constructor node_constructor;
+
+ typedef BOOST_DEDUCED_TYPENAME T::node node;
+ typedef BOOST_DEDUCED_TYPENAME T::bucket bucket;
+ typedef BOOST_DEDUCED_TYPENAME T::node_ptr node_ptr;
+ typedef BOOST_DEDUCED_TYPENAME T::bucket_ptr bucket_ptr;
+ typedef BOOST_DEDUCED_TYPENAME T::iterator_base iterator_base;
+ typedef BOOST_DEDUCED_TYPENAME T::node_allocator node_allocator;
+ typedef BOOST_DEDUCED_TYPENAME T::iterator_pair iterator_pair;
 
         // Members
         
@@ -563,27 +560,23 @@
             node_constructor&, std::size_t);
     };
 
- template <class H, class P, class A, class E>
- class hash_unique_table :
- public hash_table<H, P, A, ungrouped, E>
-
+ template <class T>
+ class hash_unique_table : public T::table
     {
     public:
- typedef H hasher;
- typedef P key_equal;
- typedef A value_allocator;
- typedef E key_extractor;
-
- typedef hash_table<H, P, A, ungrouped, E> table;
- typedef hash_node_constructor<A, ungrouped> node_constructor;
-
- typedef BOOST_DEDUCED_TYPENAME table::key_type key_type;
- typedef BOOST_DEDUCED_TYPENAME table::value_type value_type;
- typedef BOOST_DEDUCED_TYPENAME table::node node;
- typedef BOOST_DEDUCED_TYPENAME table::node_ptr node_ptr;
- typedef BOOST_DEDUCED_TYPENAME table::bucket_ptr bucket_ptr;
- typedef BOOST_DEDUCED_TYPENAME table::iterator_base iterator_base;
- typedef BOOST_DEDUCED_TYPENAME table::extractor extractor;
+ typedef BOOST_DEDUCED_TYPENAME T::hasher hasher;
+ typedef BOOST_DEDUCED_TYPENAME T::key_equal key_equal;
+ typedef BOOST_DEDUCED_TYPENAME T::value_allocator value_allocator;
+ typedef BOOST_DEDUCED_TYPENAME T::key_type key_type;
+ typedef BOOST_DEDUCED_TYPENAME T::value_type value_type;
+ typedef BOOST_DEDUCED_TYPENAME T::table table;
+ typedef BOOST_DEDUCED_TYPENAME T::node_constructor node_constructor;
+
+ typedef BOOST_DEDUCED_TYPENAME T::node node;
+ typedef BOOST_DEDUCED_TYPENAME T::node_ptr node_ptr;
+ typedef BOOST_DEDUCED_TYPENAME T::bucket_ptr bucket_ptr;
+ typedef BOOST_DEDUCED_TYPENAME T::iterator_base iterator_base;
+ typedef BOOST_DEDUCED_TYPENAME T::extractor extractor;
         
         typedef std::pair<iterator_base, bool> emplace_return;
 
@@ -657,27 +650,23 @@
         void insert_range_impl(no_key, InputIt i, InputIt j);
     };
 
- template <class H, class P, class A, class E>
- class hash_equivalent_table :
- public hash_table<H, P, A, grouped, E>
-
+ template <class T>
+ class hash_equivalent_table : public T::table
     {
     public:
- typedef H hasher;
- typedef P key_equal;
- typedef A value_allocator;
- typedef E key_extractor;
-
- typedef hash_table<H, P, A, grouped, E> table;
- typedef hash_node_constructor<A, grouped> node_constructor;
- typedef hash_iterator_base<A, grouped> iterator_base;
-
- typedef BOOST_DEDUCED_TYPENAME table::key_type key_type;
- typedef BOOST_DEDUCED_TYPENAME table::value_type value_type;
- typedef BOOST_DEDUCED_TYPENAME table::node node;
- typedef BOOST_DEDUCED_TYPENAME table::node_ptr node_ptr;
- typedef BOOST_DEDUCED_TYPENAME table::bucket_ptr bucket_ptr;
- typedef BOOST_DEDUCED_TYPENAME table::extractor extractor;
+ typedef BOOST_DEDUCED_TYPENAME T::hasher hasher;
+ typedef BOOST_DEDUCED_TYPENAME T::key_equal key_equal;
+ typedef BOOST_DEDUCED_TYPENAME T::value_allocator value_allocator;
+ typedef BOOST_DEDUCED_TYPENAME T::key_type key_type;
+ typedef BOOST_DEDUCED_TYPENAME T::value_type value_type;
+ typedef BOOST_DEDUCED_TYPENAME T::table table;
+ typedef BOOST_DEDUCED_TYPENAME T::node_constructor node_constructor;
+
+ typedef BOOST_DEDUCED_TYPENAME T::node node;
+ typedef BOOST_DEDUCED_TYPENAME T::node_ptr node_ptr;
+ typedef BOOST_DEDUCED_TYPENAME T::bucket_ptr bucket_ptr;
+ typedef BOOST_DEDUCED_TYPENAME T::iterator_base iterator_base;
+ typedef BOOST_DEDUCED_TYPENAME T::extractor extractor;
 
         // Constructors
 
@@ -963,6 +952,80 @@
             return base_ != x.base_;
         }
     };
+
+ // types
+
+ template <class K, class V, class H, class P, class A, class E, class G>
+ struct types
+ {
+ public:
+ typedef K key_type;
+ typedef V value_type;
+ typedef H hasher;
+ typedef P key_equal;
+ typedef A value_allocator;
+ typedef E extractor;
+ typedef G group_type;
+
+ typedef hash_node_constructor<value_allocator, group_type> node_constructor;
+ typedef hash_buckets<value_allocator, group_type> buckets;
+ typedef hash_buffered_functions<hasher, key_equal> buffered_functions;
+
+ typedef BOOST_DEDUCED_TYPENAME buckets::node node;
+ typedef BOOST_DEDUCED_TYPENAME buckets::bucket bucket;
+ typedef BOOST_DEDUCED_TYPENAME buckets::node_ptr node_ptr;
+ typedef BOOST_DEDUCED_TYPENAME buckets::bucket_ptr bucket_ptr;
+ typedef BOOST_DEDUCED_TYPENAME buckets::iterator_base iterator_base;
+ typedef BOOST_DEDUCED_TYPENAME buckets::node_allocator node_allocator;
+
+ typedef std::pair<iterator_base, iterator_base> iterator_pair;
+ };
+
+ template <class H, class P, class A>
+ struct set : public types<
+ BOOST_DEDUCED_TYPENAME A::value_type,
+ BOOST_DEDUCED_TYPENAME A::value_type,
+ H, P, A,
+ set_extractor<BOOST_DEDUCED_TYPENAME A::value_type>,
+ ungrouped>
+ {
+ typedef hash_unique_table<set<H, P, A> > impl;
+ typedef hash_table<set<H, P, A> > table;
+ };
+
+ template <class H, class P, class A>
+ struct multiset : public types<
+ BOOST_DEDUCED_TYPENAME A::value_type,
+ BOOST_DEDUCED_TYPENAME A::value_type,
+ H, P, A,
+ set_extractor<BOOST_DEDUCED_TYPENAME A::value_type>,
+ grouped>
+ {
+ typedef hash_equivalent_table<multiset<H, P, A> > impl;
+ typedef hash_table<multiset<H, P, A> > table;
+ };
+
+ template <class K, class H, class P, class A>
+ struct map : public types<
+ K, BOOST_DEDUCED_TYPENAME A::value_type,
+ H, P, A,
+ map_extractor<K, BOOST_DEDUCED_TYPENAME A::value_type>,
+ ungrouped>
+ {
+ typedef hash_unique_table<map<K, H, P, A> > impl;
+ typedef hash_table<map<K, H, P, A> > table;
+ };
+
+ template <class K, class H, class P, class A>
+ struct multimap : public types<
+ K, BOOST_DEDUCED_TYPENAME A::value_type,
+ H, P, A,
+ map_extractor<K, BOOST_DEDUCED_TYPENAME A::value_type>,
+ grouped>
+ {
+ typedef hash_equivalent_table<multimap<K, H, P, A> > impl;
+ typedef hash_table<multimap<K, H, P, A> > table;
+ };
 }}
 
 #endif

Modified: trunk/boost/unordered/detail/table.hpp
==============================================================================
--- trunk/boost/unordered/detail/table.hpp (original)
+++ trunk/boost/unordered/detail/table.hpp 2009-11-20 03:03:26 EST (Fri, 20 Nov 2009)
@@ -21,17 +21,17 @@
     // Helper methods
 
     // strong exception safety, no side effects
- template <class H, class P, class A, class G, class E>
- inline bool hash_table<H, P, A, G, E>::equal(
+ template <class T>
+ inline bool hash_table<T>::equal(
         key_type const& k, value_type const& v) const
     {
         return this->key_eq()(k, get_key(v));
     }
 
     // strong exception safety, no side effects
- template <class H, class P, class A, class G, class E>
- inline BOOST_DEDUCED_TYPENAME hash_table<H, P, A, G, E>::node_ptr
- hash_table<H, P, A, G, E>::find_iterator(
+ template <class T>
+ inline BOOST_DEDUCED_TYPENAME T::node_ptr
+ hash_table<T>::find_iterator(
             bucket_ptr bucket, key_type const& k) const
     {
         node_ptr it = bucket->next_;
@@ -46,17 +46,17 @@
 
     // strong exception safety, no side effects
     // pre: this->buckets_
- template <class H, class P, class A, class G, class E>
- inline BOOST_DEDUCED_TYPENAME hash_table<H, P, A, G, E>::node_ptr
- hash_table<H, P, A, G, E>::find_iterator(key_type const& k) const
+ template <class T>
+ inline BOOST_DEDUCED_TYPENAME T::node_ptr
+ hash_table<T>::find_iterator(key_type const& k) const
     {
         return find_iterator(this->get_bucket(this->bucket_index(k)), k);
     }
 
     // strong exception safety, no side effects
- template <class H, class P, class A, class G, class E>
- inline BOOST_DEDUCED_TYPENAME hash_table<H, P, A, G, E>::node_ptr*
- hash_table<H, P, A, G, E>::find_for_erase(
+ template <class T>
+ inline BOOST_DEDUCED_TYPENAME T::node_ptr*
+ hash_table<T>::find_for_erase(
             bucket_ptr bucket, key_type const& k) const
     {
         node_ptr* it = &bucket->next_;
@@ -73,8 +73,8 @@
     // Load methods
 
     // no throw
- template <class H, class P, class A, class G, class E>
- std::size_t hash_table<H, P, A, G, E>::max_size() const
+ template <class T>
+ std::size_t hash_table<T>::max_size() const
     {
         using namespace std;
 
@@ -84,8 +84,8 @@
     }
 
     // strong safety
- template <class H, class P, class A, class G, class E>
- inline std::size_t hash_table<H, P, A, G, E>::bucket_index(
+ template <class T>
+ inline std::size_t hash_table<T>::bucket_index(
         key_type const& k) const
     {
         // hash_function can throw:
@@ -94,8 +94,8 @@
 
 
     // no throw
- template <class H, class P, class A, class G, class E>
- inline std::size_t hash_table<H, P, A, G, E>::calculate_max_load()
+ template <class T>
+ inline std::size_t hash_table<T>::calculate_max_load()
     {
         using namespace std;
 
@@ -104,8 +104,8 @@
         return double_to_size_t(ceil((double) mlf_ * this->bucket_count_));
     }
 
- template <class H, class P, class A, class G, class E>
- void hash_table<H, P, A, G, E>::max_load_factor(float z)
+ template <class T>
+ void hash_table<T>::max_load_factor(float z)
     {
         BOOST_ASSERT(z > 0);
         mlf_ = (std::max)(z, minimum_max_load_factor);
@@ -113,8 +113,8 @@
     }
 
     // no throw
- template <class H, class P, class A, class G, class E>
- inline std::size_t hash_table<H, P, A, G, E>::min_buckets_for_size(
+ template <class T>
+ inline std::size_t hash_table<T>::min_buckets_for_size(
         std::size_t size) const
     {
         BOOST_ASSERT(this->mlf_ != 0);
@@ -135,8 +135,8 @@
 
     // init_buckets
 
- template <class H, class P, class A, class G, class E>
- inline void hash_table<H, P, A, G, E>::init_buckets()
+ template <class T>
+ inline void hash_table<T>::init_buckets()
     {
         if (this->size_) {
             this->cached_begin_bucket_ = this->buckets_;
@@ -153,8 +153,8 @@
     //
     // no throw
 
- template <class H, class P, class A, class G, class E>
- inline void hash_table<H, P, A, G, E>::recompute_begin_bucket(bucket_ptr b)
+ template <class T>
+ inline void hash_table<T>::recompute_begin_bucket(bucket_ptr b)
     {
         BOOST_ASSERT(!(b < this->cached_begin_bucket_));
 
@@ -174,8 +174,8 @@
     //
     // no throw
 
- template <class H, class P, class A, class G, class E>
- inline void hash_table<H, P, A, G, E>::recompute_begin_bucket(
+ template <class T>
+ inline void hash_table<T>::recompute_begin_bucket(
         bucket_ptr b1, bucket_ptr b2)
     {
         BOOST_ASSERT(!(b1 < this->cached_begin_bucket_) && !(b2 < b1));
@@ -186,8 +186,8 @@
     }
 
     // no throw
- template <class H, class P, class A, class G, class E>
- inline float hash_table<H, P, A, G, E>::load_factor() const
+ template <class T>
+ inline float hash_table<T>::load_factor() const
     {
         BOOST_ASSERT(this->bucket_count_ != 0);
         return static_cast<float>(this->size_)
@@ -197,8 +197,8 @@
     ////////////////////////////////////////////////////////////////////////////
     // Constructors
 
- template <class H, class P, class A, class G, class E>
- hash_table<H, P, A, G, E>::hash_table(std::size_t num_buckets,
+ template <class T>
+ hash_table<T>::hash_table(std::size_t num_buckets,
         hasher const& hf, key_equal const& eq, node_allocator const& a)
       : buckets(a, next_prime(num_buckets)),
         base(hf, eq),
@@ -211,8 +211,8 @@
 
     // Copy Construct with allocator
 
- template <class H, class P, class A, class G, class E>
- hash_table<H, P, A, G, E>::hash_table(hash_table const& x,
+ template <class T>
+ hash_table<T>::hash_table(hash_table const& x,
         node_allocator const& a)
       : buckets(a, x.min_buckets_for_size(x.size_)),
         base(x),
@@ -229,8 +229,8 @@
 
     // Move Construct
 
- template <class H, class P, class A, class G, class E>
- hash_table<H, P, A, G, E>::hash_table(hash_table& x, move_tag)
+ template <class T>
+ hash_table<T>::hash_table(hash_table& x, move_tag)
       : buckets(x.node_alloc(), x.bucket_count_),
         base(x),
         size_(0),
@@ -241,8 +241,8 @@
         this->partial_swap(x);
     }
 
- template <class H, class P, class A, class G, class E>
- hash_table<H, P, A, G, E>::hash_table(hash_table& x,
+ template <class T>
+ hash_table<T>::hash_table(hash_table& x,
         node_allocator const& a, move_tag)
       : buckets(a, x.bucket_count_),
         base(x),
@@ -261,8 +261,8 @@
         }
     }
 
- template <class H, class P, class A, class G, class E>
- hash_table<H, P, A, G, E>& hash_table<H, P, A, G, K>::operator=(
+ template <class T>
+ hash_table<T>& hash_table<T>::operator=(
         hash_table const& x)
     {
         hash_table tmp(x, this->node_alloc());
@@ -280,8 +280,8 @@
     // Can throw if hash or predicate object's copy constructor throws
     // or if allocators are unequal.
 
- template <class H, class P, class A, class G, class E>
- inline void hash_table<H, P, A, G, E>::partial_swap(hash_table& x)
+ template <class T>
+ inline void hash_table<T>::partial_swap(hash_table& x)
     {
         this->buckets::swap(x); // No throw
         std::swap(this->size_, x.size_);
@@ -290,15 +290,15 @@
         std::swap(this->max_load_, x.max_load_);
     }
 
- template <class H, class P, class A, class G, class E>
- inline void hash_table<H, P, A, G, E>::fast_swap(hash_table& x)
+ template <class T>
+ inline void hash_table<T>::fast_swap(hash_table& x)
     {
         // These can throw, but they only affect the function objects
         // that aren't in use so it is strongly exception safe, via.
         // double buffering.
         {
- set_hash_functions<H, P> op1(*this, x);
- set_hash_functions<H, P> op2(x, *this);
+ set_hash_functions<hasher, key_equal> op1(*this, x);
+ set_hash_functions<hasher, key_equal> op2(x, *this);
             op1.commit();
             op2.commit();
         }
@@ -309,8 +309,8 @@
         std::swap(this->max_load_, x.max_load_);
     }
 
- template <class H, class P, class A, class G, class E>
- inline void hash_table<H, P, A, G, E>::slow_swap(hash_table& x)
+ template <class T>
+ inline void hash_table<T>::slow_swap(hash_table& x)
     {
         if(this == &x) return;
 
@@ -318,8 +318,8 @@
             // These can throw, but they only affect the function objects
             // that aren't in use so it is strongly exception safe, via.
             // double buffering.
- set_hash_functions<H, P> op1(*this, x);
- set_hash_functions<H, P> op2(x, *this);
+ set_hash_functions<hasher, key_equal> op1(*this, x);
+ set_hash_functions<hasher, key_equal> op2(x, *this);
         
             // Create new buckets in separate hash_buckets objects
             // which will clean up if anything throws an exception.
@@ -345,8 +345,8 @@
         if(x.buckets_) x.init_buckets();
     }
 
- template <class H, class P, class A, class G, class E>
- void hash_table<H, P, A, G, E>::swap(hash_table& x)
+ template <class T>
+ void hash_table<T>::swap(hash_table& x)
     {
         if(this->node_alloc() == x.node_alloc()) {
             if(this != &x) this->fast_swap(x);
@@ -364,13 +364,13 @@
     // Can throw if hash or predicate object's copy constructor throws
     // or if allocators are unequal.
 
- template <class H, class P, class A, class G, class E>
- void hash_table<H, P, A, G, E>::move(hash_table& x)
+ template <class T>
+ void hash_table<T>::move(hash_table& x)
     {
         // This can throw, but it only affects the function objects
         // that aren't in use so it is strongly exception safe, via.
         // double buffering.
- set_hash_functions<H, P> new_func_this(*this, x);
+ set_hash_functions<hasher, key_equal> new_func_this(*this, x);
 
         if(this->node_alloc() == x.node_alloc()) {
             this->buckets::move(x); // no throw
@@ -402,8 +402,8 @@
     // Reserve & Rehash
 
     // basic exception safety
- template <class H, class P, class A, class G, class E>
- inline void hash_table<H, P, A, G, E>::create_for_insert(std::size_t size)
+ template <class T>
+ inline void hash_table<T>::create_for_insert(std::size_t size)
     {
         this->bucket_count_ = (std::max)(this->bucket_count_,
             this->min_buckets_for_size(size));
@@ -412,8 +412,8 @@
     }
 
     // basic exception safety
- template <class H, class P, class A, class G, class E>
- inline bool hash_table<H, P, A, G, E>::reserve_for_insert(std::size_t size)
+ template <class T>
+ inline bool hash_table<T>::reserve_for_insert(std::size_t size)
     {
         if(size >= max_load_) {
             std::size_t num_buckets
@@ -431,8 +431,8 @@
     // if hash function throws, basic exception safety
     // strong otherwise.
 
- template <class H, class P, class A, class G, class E>
- inline void hash_table<H, P, A, G, E>::rehash(std::size_t min_buckets)
+ template <class T>
+ inline void hash_table<T>::rehash(std::size_t min_buckets)
     {
         using namespace std;
 
@@ -451,8 +451,8 @@
     // if hash function throws, basic exception safety
     // strong otherwise
 
- template <class H, class P, class A, class G, class E>
- void hash_table<H, P, A, G, E>
+ template <class T>
+ void hash_table<T>
         ::rehash_impl(std::size_t num_buckets)
     {
         hasher const& hf = this->hash_function();
@@ -500,8 +500,8 @@
     // basic excpetion safety. If an exception is thrown this will
     // leave dst partially filled.
 
- template <class H, class P, class A, class G, class E>
- void hash_table<H, P, A, G, E>
+ template <class T>
+ void hash_table<T>
         ::copy_buckets_to(buckets& dst) const
     {
         BOOST_ASSERT(this->buckets_ && !dst.buckets_);
@@ -509,7 +509,7 @@
         hasher const& hf = this->hash_function();
         bucket_ptr end = this->get_bucket(this->bucket_count_);
 
- hash_node_constructor<A, G> a(dst);
+ node_constructor a(dst);
         dst.create_buckets();
 
         // no throw:
@@ -544,8 +544,8 @@
     //
     // strong exception safety, no side effects
 
- template <class H, class P, class A, class G, class E>
- std::size_t hash_table<H, P, A, G, E>::count(key_type const& k) const
+ template <class T>
+ std::size_t hash_table<T>::count(key_type const& k) const
     {
         if(!this->size_) return 0;
         node_ptr it = find_iterator(k); // throws, strong
@@ -555,9 +555,9 @@
     // find
     //
     // strong exception safety, no side effects
- template <class H, class P, class A, class G, class E>
- BOOST_DEDUCED_TYPENAME hash_table<H, P, A, G, E>::iterator_base
- hash_table<H, P, A, G, E>::find(key_type const& k) const
+ template <class T>
+ BOOST_DEDUCED_TYPENAME T::iterator_base
+ hash_table<T>::find(key_type const& k) const
     {
         if(!this->size_) return this->end();
 
@@ -570,9 +570,9 @@
             return this->end();
     }
 
- template <class H, class P, class A, class G, class E>
- BOOST_DEDUCED_TYPENAME A::value_type&
- hash_table<H, P, A, G, E>::at(key_type const& k) const
+ template <class T>
+ BOOST_DEDUCED_TYPENAME T::value_type&
+ hash_table<T>::at(key_type const& k) const
     {
         if(!this->size_)
             throw std::out_of_range("Unable to find key in unordered_map.");
@@ -589,9 +589,9 @@
     // equal_range
     //
     // strong exception safety, no side effects
- template <class H, class P, class A, class G, class E>
- BOOST_DEDUCED_TYPENAME hash_table<H, P, A, G, E>::iterator_pair
- hash_table<H, P, A, G, E>::equal_range(key_type const& k) const
+ template <class T>
+ BOOST_DEDUCED_TYPENAME T::iterator_pair
+ hash_table<T>::equal_range(key_type const& k) const
     {
         if(!this->size_)
             return iterator_pair(this->end(), this->end());
@@ -612,8 +612,8 @@
     ////////////////////////////////////////////////////////////////////////////
     // Erase methods
     
- template <class H, class P, class A, class G, class E>
- void hash_table<H, P, A, G, E>::clear()
+ template <class T>
+ void hash_table<T>::clear()
     {
         if(!this->size_) return;
 
@@ -626,8 +626,8 @@
         this->cached_begin_bucket_ = end;
     }
 
- template <class H, class P, class A, class G, class E>
- inline std::size_t hash_table<H, P, A, G, E>::erase_group(
+ template <class T>
+ inline std::size_t hash_table<T>::erase_group(
         node_ptr* it, bucket_ptr bucket)
     {
         node_ptr pos = *it;
@@ -639,8 +639,8 @@
         return count;
     }
     
- template <class H, class P, class A, class G, class E>
- std::size_t hash_table<H, P, A, G, E>::erase_key(key_type const& k)
+ template <class T>
+ std::size_t hash_table<T>::erase_key(key_type const& k)
     {
         if(!this->size_) return 0;
     
@@ -653,9 +653,9 @@
     }
 
 
- template <class H, class P, class A, class G, class E>
- BOOST_DEDUCED_TYPENAME hash_table<H, P, A, G, E>::iterator_base
- hash_table<H, P, A, G, E>::erase(iterator_base r)
+ template <class T>
+ BOOST_DEDUCED_TYPENAME T::iterator_base
+ hash_table<T>::erase(iterator_base r)
     {
         BOOST_ASSERT(r.node_);
         iterator_base next = r;
@@ -668,9 +668,9 @@
         return next;
     }
 
- template <class H, class P, class A, class G, class E>
- BOOST_DEDUCED_TYPENAME hash_table<H, P, A, G, E>::iterator_base
- hash_table<H, P, A, G, E>::erase_range(
+ template <class T>
+ BOOST_DEDUCED_TYPENAME T::iterator_base
+ hash_table<T>::erase_range(
             iterator_base r1, iterator_base r2)
     {
         if(r1 != r2)
@@ -713,9 +713,9 @@
         return r2;
     }
 
- template <class H, class P, class A, class G, class E>
- BOOST_DEDUCED_TYPENAME hash_table<H, P, A, G, E>::iterator_base
- hash_table<H, P, A, G, E>::emplace_empty_impl_with_node(
+ template <class T>
+ BOOST_DEDUCED_TYPENAME hash_table<T>::iterator_base
+ hash_table<T>::emplace_empty_impl_with_node(
             node_constructor& a, std::size_t size)
     {
         key_type const& k = get_key(a.value());

Modified: trunk/boost/unordered/detail/unique.hpp
==============================================================================
--- trunk/boost/unordered/detail/unique.hpp (original)
+++ trunk/boost/unordered/detail/unique.hpp 2009-11-20 03:03:26 EST (Fri, 20 Nov 2009)
@@ -15,9 +15,9 @@
     ////////////////////////////////////////////////////////////////////////////
     // Equality
 
- template <class H, class P, class A, class E>
- bool hash_unique_table<H, P, A, E>
- ::equals(hash_unique_table<H, P, A, E> const& other) const
+ template <class T>
+ bool hash_unique_table<T>
+ ::equals(hash_unique_table<T> const& other) const
     {
         if(this->size_ != other.size_) return false;
         if(!this->size_) return true;
@@ -43,9 +43,9 @@
     ////////////////////////////////////////////////////////////////////////////
     // A convenience method for adding nodes.
 
- template <class H, class P, class A, class E>
- inline BOOST_DEDUCED_TYPENAME hash_unique_table<H, P, A, E>::node_ptr
- hash_unique_table<H, P, A, E>::add_node(node_constructor& a,
+ template <class T>
+ inline BOOST_DEDUCED_TYPENAME hash_unique_table<T>::node_ptr
+ hash_unique_table<T>::add_node(node_constructor& a,
             bucket_ptr bucket)
     {
         node_ptr n = a.release();
@@ -61,9 +61,9 @@
 
     // if hash function throws, basic exception safety
     // strong otherwise
- template <class H, class P, class A, class E>
- BOOST_DEDUCED_TYPENAME hash_unique_table<H, P, A, E>::value_type&
- hash_unique_table<H, P, A, E>::operator[](key_type const& k)
+ template <class T>
+ BOOST_DEDUCED_TYPENAME hash_unique_table<T>::value_type&
+ hash_unique_table<T>::operator[](key_type const& k)
     {
         typedef BOOST_DEDUCED_TYPENAME value_type::second_type mapped_type;
 
@@ -100,9 +100,9 @@
         }
     }
 
- template <class H, class P, class A, class E>
- inline BOOST_DEDUCED_TYPENAME hash_unique_table<H, P, A, E>::emplace_return
- hash_unique_table<H, P, A, E>::emplace_impl_with_node(node_constructor& a)
+ template <class T>
+ inline BOOST_DEDUCED_TYPENAME hash_unique_table<T>::emplace_return
+ hash_unique_table<T>::emplace_impl_with_node(node_constructor& a)
     {
         // No side effects in this initial code
         key_type const& k = this->get_key(a.value());
@@ -129,10 +129,10 @@
 
 #if defined(BOOST_UNORDERED_STD_FORWARD)
 
- template <class H, class P, class A, class E>
+ template <class T>
     template<class... Args>
- inline BOOST_DEDUCED_TYPENAME hash_unique_table<H, P, A, E>::emplace_return
- hash_unique_table<H, P, A, E>::emplace_impl(key_type const& k,
+ inline BOOST_DEDUCED_TYPENAME hash_unique_table<T>::emplace_return
+ hash_unique_table<T>::emplace_impl(key_type const& k,
             Args&&... args)
     {
         // No side effects in this initial code
@@ -166,10 +166,10 @@
         }
     }
 
- template <class H, class P, class A, class E>
+ template <class T>
     template<class... Args>
- inline BOOST_DEDUCED_TYPENAME hash_unique_table<H, P, A, E>::emplace_return
- hash_unique_table<H, P, A, E>::emplace_impl(no_key, Args&&... args)
+ inline BOOST_DEDUCED_TYPENAME hash_unique_table<T>::emplace_return
+ hash_unique_table<T>::emplace_impl(no_key, Args&&... args)
     {
         // Construct the node regardless - in order to get the key.
         // It will be discarded if it isn't used
@@ -178,10 +178,10 @@
         return emplace_impl_with_node(a);
     }
 
- template <class H, class P, class A, class E>
+ template <class T>
     template<class... Args>
- inline BOOST_DEDUCED_TYPENAME hash_unique_table<H, P, A, E>::emplace_return
- hash_unique_table<H, P, A, E>::emplace_empty_impl(Args&&... args)
+ inline BOOST_DEDUCED_TYPENAME hash_unique_table<T>::emplace_return
+ hash_unique_table<T>::emplace_empty_impl(Args&&... args)
     {
         node_constructor a(*this);
         a.construct(std::forward<Args>(args)...);
@@ -191,11 +191,11 @@
 #else
 
 #define BOOST_UNORDERED_INSERT_IMPL(z, num_params, _) \
- template <class H, class P, class A, class E> \
+ template <class T> \
     template <BOOST_UNORDERED_TEMPLATE_ARGS(z, num_params)> \
     inline BOOST_DEDUCED_TYPENAME \
- hash_unique_table<H, P, A, E>::emplace_return \
- hash_unique_table<H, P, A, E>::emplace_impl( \
+ hash_unique_table<T>::emplace_return \
+ hash_unique_table<T>::emplace_impl( \
                 key_type const& k, \
                 BOOST_UNORDERED_FUNCTION_PARAMS(z, num_params)) \
     { \
@@ -218,11 +218,11 @@
         } \
     } \
                                                                                \
- template <class H, class P, class A, class E> \
+ template <class T> \
     template <BOOST_UNORDERED_TEMPLATE_ARGS(z, num_params)> \
     inline BOOST_DEDUCED_TYPENAME \
- hash_unique_table<H, P, A, E>::emplace_return \
- hash_unique_table<H, P, A, E>:: \
+ hash_unique_table<T>::emplace_return \
+ hash_unique_table<T>:: \
                 emplace_impl(no_key, \
                     BOOST_UNORDERED_FUNCTION_PARAMS(z, num_params)) \
     { \
@@ -231,17 +231,17 @@
         return emplace_impl_with_node(a); \
     } \
                                                                                \
- template <class H, class P, class A, class E> \
+ template <class T> \
     template <BOOST_UNORDERED_TEMPLATE_ARGS(z, num_params)> \
     inline BOOST_DEDUCED_TYPENAME \
- hash_unique_table<H, P, A, E>::emplace_return \
- hash_unique_table<H, P, A, E>:: \
+ hash_unique_table<T>::emplace_return \
+ hash_unique_table<T>:: \
                 emplace_empty_impl( \
                     BOOST_UNORDERED_FUNCTION_PARAMS(z, num_params)) \
     { \
         node_constructor a(*this); \
         a.construct(BOOST_UNORDERED_CALL_PARAMS(z, num_params)); \
- return emplace_return(this->emplace_empty_impl_with_node(a, 1), true); \
+ return emplace_return(this->emplace_empty_impl_with_node(a, 1), true); \
     }
 
     BOOST_PP_REPEAT_FROM_TO(1, BOOST_UNORDERED_EMPLACE_LIMIT,
@@ -259,10 +259,10 @@
     // if hash function throws, basic exception safety
     // strong otherwise
 
- template <class H, class P, class A, class E>
+ template <class T>
     template<class... Args>
- BOOST_DEDUCED_TYPENAME hash_unique_table<H, P, A, E>::emplace_return
- hash_unique_table<H, P, A, E>::emplace(Args&&... args)
+ BOOST_DEDUCED_TYPENAME hash_unique_table<T>::emplace_return
+ hash_unique_table<T>::emplace(Args&&... args)
     {
         return this->size_ ?
             emplace_impl(
@@ -273,10 +273,10 @@
 
 #else
 
- template <class H, class P, class A, class E>
+ template <class T>
     template <class Arg0>
- BOOST_DEDUCED_TYPENAME hash_unique_table<H, P, A, E>::emplace_return
- hash_unique_table<H, P, A, E>::emplace(Arg0 const& arg0)
+ BOOST_DEDUCED_TYPENAME hash_unique_table<T>::emplace_return
+ hash_unique_table<T>::emplace(Arg0 const& arg0)
     {
         return this->size_ ?
             emplace_impl(extractor::extract(arg0), arg0) :
@@ -284,10 +284,10 @@
     }
 
 #define BOOST_UNORDERED_INSERT_IMPL(z, num_params, _) \
- template <class H, class P, class A, class E> \
+ template <class T> \
     template <BOOST_UNORDERED_TEMPLATE_ARGS(z, num_params)> \
- BOOST_DEDUCED_TYPENAME hash_unique_table<H, P, A, E>::emplace_return \
- hash_unique_table<H, P, A, E>::emplace( \
+ BOOST_DEDUCED_TYPENAME hash_unique_table<T>::emplace_return \
+ hash_unique_table<T>::emplace( \
             BOOST_UNORDERED_FUNCTION_PARAMS(z, num_params)) \
     { \
         return this->size_ ? \
@@ -307,9 +307,9 @@
     ////////////////////////////////////////////////////////////////////////////
     // Insert range methods
 
- template <class H, class P, class A, class E>
+ template <class T>
     template <class InputIt>
- inline void hash_unique_table<H, P, A, E>::insert_range_impl(
+ inline void hash_unique_table<T>::insert_range_impl(
         key_type const&, InputIt i, InputIt j)
     {
         node_constructor a(*this);
@@ -352,9 +352,9 @@
         } while(++i != j);
     }
 
- template <class H, class P, class A, class E>
+ template <class T>
     template <class InputIt>
- inline void hash_unique_table<H, P, A, E>::insert_range_impl(
+ inline void hash_unique_table<T>::insert_range_impl(
         no_key, InputIt i, InputIt j)
     {
         node_constructor a(*this);
@@ -375,9 +375,9 @@
 
     // if hash function throws, or inserting > 1 element, basic exception safety
     // strong otherwise
- template <class H, class P, class A, class E>
+ template <class T>
     template <class InputIt>
- void hash_unique_table<H, P, A, E>::insert_range(InputIt i, InputIt j)
+ void hash_unique_table<T>::insert_range(InputIt i, InputIt j)
     {
         if(i != j)
             return insert_range_impl(extractor::extract(*i), i, j);

Modified: trunk/boost/unordered/unordered_map.hpp
==============================================================================
--- trunk/boost/unordered/unordered_map.hpp (original)
+++ trunk/boost/unordered/unordered_map.hpp 2009-11-20 03:03:26 EST (Fri, 20 Nov 2009)
@@ -58,10 +58,11 @@
                 allocator_type, value_type>::type
             value_allocator;
 
- typedef boost::unordered_detail::hash_unique_table<Hash, Pred,
- value_allocator, boost::unordered_detail::map_extractor> table;
+ typedef boost::unordered_detail::map<Key, Hash, Pred,
+ value_allocator> types;
+ typedef BOOST_DEDUCED_TYPENAME types::impl table;
 
- typedef BOOST_DEDUCED_TYPENAME table::iterator_base iterator_base;
+ typedef BOOST_DEDUCED_TYPENAME types::iterator_base iterator_base;
 
     public:
 
@@ -96,7 +97,7 @@
 
         table table_;
         
- BOOST_DEDUCED_TYPENAME table::iterator_base const&
+ BOOST_DEDUCED_TYPENAME types::iterator_base const&
             get(const_iterator const& it)
         {
             return boost::unordered_detail::iterator_access::get(it);
@@ -553,14 +554,17 @@
 #if !BOOST_WORKAROUND(__BORLANDC__, < 0x0582)
     private:
 #endif
+
         typedef BOOST_DEDUCED_TYPENAME
             boost::unordered_detail::rebind_wrap<
                 allocator_type, value_type>::type
             value_allocator;
 
- typedef boost::unordered_detail::hash_equivalent_table<Hash, Pred,
- value_allocator, boost::unordered_detail::map_extractor> table;
- typedef BOOST_DEDUCED_TYPENAME table::iterator_base iterator_base;
+ typedef boost::unordered_detail::multimap<Key, Hash, Pred,
+ value_allocator> types;
+ typedef BOOST_DEDUCED_TYPENAME types::impl table;
+
+ typedef BOOST_DEDUCED_TYPENAME types::iterator_base iterator_base;
 
     public:
 
@@ -595,7 +599,7 @@
 
         table table_;
         
- BOOST_DEDUCED_TYPENAME table::iterator_base const&
+ BOOST_DEDUCED_TYPENAME types::iterator_base const&
             get(const_iterator const& it)
         {
             return boost::unordered_detail::iterator_access::get(it);

Modified: trunk/boost/unordered/unordered_set.hpp
==============================================================================
--- trunk/boost/unordered/unordered_set.hpp (original)
+++ trunk/boost/unordered/unordered_set.hpp 2009-11-20 03:03:26 EST (Fri, 20 Nov 2009)
@@ -58,9 +58,11 @@
                 allocator_type, value_type>::type
             value_allocator;
 
- typedef boost::unordered_detail::hash_unique_table<Hash, Pred,
- value_allocator, boost::unordered_detail::set_extractor> table;
- typedef BOOST_DEDUCED_TYPENAME table::iterator_base iterator_base;
+ typedef boost::unordered_detail::set<Hash, Pred,
+ value_allocator> types;
+ typedef BOOST_DEDUCED_TYPENAME types::impl table;
+
+ typedef BOOST_DEDUCED_TYPENAME types::iterator_base iterator_base;
 
     public:
 
@@ -91,7 +93,7 @@
 
         table table_;
         
- BOOST_DEDUCED_TYPENAME table::iterator_base const&
+ BOOST_DEDUCED_TYPENAME types::iterator_base const&
             get(const_iterator const& it)
         {
             return boost::unordered_detail::iterator_access::get(it);
@@ -518,14 +520,17 @@
 #if !BOOST_WORKAROUND(__BORLANDC__, < 0x0582)
     private:
 #endif
+
         typedef BOOST_DEDUCED_TYPENAME
             boost::unordered_detail::rebind_wrap<
                 allocator_type, value_type>::type
             value_allocator;
 
- typedef boost::unordered_detail::hash_equivalent_table<Hash, Pred,
- value_allocator, boost::unordered_detail::set_extractor> table;
- typedef BOOST_DEDUCED_TYPENAME table::iterator_base iterator_base;
+ typedef boost::unordered_detail::multiset<Hash, Pred,
+ value_allocator> types;
+ typedef BOOST_DEDUCED_TYPENAME types::impl table;
+
+ typedef BOOST_DEDUCED_TYPENAME types::iterator_base iterator_base;
 
     public:
 
@@ -556,7 +561,7 @@
 
         table table_;
         
- BOOST_DEDUCED_TYPENAME table::iterator_base const&
+ BOOST_DEDUCED_TYPENAME types::iterator_base const&
             get(const_iterator const& it)
         {
             return boost::unordered_detail::iterator_access::get(it);

Modified: trunk/libs/unordered/test/helpers/allocator.hpp
==============================================================================
--- trunk/libs/unordered/test/helpers/allocator.hpp (original)
+++ trunk/libs/unordered/test/helpers/allocator.hpp 2009-11-20 03:03:26 EST (Fri, 20 Nov 2009)
@@ -58,8 +58,8 @@
             return (std::numeric_limits<size_type>::max)();
         }
 
- bool operator==(malloc_allocator const& x) const { return true; }
- bool operator!=(malloc_allocator const& x) const { return false; }
+ bool operator==(malloc_allocator const&) const { return true; }
+ bool operator!=(malloc_allocator const&) const { return false; }
 
 #if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
         template <class T> void deallocate(T* p, size_type) {

Modified: trunk/libs/unordered/test/unordered/Jamfile.v2
==============================================================================
--- trunk/libs/unordered/test/unordered/Jamfile.v2 (original)
+++ trunk/libs/unordered/test/unordered/Jamfile.v2 2009-11-20 03:03:26 EST (Fri, 20 Nov 2009)
@@ -25,6 +25,7 @@
         [ run compile_set.cpp ]
         [ run compile_map.cpp ]
         [ run link_test_1.cpp link_test_2.cpp ]
+ [ run incomplete_test.cpp ]
         [ run simple_tests.cpp ]
         [ run equivalent_keys_tests.cpp ]
         [ run constructor_tests.cpp ]

Added: trunk/libs/unordered/test/unordered/incomplete_test.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/unordered/test/unordered/incomplete_test.cpp 2009-11-20 03:03:26 EST (Fri, 20 Nov 2009)
@@ -0,0 +1,39 @@
+
+// Copyright 2009 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/unordered_set.hpp>
+
+namespace test
+{
+ struct value;
+ struct hash;
+ struct equals;
+ template <class T>
+ struct malloc_allocator;
+
+ typedef boost::unordered_map<value, value, hash, equals, malloc_allocator<std::pair<value const, value> > > map;
+ typedef boost::unordered_multimap<value, value, hash, equals, malloc_allocator<std::pair<value const, value> > > multimap;
+ typedef boost::unordered_set<value, hash, equals, malloc_allocator<value> > set;
+ typedef boost::unordered_multiset<value, hash, equals, malloc_allocator<value> > multiset;
+
+ struct value {};
+ struct hash { std::size_t operator()(value const&) const { return 0; } };
+ struct equals { bool operator()(value const&, value const&) const { return true; } };
+}
+
+#include "../helpers/allocator.hpp"
+
+int main() {
+ test::map m1;
+ test::multimap m2;
+ test::set s1;
+ test::multiset s2;
+
+ m1[test::value()] = test::value();
+ m2.insert(std::make_pair(test::value(), test::value()));
+ s1.insert(test::value());
+ s2.insert(test::value());
+}
\ No newline at end of file


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk