Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r51409 - trunk/boost/unordered/detail
From: daniel_james_at_[hidden]
Date: 2009-02-22 18:50:21


Author: danieljames
Date: 2009-02-22 18:50:20 EST (Sun, 22 Feb 2009)
New Revision: 51409
URL: http://svn.boost.org/trac/boost/changeset/51409

Log:
Move some of the data structure classes out of hash table data.
Text files modified:
   trunk/boost/unordered/detail/hash_table.hpp | 43 ++++++++++++++++
   trunk/boost/unordered/detail/hash_table_impl.hpp | 105 +++++++++++++--------------------------
   2 files changed, 79 insertions(+), 69 deletions(-)

Modified: trunk/boost/unordered/detail/hash_table.hpp
==============================================================================
--- trunk/boost/unordered/detail/hash_table.hpp (original)
+++ trunk/boost/unordered/detail/hash_table.hpp 2009-02-22 18:50:20 EST (Sun, 22 Feb 2009)
@@ -228,6 +228,49 @@
         void destroy(T* x) {
             x->~T();
         }
+
+ // Some classes for the data structure
+
+ template <typename Alloc>
+ struct bucket_impl
+ {
+ private:
+ bucket_impl& operator=(bucket_impl const&);
+ public:
+ typedef BOOST_DEDUCED_TYPENAME
+ boost::unordered_detail::rebind_wrap<Alloc, bucket_impl>::type
+ bucket_allocator;
+ typedef BOOST_DEDUCED_TYPENAME
+ allocator_pointer<bucket_allocator>::type bucket_ptr;
+ typedef bucket_ptr link_ptr;
+
+ link_ptr next_;
+
+ bucket_impl() : next_()
+ {
+ BOOST_UNORDERED_MSVC_RESET_PTR(next_);
+ }
+
+ bucket_impl(bucket_impl const& x) : next_(x.next_)
+ {
+ // Only copy construct when allocating.
+ BOOST_ASSERT(!x.next_);
+ }
+
+ bool empty() const
+ {
+ return !this->next_;
+ }
+ };
+
+ template <typename T>
+ struct value_base {
+ typename boost::aligned_storage<
+ sizeof(T),
+ boost::alignment_of<T>::value>::type data_;
+
+ void* address() { return this; }
+ };
     }
 }
 

Modified: trunk/boost/unordered/detail/hash_table_impl.hpp
==============================================================================
--- trunk/boost/unordered/detail/hash_table_impl.hpp (original)
+++ trunk/boost/unordered/detail/hash_table_impl.hpp 2009-02-22 18:50:20 EST (Sun, 22 Feb 2009)
@@ -6,6 +6,7 @@
 
 #if BOOST_UNORDERED_EQUIVALENT_KEYS
 #define BOOST_UNORDERED_TABLE hash_table_equivalent_keys
+#define BOOST_UNORDERED_TABLE_NODE node_equivalent_keys
 #define BOOST_UNORDERED_TABLE_DATA hash_table_data_equivalent_keys
 #define BOOST_UNORDERED_ITERATOR hash_iterator_equivalent_keys
 #define BOOST_UNORDERED_CONST_ITERATOR hash_const_iterator_equivalent_keys
@@ -13,6 +14,7 @@
 #define BOOST_UNORDERED_CONST_LOCAL_ITERATOR hash_const_local_iterator_equivalent_keys
 #else
 #define BOOST_UNORDERED_TABLE hash_table_unique_keys
+#define BOOST_UNORDERED_TABLE_NODE node_unique_keys
 #define BOOST_UNORDERED_TABLE_DATA hash_table_data_unique_keys
 #define BOOST_UNORDERED_ITERATOR hash_iterator_unique_keys
 #define BOOST_UNORDERED_CONST_ITERATOR hash_const_iterator_unique_keys
@@ -23,6 +25,32 @@
 namespace boost {
     namespace unordered_detail {
 
+ template <typename Alloc>
+ struct BOOST_UNORDERED_TABLE_NODE :
+ value_base<BOOST_DEDUCED_TYPENAME allocator_value_type<Alloc>::type>,
+ bucket_impl<Alloc>
+ {
+ typedef BOOST_DEDUCED_TYPENAME bucket_impl<Alloc>::link_ptr link_ptr;
+ typedef BOOST_DEDUCED_TYPENAME allocator_value_type<Alloc>::type value_type;
+
+ typedef BOOST_DEDUCED_TYPENAME
+ boost::unordered_detail::rebind_wrap<Alloc, BOOST_UNORDERED_TABLE_NODE>::type
+ node_allocator;
+
+#if BOOST_UNORDERED_EQUIVALENT_KEYS
+ BOOST_UNORDERED_TABLE_NODE() : group_prev_()
+ {
+ BOOST_UNORDERED_MSVC_RESET_PTR(group_prev_);
+ }
+
+ link_ptr group_prev_;
+#endif
+
+ value_type& value() {
+ return *static_cast<value_type*>(this->address());
+ }
+ };
+
         //
         // Hash Table Data
         //
@@ -34,86 +62,24 @@
         public:
             typedef BOOST_UNORDERED_TABLE_DATA data;
 
- struct node;
- struct bucket;
             typedef std::size_t size_type;
             typedef std::ptrdiff_t difference_type;
 
             typedef Alloc value_allocator;
 
- typedef BOOST_DEDUCED_TYPENAME
- boost::unordered_detail::rebind_wrap<Alloc, node>::type
- node_allocator;
- typedef BOOST_DEDUCED_TYPENAME
- boost::unordered_detail::rebind_wrap<Alloc, bucket>::type
- bucket_allocator;
+ typedef bucket_impl<Alloc> bucket;
+ typedef BOOST_DEDUCED_TYPENAME bucket::bucket_allocator bucket_allocator;
+ typedef BOOST_DEDUCED_TYPENAME bucket::bucket_ptr bucket_ptr;
+ typedef BOOST_DEDUCED_TYPENAME bucket::link_ptr link_ptr;
+
+ typedef BOOST_UNORDERED_TABLE_NODE<Alloc> node;
+ typedef BOOST_DEDUCED_TYPENAME node::node_allocator node_allocator;
 
             typedef BOOST_DEDUCED_TYPENAME allocator_value_type<Alloc>::type value_type;
             typedef BOOST_DEDUCED_TYPENAME allocator_pointer<node_allocator>::type node_ptr;
- typedef BOOST_DEDUCED_TYPENAME allocator_pointer<bucket_allocator>::type bucket_ptr;
             typedef BOOST_DEDUCED_TYPENAME allocator_reference<value_allocator>::type reference;
             typedef BOOST_DEDUCED_TYPENAME allocator_reference<bucket_allocator>::type bucket_reference;
 
- typedef bucket_ptr link_ptr;
-
- // Hash Bucket
- //
- // all no throw
-
- struct bucket
- {
- private:
- bucket& operator=(bucket const&);
- public:
- link_ptr next_;
-
- bucket() : next_()
- {
- BOOST_UNORDERED_MSVC_RESET_PTR(next_);
- }
-
- bucket(bucket const& x) : next_(x.next_)
- {
- // Only copy construct when allocating.
- BOOST_ASSERT(!x.next_);
- }
-
- bool empty() const
- {
- return !this->next_;
- }
- };
-
- // Value Base
-
- struct value_base {
- typename boost::aligned_storage<
- sizeof(value_type),
- boost::alignment_of<value_type>::value>::type data_;
-
- void* address() { return this; }
- };
-
- // Hash Node
- //
- // all no throw
-
- struct node : value_base, bucket {
-#if BOOST_UNORDERED_EQUIVALENT_KEYS
- public:
- node() : group_prev_()
- {
- BOOST_UNORDERED_MSVC_RESET_PTR(group_prev_);
- }
-
- link_ptr group_prev_;
-#endif
-
- value_type& value() {
- return *static_cast<value_type*>(this->address());
- }
- };
-
             // allocators
             //
             // Stores all the allocators that we're going to need.
@@ -2325,6 +2291,7 @@
 }
 
 #undef BOOST_UNORDERED_TABLE
+#undef BOOST_UNORDERED_TABLE_NODE
 #undef BOOST_UNORDERED_TABLE_DATA
 #undef BOOST_UNORDERED_ITERATOR
 #undef BOOST_UNORDERED_CONST_ITERATOR


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