Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r80219 - trunk/boost/unordered/detail
From: dnljms_at_[hidden]
Date: 2012-08-25 17:51:25


Author: danieljames
Date: 2012-08-25 17:51:24 EDT (Sat, 25 Aug 2012)
New Revision: 80219
URL: http://svn.boost.org/trac/boost/changeset/80219

Log:
Unordered: Go back to the old method for constructing nodes.

Reverts much of [78349]. Keeps the variadic construct.
Text files modified:
   trunk/boost/unordered/detail/allocate.hpp | 70 -------------------------------
   trunk/boost/unordered/detail/buckets.hpp | 88 +++++++++++++++++----------------------
   trunk/boost/unordered/detail/equivalent.hpp | 49 ---------------------
   trunk/boost/unordered/detail/unique.hpp | 47 --------------------
   4 files changed, 43 insertions(+), 211 deletions(-)

Modified: trunk/boost/unordered/detail/allocate.hpp
==============================================================================
--- trunk/boost/unordered/detail/allocate.hpp (original)
+++ trunk/boost/unordered/detail/allocate.hpp 2012-08-25 17:51:24 EDT (Sat, 25 Aug 2012)
@@ -1106,76 +1106,6 @@
 
     ////////////////////////////////////////////////////////////////////////////
     //
- // construct_node/destroy_node
- //
- // Construct a node using the best available method.
-
-#if BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT
-
- template <typename Alloc, typename T, BOOST_UNORDERED_EMPLACE_TEMPLATE>
- inline void construct_node(Alloc& a, T* p, BOOST_UNORDERED_EMPLACE_ARGS)
- {
- boost::unordered::detail::allocator_traits<Alloc>::construct(
- a, p, BOOST_UNORDERED_EMPLACE_FORWARD);
- }
-
- template <typename Alloc, typename T>
- inline void destroy_node(Alloc& a, T* p)
- {
- boost::unordered::detail::allocator_traits<Alloc>::destroy(a, p);
- }
-
-#else
-
- template <typename AllocTraits, typename T>
- struct value_construct
- {
- typedef BOOST_DEDUCED_TYPENAME AllocTraits::allocator_type allocator;
-
- allocator& alloc;
- T* ptr;
-
- value_construct(allocator& a, T* p) : alloc(a), ptr(p)
- {
- AllocTraits::construct(alloc, ptr, T());
- }
-
- void release()
- {
- ptr = 0;
- }
-
- ~value_construct()
- {
- if (ptr) AllocTraits::destroy(alloc, ptr);
- }
-
- private:
- value_construct(value_construct const&);
- value_construct& operator=(value_construct const&);
- };
-
- template <typename Alloc, typename T, BOOST_UNORDERED_EMPLACE_TEMPLATE>
- inline void construct_node(Alloc& a, T* p, BOOST_UNORDERED_EMPLACE_ARGS)
- {
- value_construct<boost::unordered::detail::allocator_traits<Alloc>, T>
- construct_guard(a, p);
- boost::unordered::detail::construct_impl(
- p->value_ptr(), BOOST_UNORDERED_EMPLACE_FORWARD);
- construct_guard.release();
- }
-
- template <typename Alloc, typename T>
- inline void destroy_node(Alloc& a, T* p)
- {
- boost::unordered::detail::destroy(p->value_ptr());
- boost::unordered::detail::allocator_traits<Alloc>::destroy(a, p);
- }
-
-#endif
-
- ////////////////////////////////////////////////////////////////////////////
- //
     // array_constructor
     //
     // Allocate and construct an array in an exception safe manner, and

Modified: trunk/boost/unordered/detail/buckets.hpp
==============================================================================
--- trunk/boost/unordered/detail/buckets.hpp (original)
+++ trunk/boost/unordered/detail/buckets.hpp 2012-08-25 17:51:24 EDT (Sat, 25 Aug 2012)
@@ -53,14 +53,16 @@
 
         node_allocator& alloc_;
         node_pointer node_;
- bool constructed_;
+ bool node_constructed_;
+ bool value_constructed_;
 
     public:
 
         node_constructor(node_allocator& n) :
             alloc_(n),
             node_(),
- constructed_(false)
+ node_constructed_(false),
+ value_constructed_(false)
         {
         }
 
@@ -71,36 +73,27 @@
         template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
         void construct_value(BOOST_UNORDERED_EMPLACE_ARGS)
         {
- BOOST_ASSERT(node_ && !constructed_);
- boost::unordered::detail::construct_node(alloc_,
- boost::addressof(*node_), BOOST_UNORDERED_EMPLACE_FORWARD);
- node_->init(static_cast<typename node::link_pointer>(node_));
- constructed_ = true;
+ BOOST_ASSERT(node_ && node_constructed_ && !value_constructed_);
+ boost::unordered::detail::construct_impl(
+ node_->value_ptr(), BOOST_UNORDERED_EMPLACE_FORWARD);
+ value_constructed_ = true;
         }
 
         template <typename A0>
         void construct_value2(BOOST_FWD_REF(A0) a0)
         {
- BOOST_ASSERT(node_ && !constructed_);
-
- boost::unordered::detail::construct_node(alloc_,
- boost::addressof(*node_),
+ BOOST_ASSERT(node_ && node_constructed_ && !value_constructed_);
+ boost::unordered::detail::construct_impl(
+ node_->value_ptr(),
                 BOOST_UNORDERED_EMPLACE_ARGS1(boost::forward<A0>(a0)));
-
- constructed_ = true;
- node_->init(static_cast<typename node::link_pointer>(node_));
+ value_constructed_ = true;
         }
 
         value_type const& value() const {
- BOOST_ASSERT(node_ && constructed_);
+ BOOST_ASSERT(node_ && node_constructed_ && value_constructed_);
             return node_->value();
         }
 
- node_pointer get()
- {
- return node_;
- }
-
         // no throw
         node_pointer release()
         {
@@ -118,8 +111,12 @@
     node_constructor<Alloc>::~node_constructor()
     {
         if (node_) {
- if (constructed_) {
- boost::unordered::detail::destroy_node(alloc_,
+ if (value_constructed_) {
+ boost::unordered::detail::destroy(node_->value_ptr());
+ }
+
+ if (node_constructed_) {
+ node_allocator_traits::destroy(alloc_,
                     boost::addressof(*node_));
             }
 
@@ -131,13 +128,24 @@
     void node_constructor<Alloc>::construct_node()
     {
         if(!node_) {
- constructed_ = false;
+ node_constructed_ = false;
+ value_constructed_ = false;
+
             node_ = node_allocator_traits::allocate(alloc_, 1);
+
+ node_allocator_traits::construct(alloc_,
+ boost::addressof(*node_), node());
+ node_->init(static_cast<typename node::link_pointer>(node_));
+ node_constructed_ = true;
         }
- else if (constructed_) {
- boost::unordered::detail::destroy_node(alloc_,
- boost::addressof(*node_));
- constructed_ = false;
+ else {
+ BOOST_ASSERT(node_constructed_);
+
+ if (value_constructed_)
+ {
+ boost::unordered::detail::destroy(node_->value_ptr());
+ value_constructed_ = false;
+ }
         }
     }
 
@@ -175,16 +183,6 @@
 
         enum { extra_node = false };
     };
-
- template <typename LinkPointer>
- struct node_base
- {
- typedef LinkPointer link_pointer;
- link_pointer next_;
-
- node_base() : next_() {}
- };
-
 }}}
 
 namespace boost { namespace unordered { namespace iterator_detail {
@@ -720,14 +718,6 @@
                 node_constructor a(this->node_alloc());
                 a.construct_node();
 
- // Since this node is just to mark the beginning it doesn't
- // contain a value, so just construct node::node_base
- // which containers the pointer to the next element.
- node_allocator_traits::construct(node_alloc(),
- static_cast<typename node::node_base*>(
- boost::addressof(*a.get())),
- typename node::node_base());
-
                 (constructor.get() +
                     static_cast<std::ptrdiff_t>(this->bucket_count_))->next_ =
                         a.release();
@@ -772,8 +762,9 @@
 
         inline void delete_node(c_iterator n)
         {
- boost::unordered::detail::destroy_node(
- node_alloc(), boost::addressof(*n.node_));
+ boost::unordered::detail::destroy(n.node_->value_ptr());
+ node_allocator_traits::destroy(node_alloc(),
+ boost::addressof(*n.node_));
             node_allocator_traits::deallocate(node_alloc(), n.node_, 1);
             --size_;
         }
@@ -795,8 +786,7 @@
         inline void delete_extra_node(bucket_pointer) {}
 
         inline void delete_extra_node(node_pointer n) {
- node_allocator_traits::destroy(node_alloc(),
- static_cast<typename node::node_base*>(boost::addressof(*n)));
+ node_allocator_traits::destroy(node_alloc(), boost::addressof(*n));
             node_allocator_traits::deallocate(node_alloc(), n, 1);
         }
 

Modified: trunk/boost/unordered/detail/equivalent.hpp
==============================================================================
--- trunk/boost/unordered/detail/equivalent.hpp (original)
+++ trunk/boost/unordered/detail/equivalent.hpp 2012-08-25 17:51:24 EDT (Sat, 25 Aug 2012)
@@ -22,44 +22,20 @@
 
     template <typename A, typename T>
     struct grouped_node :
- boost::unordered::detail::node_base<
- typename ::boost::unordered::detail::rebind_wrap<
- A, grouped_node<A, T> >::type::pointer
- >,
         boost::unordered::detail::value_base<T>
     {
         typedef typename ::boost::unordered::detail::rebind_wrap<
             A, grouped_node<A, T> >::type::pointer link_pointer;
- typedef boost::unordered::detail::node_base<link_pointer> node_base;
 
+ link_pointer next_;
         link_pointer group_prev_;
         std::size_t hash_;
 
-#if BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT
- template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
- explicit grouped_node(BOOST_UNORDERED_EMPLACE_ARGS) :
- node_base(),
- group_prev_(),
- hash_(0)
- {
- boost::unordered::detail::construct_impl(
- this->value_ptr(), BOOST_UNORDERED_EMPLACE_FORWARD);
- }
-
- ~grouped_node() {
- boost::unordered::detail::destroy(this->value_ptr());
- }
-
- grouped_node(grouped_node const&) {
- assert(false);
- }
-#else
         grouped_node() :
- node_base(),
+ next_(),
             group_prev_(),
             hash_(0)
         {}
-#endif
 
         void init(link_pointer self)
         {
@@ -76,37 +52,16 @@
         boost::unordered::detail::ptr_bucket
     {
         typedef boost::unordered::detail::ptr_bucket bucket_base;
- typedef bucket_base node_base;
         typedef ptr_bucket* link_pointer;
 
         link_pointer group_prev_;
         std::size_t hash_;
 
-#if BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT
- template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
- explicit grouped_ptr_node(BOOST_UNORDERED_EMPLACE_ARGS) :
- bucket_base(),
- group_prev_(0),
- hash_(0)
- {
- boost::unordered::detail::construct_impl(
- this->value_ptr(), BOOST_UNORDERED_EMPLACE_FORWARD);
- }
-
- ~grouped_ptr_node() {
- boost::unordered::detail::destroy(this->value_ptr());
- }
-
- grouped_ptr_node(grouped_ptr_node const&) {
- assert(false);
- }
-#else
         grouped_ptr_node() :
             bucket_base(),
             group_prev_(0),
             hash_(0)
         {}
-#endif
 
         void init(link_pointer self)
         {

Modified: trunk/boost/unordered/detail/unique.hpp
==============================================================================
--- trunk/boost/unordered/detail/unique.hpp (original)
+++ trunk/boost/unordered/detail/unique.hpp 2012-08-25 17:51:24 EDT (Sat, 25 Aug 2012)
@@ -24,41 +24,18 @@
 
     template <typename A, typename T>
     struct unique_node :
- boost::unordered::detail::node_base<
- typename ::boost::unordered::detail::rebind_wrap<
- A, unique_node<A, T> >::type::pointer
- >,
         boost::unordered::detail::value_base<T>
     {
         typedef typename ::boost::unordered::detail::rebind_wrap<
             A, unique_node<A, T> >::type::pointer link_pointer;
- typedef boost::unordered::detail::node_base<link_pointer> node_base;
 
+ link_pointer next_;
         std::size_t hash_;
 
-#if BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT
- template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
- explicit unique_node(BOOST_UNORDERED_EMPLACE_ARGS) :
- node_base(),
- hash_(0)
- {
- boost::unordered::detail::construct_impl(
- this->value_ptr(), BOOST_UNORDERED_EMPLACE_FORWARD);
- }
-
- ~unique_node() {
- boost::unordered::detail::destroy(this->value_ptr());
- }
-
- unique_node(unique_node const&) {
- BOOST_ASSERT(false);
- }
-#else
         unique_node() :
- node_base(),
+ next_(),
             hash_(0)
         {}
-#endif
 
         void init(link_pointer)
         {
@@ -74,34 +51,14 @@
         boost::unordered::detail::ptr_bucket
     {
         typedef boost::unordered::detail::ptr_bucket bucket_base;
- typedef bucket_base node_base;
         typedef ptr_bucket* link_pointer;
 
         std::size_t hash_;
 
-#if BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT
- template <BOOST_UNORDERED_EMPLACE_TEMPLATE>
- explicit ptr_node(BOOST_UNORDERED_EMPLACE_ARGS) :
- bucket_base(),
- hash_(0)
- {
- boost::unordered::detail::construct_impl(
- this->value_ptr(), BOOST_UNORDERED_EMPLACE_FORWARD);
- }
-
- ~ptr_node() {
- boost::unordered::detail::destroy(this->value_ptr());
- }
-
- ptr_node(ptr_node const&) {
- BOOST_ASSERT(false);
- }
-#else
         ptr_node() :
             bucket_base(),
             hash_(0)
         {}
-#endif
 
         void init(link_pointer)
         {


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