Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r76179 - in branches/release/boost: container container/allocator container/detail intrusive intrusive/detail move
From: igaztanaga_at_[hidden]
Date: 2011-12-26 12:10:32


Author: igaztanaga
Date: 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
New Revision: 76179
URL: http://svn.boost.org/trac/boost/changeset/76179

Log:
Changes for 1.49
Added:
   branches/release/boost/container/allocator/
      - copied from r76178, /trunk/boost/container/allocator/
   branches/release/boost/container/container_fwd.hpp
      - copied unchanged from r76178, /trunk/boost/container/container_fwd.hpp
   branches/release/boost/container/deque.hpp
      - copied unchanged from r76178, /trunk/boost/container/deque.hpp
   branches/release/boost/container/detail/ (props changed)
      - copied from r76178, /trunk/boost/container/detail/
   branches/release/boost/container/flat_map.hpp
      - copied unchanged from r76178, /trunk/boost/container/flat_map.hpp
   branches/release/boost/container/flat_set.hpp
      - copied unchanged from r76178, /trunk/boost/container/flat_set.hpp
   branches/release/boost/container/list.hpp
      - copied unchanged from r76178, /trunk/boost/container/list.hpp
   branches/release/boost/container/map.hpp
      - copied unchanged from r76178, /trunk/boost/container/map.hpp
   branches/release/boost/container/set.hpp
      - copied unchanged from r76178, /trunk/boost/container/set.hpp
   branches/release/boost/container/slist.hpp
      - copied unchanged from r76178, /trunk/boost/container/slist.hpp
   branches/release/boost/container/stable_vector.hpp
      - copied unchanged from r76178, /trunk/boost/container/stable_vector.hpp
   branches/release/boost/container/string.hpp
      - copied unchanged from r76178, /trunk/boost/container/string.hpp
   branches/release/boost/container/vector.hpp
      - copied unchanged from r76178, /trunk/boost/container/vector.hpp
   branches/release/boost/intrusive/detail/has_member_function_callable_with.hpp
      - copied unchanged from r76178, /trunk/boost/intrusive/detail/has_member_function_callable_with.hpp
   branches/release/boost/intrusive/detail/memory_util.hpp
      - copied unchanged from r76178, /trunk/boost/intrusive/detail/memory_util.hpp
   branches/release/boost/intrusive/detail/preprocessor.hpp
      - copied unchanged from r76178, /trunk/boost/intrusive/detail/preprocessor.hpp
   branches/release/boost/intrusive/pointer_traits.hpp
      - copied unchanged from r76178, /trunk/boost/intrusive/pointer_traits.hpp
Removed:
   branches/release/boost/intrusive/detail/pointer_to_other.hpp
Properties modified:
   branches/release/boost/intrusive/ (props changed)
Text files modified:
   branches/release/boost/intrusive/any_hook.hpp | 10
   branches/release/boost/intrusive/avltree.hpp | 118 ++++++------
   branches/release/boost/intrusive/avltree_algorithms.hpp | 104 +++++-----
   branches/release/boost/intrusive/circular_list_algorithms.hpp | 56 +++--
   branches/release/boost/intrusive/circular_slist_algorithms.hpp | 44 ++--
   branches/release/boost/intrusive/derivation_value_traits.hpp | 10
   branches/release/boost/intrusive/detail/any_node_and_algorithms.hpp | 145 +++++++--------
   branches/release/boost/intrusive/detail/avltree_node.hpp | 68 ++++---
   branches/release/boost/intrusive/detail/common_slist_algorithms.hpp | 24 +-
   branches/release/boost/intrusive/detail/function_detector.hpp | 1
   branches/release/boost/intrusive/detail/generic_hook.hpp | 22 +
   branches/release/boost/intrusive/detail/hashtable_node.hpp | 51 +++--
   branches/release/boost/intrusive/detail/list_node.hpp | 38 ++--
   branches/release/boost/intrusive/detail/rbtree_node.hpp | 62 +++---
   branches/release/boost/intrusive/detail/slist_node.hpp | 28 +-
   branches/release/boost/intrusive/detail/tree_algorithms.hpp | 230 +++++++++++++------------
   branches/release/boost/intrusive/detail/tree_node.hpp | 38 ++--
   branches/release/boost/intrusive/detail/utilities.hpp | 280 +++++++++++++++++++++++-------
   branches/release/boost/intrusive/detail/workaround.hpp | 18 -
   branches/release/boost/intrusive/hashtable.hpp | 356 +++++++++++++++++++++++++--------------
   branches/release/boost/intrusive/linear_slist_algorithms.hpp | 48 ++--
   branches/release/boost/intrusive/list.hpp | 28 +-
   branches/release/boost/intrusive/member_value_traits.hpp | 31 ++-
   branches/release/boost/intrusive/rbtree.hpp | 105 +++++-----
   branches/release/boost/intrusive/rbtree_algorithms.hpp | 107 ++++++-----
   branches/release/boost/intrusive/sgtree.hpp | 107 ++++++-----
   branches/release/boost/intrusive/sgtree_algorithms.hpp | 89 ++++-----
   branches/release/boost/intrusive/slist.hpp | 58 +++---
   branches/release/boost/intrusive/splaytree.hpp | 108 ++++++-----
   branches/release/boost/intrusive/splaytree_algorithms.hpp | 147 ++++++++--------
   branches/release/boost/intrusive/treap.hpp | 118 ++++++------
   branches/release/boost/intrusive/treap_algorithms.hpp | 99 +++++-----
   branches/release/boost/intrusive/trivial_value_traits.hpp | 11
   branches/release/boost/intrusive/unordered_set_hook.hpp | 59 +++---
   branches/release/boost/move/move.hpp | 113 ++++++++++++
   35 files changed, 1656 insertions(+), 1275 deletions(-)

Modified: branches/release/boost/intrusive/any_hook.hpp
==============================================================================
--- branches/release/boost/intrusive/any_hook.hpp (original)
+++ branches/release/boost/intrusive/any_hook.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -19,7 +19,7 @@
 #include <boost/intrusive/detail/any_node_and_algorithms.hpp>
 #include <boost/intrusive/options.hpp>
 #include <boost/intrusive/detail/generic_hook.hpp>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 
 namespace boost {
 namespace intrusive {
@@ -244,15 +244,15 @@
 template<class ValueTraits>
 struct any_to_get_base_pointer_type
 {
- typedef typename pointer_to_other
- <typename ValueTraits::boost_intrusive_tags::node_traits::node_ptr, void>::type type;
+ typedef typename pointer_traits<typename ValueTraits::boost_intrusive_tags::node_traits::node_ptr>::template
+ rebind_pointer<void>::type type;
 };
 
 template<class ValueTraits>
 struct any_to_get_member_pointer_type
 {
- typedef typename pointer_to_other
- <typename ValueTraits::node_ptr, void>::type type;
+ typedef typename pointer_traits
+ <typename ValueTraits::node_ptr>::template rebind_pointer<void>::type type;
 };
 
 //!This option setter specifies that the container

Modified: branches/release/boost/intrusive/avltree.hpp
==============================================================================
--- branches/release/boost/intrusive/avltree.hpp (original)
+++ branches/release/boost/intrusive/avltree.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -27,9 +27,11 @@
 #include <boost/intrusive/detail/tree_node.hpp>
 #include <boost/intrusive/detail/ebo_functor_holder.hpp>
 #include <boost/intrusive/detail/mpl.hpp>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/detail/clear_on_destructor_base.hpp>
 #include <boost/intrusive/options.hpp>
+#include <boost/intrusive/detail/utilities.hpp>
 #include <boost/intrusive/avltree_algorithms.hpp>
 #include <boost/intrusive/link_mode.hpp>
 #include <boost/move/move.hpp>
@@ -96,24 +98,30 @@
    /// @endcond
    typedef typename real_value_traits::pointer pointer;
    typedef typename real_value_traits::const_pointer const_pointer;
- typedef typename std::iterator_traits<pointer>::value_type value_type;
+ typedef typename boost::intrusive::
+ pointer_traits<pointer>::element_type value_type;
    typedef value_type key_type;
- typedef typename std::iterator_traits<pointer>::reference reference;
- typedef typename std::iterator_traits<const_pointer>::reference const_reference;
- typedef typename std::iterator_traits<pointer>::difference_type difference_type;
+ typedef typename boost::intrusive::
+ pointer_traits<pointer>::reference reference;
+ typedef typename boost::intrusive::
+ pointer_traits<const_pointer>::reference const_reference;
+ typedef typename boost::intrusive::
+ pointer_traits<pointer>::difference_type difference_type;
    typedef typename Config::size_type size_type;
    typedef typename Config::compare value_compare;
    typedef value_compare key_compare;
- typedef tree_iterator<avltree_impl, false> iterator;
- typedef tree_iterator<avltree_impl, true> const_iterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef tree_iterator<avltree_impl, false> iterator;
+ typedef tree_iterator<avltree_impl, true> const_iterator;
+ typedef boost::intrusive::detail::reverse_iterator<iterator> reverse_iterator;
+ typedef boost::intrusive::detail::reverse_iterator<const_iterator>const_reverse_iterator;
    typedef typename real_value_traits::node_traits node_traits;
    typedef typename node_traits::node node;
- typedef typename boost::pointer_to_other
- <pointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <node_ptr, const node>::type const_node_ptr;
+ typedef typename pointer_traits
+ <pointer>::template rebind_pointer
+ <node>::type node_ptr;
+ typedef typename pointer_traits
+ <pointer>::template rebind_pointer
+ <const node>::type const_node_ptr;
    typedef avltree_algorithms<node_traits> node_algorithms;
 
    static const bool constant_time_size = Config::constant_time_size;
@@ -165,16 +173,14 @@
    value_traits &priv_value_traits()
    { return data_; }
 
- const node &priv_header() const
- { return data_.node_plus_pred_.header_plus_size_.header_; }
+ node_ptr priv_header_ptr()
+ { return pointer_traits<node_ptr>::pointer_to(data_.node_plus_pred_.header_plus_size_.header_); }
 
- node &priv_header()
- { return data_.node_plus_pred_.header_plus_size_.header_; }
+ const_node_ptr priv_header_ptr() const
+ { return pointer_traits<const_node_ptr>::pointer_to(data_.node_plus_pred_.header_plus_size_.header_); }
 
- static node_ptr uncast(const_node_ptr ptr)
- {
- return node_ptr(const_cast<node*>(detail::boost_intrusive_get_pointer(ptr)));
- }
+ static node_ptr uncast(const const_node_ptr & ptr)
+ { return pointer_traits<node_ptr>::const_cast_from(ptr); }
 
    size_traits &priv_size_traits()
    { return data_.node_plus_pred_.header_plus_size_; }
@@ -217,7 +223,7 @@
                , const value_traits &v_traits = value_traits())
       : data_(cmp, v_traits)
    {
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
       this->priv_size_traits().set_size(size_type(0));
    }
 
@@ -239,7 +245,7 @@
               , const value_traits &v_traits = value_traits())
       : data_(cmp, v_traits)
    {
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
       this->priv_size_traits().set_size(size_type(0));
       if(unique)
          this->insert_unique(b, e);
@@ -252,7 +258,7 @@
    avltree_impl(BOOST_RV_REF(avltree_impl) x)
       : data_(::boost::move(x.priv_comp()), ::boost::move(x.priv_value_traits()))
    {
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
       this->priv_size_traits().set_size(size_type(0));
       this->swap(x);
    }
@@ -278,7 +284,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    iterator begin()
- { return iterator (node_traits::get_left(node_ptr(&priv_header())), this); }
+ { return iterator (node_traits::get_left(this->priv_header_ptr()), this); }
 
    //! <b>Effects</b>: Returns a const_iterator pointing to the beginning of the tree.
    //!
@@ -294,7 +300,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    const_iterator cbegin() const
- { return const_iterator (node_traits::get_left(const_node_ptr(&priv_header())), this); }
+ { return const_iterator (node_traits::get_left(this->priv_header_ptr()), this); }
 
    //! <b>Effects</b>: Returns an iterator pointing to the end of the tree.
    //!
@@ -302,7 +308,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    iterator end()
- { return iterator (node_ptr(&priv_header()), this); }
+ { return iterator (this->priv_header_ptr(), this); }
 
    //! <b>Effects</b>: Returns a const_iterator pointing to the end of the tree.
    //!
@@ -318,7 +324,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    const_iterator cend() const
- { return const_iterator (uncast(const_node_ptr(&priv_header())), this); }
+ { return const_iterator (uncast(this->priv_header_ptr()), this); }
 
    //! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning of the
    //! reversed tree.
@@ -432,7 +438,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    bool empty() const
- { return node_algorithms::unique(const_node_ptr(&priv_header())); }
+ { return node_algorithms::unique(this->priv_header_ptr()); }
 
    //! <b>Effects</b>: Returns the number of elements stored in the tree.
    //!
@@ -445,7 +451,7 @@
       if(constant_time_size)
          return this->priv_size_traits().get_size();
       else{
- return (size_type)node_algorithms::size(const_node_ptr(&priv_header()));
+ return (size_type)node_algorithms::size(this->priv_header_ptr());
       }
    }
 
@@ -460,7 +466,7 @@
       using std::swap;
       swap(priv_comp(), priv_comp());
       //These can't throw
- node_algorithms::swap_tree(node_ptr(&priv_header()), node_ptr(&other.priv_header()));
+ node_algorithms::swap_tree(this->priv_header_ptr(), other.priv_header_ptr());
       if(constant_time_size){
          size_type backup = this->priv_size_traits().get_size();
          this->priv_size_traits().set_size(other.priv_size_traits().get_size());
@@ -487,7 +493,7 @@
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       iterator ret(node_algorithms::insert_equal_upper_bound
- (node_ptr(&priv_header()), to_insert, key_node_comp), this);
+ (this->priv_header_ptr(), to_insert, key_node_comp), this);
       this->priv_size_traits().increment();
       return ret;
    }
@@ -514,7 +520,7 @@
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       iterator ret(node_algorithms::insert_equal
- (node_ptr(&priv_header()), hint.pointed_node(), to_insert, key_node_comp), this);
+ (this->priv_header_ptr(), hint.pointed_node(), to_insert, key_node_comp), this);
       this->priv_size_traits().increment();
       return ret;
    }
@@ -650,7 +656,7 @@
          comp(key_value_comp, this);
       std::pair<node_ptr, bool> ret =
          (node_algorithms::insert_unique_check
- (node_ptr(&priv_header()), key, comp, commit_data));
+ (this->priv_header_ptr(), key, comp, commit_data));
       return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
    }
 
@@ -695,7 +701,7 @@
          comp(key_value_comp, this);
       std::pair<node_ptr, bool> ret =
          (node_algorithms::insert_unique_check
- (node_ptr(&priv_header()), hint.pointed_node(), key, comp, commit_data));
+ (this->priv_header_ptr(), hint.pointed_node(), key, comp, commit_data));
       return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
    }
 
@@ -722,7 +728,7 @@
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       node_algorithms::insert_unique_commit
- (node_ptr(&priv_header()), to_insert, commit_data);
+ (this->priv_header_ptr(), to_insert, commit_data);
       this->priv_size_traits().increment();
       return iterator(to_insert, this);
    }
@@ -747,7 +753,7 @@
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       iterator ret(node_algorithms::insert_before
- (node_ptr(&priv_header()), pos.pointed_node(), to_insert), this);
+ (this->priv_header_ptr(), pos.pointed_node(), to_insert), this);
       this->priv_size_traits().increment();
       return ret;
    }
@@ -771,7 +777,7 @@
       node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
- node_algorithms::push_back(node_ptr(&priv_header()), to_insert);
+ node_algorithms::push_back(this->priv_header_ptr(), to_insert);
       this->priv_size_traits().increment();
    }
 
@@ -794,7 +800,7 @@
       node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
- node_algorithms::push_front(node_ptr(&priv_header()), to_insert);
+ node_algorithms::push_front(this->priv_header_ptr(), to_insert);
       this->priv_size_traits().increment();
    }
 
@@ -813,7 +819,7 @@
       node_ptr to_erase(i.pointed_node());
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!node_algorithms::unique(to_erase));
- node_algorithms::erase(&priv_header(), to_erase);
+ node_algorithms::erase(this->priv_header_ptr(), to_erase);
       this->priv_size_traits().decrement();
       if(safemode_or_autounlink)
          node_algorithms::init(to_erase);
@@ -975,7 +981,7 @@
          this->clear_and_dispose(detail::null_disposer());
       }
       else{
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
          this->priv_size_traits().set_size(0);
       }
    }
@@ -992,9 +998,9 @@
    template<class Disposer>
    void clear_and_dispose(Disposer disposer)
    {
- node_algorithms::clear_and_dispose(node_ptr(&priv_header())
+ node_algorithms::clear_and_dispose(this->priv_header_ptr()
          , detail::node_disposer<Disposer, avltree_impl>(disposer, this));
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
       this->priv_size_traits().set_size(0);
    }
 
@@ -1050,7 +1056,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, avltree_impl>
          key_node_comp(comp, this);
       return iterator(node_algorithms::lower_bound
- (const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Returns a const iterator to the first element whose
@@ -1065,7 +1071,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, avltree_impl>
          key_node_comp(comp, this);
       return const_iterator(node_algorithms::lower_bound
- (const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Returns an iterator to the first element whose
@@ -1090,7 +1096,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, avltree_impl>
          key_node_comp(comp, this);
       return iterator(node_algorithms::upper_bound
- (const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Returns an iterator to the first element whose
@@ -1115,7 +1121,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, avltree_impl>
          key_node_comp(comp, this);
       return const_iterator(node_algorithms::upper_bound
- (const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Finds an iterator to the first element whose key is
@@ -1139,7 +1145,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, avltree_impl>
          key_node_comp(comp, this);
       return iterator
- (node_algorithms::find(const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (node_algorithms::find(this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Finds a const_iterator to the first element whose key is
@@ -1163,7 +1169,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, avltree_impl>
          key_node_comp(comp, this);
       return const_iterator
- (node_algorithms::find(const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (node_algorithms::find(this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Finds a range containing all elements whose key is k or
@@ -1189,7 +1195,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, avltree_impl>
          key_node_comp(comp, this);
       std::pair<node_ptr, node_ptr> ret
- (node_algorithms::equal_range(const_node_ptr(&priv_header()), key, key_node_comp));
+ (node_algorithms::equal_range(this->priv_header_ptr(), key, key_node_comp));
       return std::pair<iterator, iterator>(iterator(ret.first, this), iterator(ret.second, this));
    }
 
@@ -1218,7 +1224,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, avltree_impl>
          key_node_comp(comp, this);
       std::pair<node_ptr, node_ptr> ret
- (node_algorithms::equal_range(const_node_ptr(&priv_header()), key, key_node_comp));
+ (node_algorithms::equal_range(this->priv_header_ptr(), key, key_node_comp));
       return std::pair<const_iterator, const_iterator>(const_iterator(ret.first, this), const_iterator(ret.second, this));
    }
 
@@ -1244,8 +1250,8 @@
          detail::exception_disposer<avltree_impl, Disposer>
             rollback(*this, disposer);
          node_algorithms::clone
- (const_node_ptr(&src.priv_header())
- ,node_ptr(&this->priv_header())
+ (src.priv_header_ptr()
+ ,this->priv_header_ptr()
             ,detail::node_cloner<Cloner, avltree_impl>(cloner, this)
             ,detail::node_disposer<Disposer, avltree_impl>(disposer, this));
          this->priv_size_traits().set_size(src.priv_size_traits().get_size());
@@ -1267,7 +1273,7 @@
    pointer unlink_leftmost_without_rebalance()
    {
       node_ptr to_be_disposed(node_algorithms::unlink_leftmost_without_rebalance
- (node_ptr(&priv_header())));
+ (this->priv_header_ptr()));
       if(!to_be_disposed)
          return 0;
       this->priv_size_traits().decrement();
@@ -1293,7 +1299,7 @@
    void replace_node(iterator replace_this, reference with_this)
    {
       node_algorithms::replace_node( get_real_value_traits().to_node_ptr(*replace_this)
- , node_ptr(&priv_header())
+ , this->priv_header_ptr()
                                    , get_real_value_traits().to_node_ptr(with_this));
       if(safemode_or_autounlink)
          node_algorithms::init(replace_this.pointed_node());
@@ -1424,7 +1430,7 @@
    static avltree_impl &priv_container_from_end_iterator(const const_iterator &end_iterator)
    {
       header_plus_size *r = detail::parent_from_member<header_plus_size, node>
- ( detail::boost_intrusive_get_pointer(end_iterator.pointed_node()), &header_plus_size::header_);
+ ( boost::intrusive::detail::to_raw_pointer(end_iterator.pointed_node()), &header_plus_size::header_);
       node_plus_pred_t *n = detail::parent_from_member
          <node_plus_pred_t, header_plus_size>(r, &node_plus_pred_t::header_plus_size_);
       data_t *d = detail::parent_from_member<data_t, node_plus_pred_t>(n, &data_t::node_plus_pred_);

Modified: branches/release/boost/intrusive/avltree_algorithms.hpp
==============================================================================
--- branches/release/boost/intrusive/avltree_algorithms.hpp (original)
+++ branches/release/boost/intrusive/avltree_algorithms.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -22,6 +22,7 @@
 #include <boost/intrusive/detail/assert.hpp>
 #include <boost/intrusive/detail/utilities.hpp>
 #include <boost/intrusive/detail/tree_algorithms.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 
 
 namespace boost {
@@ -88,7 +89,7 @@
          : base_t(f)
       {}
       
- node_ptr operator()(node_ptr p)
+ node_ptr operator()(const node_ptr &p)
       {
          node_ptr n = base_t::get()(p);
          NodeTraits::set_balance(n, NodeTraits::get_balance(p));
@@ -98,21 +99,19 @@
 
    struct avltree_erase_fixup
    {
- void operator()(node_ptr to_erase, node_ptr successor)
+ void operator()(const node_ptr &to_erase, const node_ptr &successor)
       { NodeTraits::set_balance(successor, NodeTraits::get_balance(to_erase)); }
    };
 
- static node_ptr uncast(const_node_ptr ptr)
- {
- return node_ptr(const_cast<node*>(::boost::intrusive::detail::boost_intrusive_get_pointer(ptr)));
- }
+ static node_ptr uncast(const const_node_ptr & ptr)
+ { return pointer_traits<node_ptr>::const_cast_from(ptr); }
    /// @endcond
 
    public:
- static node_ptr begin_node(const_node_ptr header)
+ static node_ptr begin_node(const const_node_ptr & header)
    { return tree_algorithms::begin_node(header); }
 
- static node_ptr end_node(const_node_ptr header)
+ static node_ptr end_node(const const_node_ptr & header)
    { return tree_algorithms::end_node(header); }
 
    //! This type is the information that will be
@@ -128,7 +127,7 @@
    //! <b>Complexity</b>: Constant.
    //!
    //! <b>Throws</b>: Nothing.
- static void swap_tree(node_ptr header1, node_ptr header2)
+ static void swap_tree(const node_ptr & header1, const node_ptr & header2)
    { return tree_algorithms::swap_tree(header1, header2); }
 
    //! <b>Requires</b>: node1 and node2 can't be header nodes
@@ -146,7 +145,7 @@
    //! node1 and node2 are not equivalent according to the ordering rules.
    //!
    //!Experimental function
- static void swap_nodes(node_ptr node1, node_ptr node2)
+ static void swap_nodes(const node_ptr & node1, const node_ptr & node2)
    {
       if(node1 == node2)
          return;
@@ -170,7 +169,7 @@
    //! node1 and node2 are not equivalent according to the ordering rules.
    //!
    //!Experimental function
- static void swap_nodes(node_ptr node1, node_ptr header1, node_ptr node2, node_ptr header2)
+ static void swap_nodes(const node_ptr & node1, const node_ptr & header1, const node_ptr & node2, const node_ptr & header2)
    {
       if(node1 == node2) return;
 
@@ -197,7 +196,7 @@
    //! the node, since no rebalancing and comparison is needed.
    //!
    //!Experimental function
- static void replace_node(node_ptr node_to_be_replaced, node_ptr new_node)
+ static void replace_node(const node_ptr & node_to_be_replaced, const node_ptr & new_node)
    {
       if(node_to_be_replaced == new_node)
          return;
@@ -220,7 +219,7 @@
    //! the node, since no rebalancing or comparison is needed.
    //!
    //!Experimental function
- static void replace_node(node_ptr node_to_be_replaced, node_ptr header, node_ptr new_node)
+ static void replace_node(const node_ptr & node_to_be_replaced, const node_ptr & header, const node_ptr & new_node)
    {
       tree_algorithms::replace_node(node_to_be_replaced, header, new_node);
       NodeTraits::set_balance(new_node, NodeTraits::get_balance(node_to_be_replaced));
@@ -233,7 +232,7 @@
    //! <b>Complexity</b>: Average complexity is constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static void unlink(node_ptr node)
+ static void unlink(const node_ptr & node)
    {
       node_ptr x = NodeTraits::get_parent(node);
       if(x){
@@ -256,7 +255,7 @@
    //! only be used for more unlink_leftmost_without_rebalance calls.
    //! This function is normally used to achieve a step by step
    //! controlled destruction of the tree.
- static node_ptr unlink_leftmost_without_rebalance(node_ptr header)
+ static node_ptr unlink_leftmost_without_rebalance(const node_ptr & header)
    { return tree_algorithms::unlink_leftmost_without_rebalance(header); }
 
    //! <b>Requires</b>: node is a node of the tree or an node initialized
@@ -267,7 +266,7 @@
    //! <b>Complexity</b>: Constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static bool unique(const_node_ptr node)
+ static bool unique(const const_node_ptr & node)
    { return tree_algorithms::unique(node); }
 
    //! <b>Requires</b>: node is a node of the tree but it's not the header.
@@ -277,7 +276,7 @@
    //! <b>Complexity</b>: Linear time.
    //!
    //! <b>Throws</b>: Nothing.
- static std::size_t count(const_node_ptr node)
+ static std::size_t count(const const_node_ptr & node)
    { return tree_algorithms::count(node); }
 
    //! <b>Requires</b>: header is the header node of the tree.
@@ -287,7 +286,7 @@
    //! <b>Complexity</b>: Linear time.
    //!
    //! <b>Throws</b>: Nothing.
- static std::size_t size(const_node_ptr header)
+ static std::size_t size(const const_node_ptr & header)
    { return tree_algorithms::size(header); }
 
    //! <b>Requires</b>: p is a node from the tree except the header.
@@ -297,7 +296,7 @@
    //! <b>Complexity</b>: Average constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr next_node(node_ptr p)
+ static node_ptr next_node(const node_ptr & p)
    { return tree_algorithms::next_node(p); }
 
    //! <b>Requires</b>: p is a node from the tree except the leftmost node.
@@ -307,7 +306,7 @@
    //! <b>Complexity</b>: Average constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr prev_node(node_ptr p)
+ static node_ptr prev_node(const node_ptr & p)
    { return tree_algorithms::prev_node(p); }
 
    //! <b>Requires</b>: node must not be part of any tree.
@@ -319,7 +318,7 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Nodes</b>: If node is inserted in a tree, this function corrupts the tree.
- static void init(node_ptr node)
+ static void init(const node_ptr & node)
    { tree_algorithms::init(node); }
 
    //! <b>Requires</b>: node must not be part of any tree.
@@ -332,7 +331,7 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Nodes</b>: If node is inserted in a tree, this function corrupts the tree.
- static void init_header(node_ptr header)
+ static void init_header(const node_ptr & header)
    {
       tree_algorithms::init_header(header);
       NodeTraits::set_balance(header, NodeTraits::zero());
@@ -346,7 +345,7 @@
    //! <b>Complexity</b>: Amortized constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr erase(node_ptr header, node_ptr z)
+ static node_ptr erase(const node_ptr & header, const node_ptr & z)
    {
       typename tree_algorithms::data_for_rebalance info;
       tree_algorithms::erase(header, z, avltree_erase_fixup(), info);
@@ -363,13 +362,13 @@
    //! take a node_ptr and shouldn't throw.
    //!
    //! <b>Effects</b>: First empties target tree calling
- //! <tt>void disposer::operator()(node_ptr)</tt> for every node of the tree
+ //! <tt>void disposer::operator()(const node_ptr &)</tt> for every node of the tree
    //! except the header.
    //!
    //! Then, duplicates the entire tree pointed by "source_header" cloning each
- //! source node with <tt>node_ptr Cloner::operator()(node_ptr)</tt> to obtain
+ //! source node with <tt>node_ptr Cloner::operator()(const node_ptr &)</tt> to obtain
    //! the nodes of the target tree. If "cloner" throws, the cloned target nodes
- //! are disposed using <tt>void disposer(node_ptr)</tt>.
+ //! are disposed using <tt>void disposer(const node_ptr &)</tt>.
    //!
    //! <b>Complexity</b>: Linear to the number of element of the source tree plus the.
    //! number of elements of tree target tree when calling this function.
@@ -377,7 +376,7 @@
    //! <b>Throws</b>: If cloner functor throws. If this happens target nodes are disposed.
    template <class Cloner, class Disposer>
    static void clone
- (const_node_ptr source_header, node_ptr target_header, Cloner cloner, Disposer disposer)
+ (const const_node_ptr & source_header, const node_ptr & target_header, Cloner cloner, Disposer disposer)
    {
       avltree_node_cloner<Cloner> new_cloner(cloner);
       tree_algorithms::clone(source_header, target_header, new_cloner, disposer);
@@ -387,7 +386,7 @@
    //! taking a node_ptr parameter and shouldn't throw.
    //!
    //! <b>Effects</b>: Empties the target tree calling
- //! <tt>void disposer::operator()(node_ptr)</tt> for every node of the tree
+ //! <tt>void disposer::operator()(const node_ptr &)</tt> for every node of the tree
    //! except the header.
    //!
    //! <b>Complexity</b>: Linear to the number of element of the source tree plus the.
@@ -395,7 +394,7 @@
    //!
    //! <b>Throws</b>: If cloner functor throws. If this happens target nodes are disposed.
    template<class Disposer>
- static void clear_and_dispose(node_ptr header, Disposer disposer)
+ static void clear_and_dispose(const node_ptr & header, Disposer disposer)
    { tree_algorithms::clear_and_dispose(header, disposer); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -412,7 +411,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static node_ptr lower_bound
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    { return tree_algorithms::lower_bound(header, key, comp); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -428,7 +427,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static node_ptr upper_bound
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    { return tree_algorithms::upper_bound(header, key, comp); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -444,7 +443,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static node_ptr find
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    { return tree_algorithms::find(header, key, comp); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -462,7 +461,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static std::pair<node_ptr, node_ptr> equal_range
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    { return tree_algorithms::equal_range(header, key, comp); }
 
    //! <b>Requires</b>: "h" must be the header node of a tree.
@@ -479,7 +478,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class NodePtrCompare>
    static node_ptr insert_equal_upper_bound
- (node_ptr h, node_ptr new_node, NodePtrCompare comp)
+ (const node_ptr & h, const node_ptr & new_node, NodePtrCompare comp)
    {
       tree_algorithms::insert_equal_upper_bound(h, new_node, comp);
       rebalance_after_insertion(h, new_node);
@@ -500,7 +499,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class NodePtrCompare>
    static node_ptr insert_equal_lower_bound
- (node_ptr h, node_ptr new_node, NodePtrCompare comp)
+ (const node_ptr & h, const node_ptr & new_node, NodePtrCompare comp)
    {
       tree_algorithms::insert_equal_lower_bound(h, new_node, comp);
       rebalance_after_insertion(h, new_node);
@@ -523,7 +522,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class NodePtrCompare>
    static node_ptr insert_equal
- (node_ptr header, node_ptr hint, node_ptr new_node, NodePtrCompare comp)
+ (const node_ptr & header, const node_ptr & hint, const node_ptr & new_node, NodePtrCompare comp)
    {
       tree_algorithms::insert_equal(header, hint, new_node, comp);
       rebalance_after_insertion(header, new_node);
@@ -545,7 +544,7 @@
    //! <b>Note</b>: If "pos" is not the successor of the newly inserted "new_node"
    //! tree invariants might be broken.
    static node_ptr insert_before
- (node_ptr header, node_ptr pos, node_ptr new_node)
+ (const node_ptr & header, const node_ptr & pos, const node_ptr & new_node)
    {
       tree_algorithms::insert_before(header, pos, new_node);
       rebalance_after_insertion(header, new_node);
@@ -565,7 +564,7 @@
    //! <b>Note</b>: If "new_node" is less than the greatest inserted key
    //! tree invariants are broken. This function is slightly faster than
    //! using "insert_before".
- static void push_back(node_ptr header, node_ptr new_node)
+ static void push_back(const node_ptr & header, const node_ptr & new_node)
    {
       tree_algorithms::push_back(header, new_node);
       rebalance_after_insertion(header, new_node);
@@ -584,7 +583,7 @@
    //! <b>Note</b>: If "new_node" is greater than the lowest inserted key
    //! tree invariants are broken. This function is slightly faster than
    //! using "insert_before".
- static void push_front(node_ptr header, node_ptr new_node)
+ static void push_front(const node_ptr & header, const node_ptr & new_node)
    {
       tree_algorithms::push_front(header, new_node);
       rebalance_after_insertion(header, new_node);
@@ -626,7 +625,7 @@
    //! if no more objects are inserted or erased from the set.
    template<class KeyType, class KeyNodePtrCompare>
    static std::pair<node_ptr, bool> insert_unique_check
- (const_node_ptr header, const KeyType &key
+ (const const_node_ptr & header, const KeyType &key
       ,KeyNodePtrCompare comp, insert_commit_data &commit_data)
    { return tree_algorithms::insert_unique_check(header, key, comp, commit_data); }
 
@@ -671,7 +670,7 @@
    //! if no more objects are inserted or erased from the set.
    template<class KeyType, class KeyNodePtrCompare>
    static std::pair<node_ptr, bool> insert_unique_check
- (const_node_ptr header, node_ptr hint, const KeyType &key
+ (const const_node_ptr & header, const node_ptr &hint, const KeyType &key
       ,KeyNodePtrCompare comp, insert_commit_data &commit_data)
    { return tree_algorithms::insert_unique_check(header, hint, key, comp, commit_data); }
 
@@ -693,7 +692,7 @@
    //! previously executed to fill "commit_data". No value should be inserted or
    //! erased between the "insert_check" and "insert_commit" calls.
    static void insert_unique_commit
- (node_ptr header, node_ptr new_value, const insert_commit_data &commit_data)
+ (const node_ptr & header, const node_ptr & new_value, const insert_commit_data &commit_data)
    {
       tree_algorithms::insert_unique_commit(header, new_value, commit_data);
       rebalance_after_insertion(header, new_value);
@@ -706,7 +705,7 @@
    //! <b>Complexity</b>: Logarithmic.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr get_header(node_ptr n)
+ static node_ptr get_header(const node_ptr & n)
    { return tree_algorithms::get_header(n); }
 
    /// @cond
@@ -719,11 +718,12 @@
    //! <b>Complexity</b>: Constant.
    //!
    //! <b>Throws</b>: Nothing.
- static bool is_header(const_node_ptr p)
+ static bool is_header(const const_node_ptr & p)
    { return NodeTraits::get_balance(p) == NodeTraits::zero() && tree_algorithms::is_header(p); }
 
- static void rebalance_after_erasure(node_ptr header, node_ptr x, node_ptr x_parent)
+ static void rebalance_after_erasure(const node_ptr & header, const node_ptr & xnode, const node_ptr & xnode_parent)
    {
+ node_ptr x(xnode), x_parent(xnode_parent);
       for (node_ptr root = NodeTraits::get_parent(header); x != root; root = NodeTraits::get_parent(header)) {
          const balance x_parent_balance = NodeTraits::get_balance(x_parent);
          if(x_parent_balance == NodeTraits::zero()){
@@ -797,10 +797,10 @@
       }
    }
 
- static void rebalance_after_insertion(node_ptr header, node_ptr x)
+ static void rebalance_after_insertion(const node_ptr & header, const node_ptr & xnode)
    {
+ node_ptr x(xnode);
       NodeTraits::set_balance(x, NodeTraits::zero());
-
       // Rebalance.
       for(node_ptr root = NodeTraits::get_parent(header); x != root; root = NodeTraits::get_parent(header)){
          const balance x_parent_balance = NodeTraits::get_balance(NodeTraits::get_parent(x));
@@ -843,7 +843,7 @@
       }
    }
 
- static void left_right_balancing(node_ptr a, node_ptr b, node_ptr c)
+ static void left_right_balancing(const node_ptr & a, const node_ptr & b, const node_ptr & c)
    {
       // balancing...
       const balance c_balance = NodeTraits::get_balance(c);
@@ -866,7 +866,7 @@
       }
    }
 
- static void rotate_left_right(const node_ptr a, node_ptr hdr)
+ static void rotate_left_right(const node_ptr a, const node_ptr & hdr)
    {
       // | | //
       // a(-2) c //
@@ -883,7 +883,7 @@
       left_right_balancing(a, b, c);
    }
 
- static void rotate_right_left(const node_ptr a, node_ptr hdr)
+ static void rotate_right_left(const node_ptr a, const node_ptr & hdr)
    {
       // | | //
       // a(pos) c //
@@ -900,7 +900,7 @@
       left_right_balancing(b, a, c);
    }
 
- static void rotate_left(const node_ptr x, node_ptr hdr)
+ static void rotate_left(const node_ptr x, const node_ptr & hdr)
    {
       const node_ptr y = NodeTraits::get_right(x);
       tree_algorithms::rotate_left(x, hdr);
@@ -916,7 +916,7 @@
       }
    }
 
- static void rotate_right(const node_ptr x, node_ptr hdr)
+ static void rotate_right(const node_ptr x, const node_ptr & hdr)
    {
       const node_ptr y = NodeTraits::get_left(x);
       tree_algorithms::rotate_right(x, hdr);

Modified: branches/release/boost/intrusive/circular_list_algorithms.hpp
==============================================================================
--- branches/release/boost/intrusive/circular_list_algorithms.hpp (original)
+++ branches/release/boost/intrusive/circular_list_algorithms.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -61,10 +61,10 @@
    //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
- static void init(node_ptr this_node)
+ static void init(const node_ptr &this_node)
    {
- NodeTraits::set_next(this_node, node_ptr(0));
- NodeTraits::set_previous(this_node, node_ptr(0));
+ NodeTraits::set_next(this_node, node_ptr());
+ NodeTraits::set_previous(this_node, node_ptr());
    }
 
    //! <b>Effects</b>: Returns true is "this_node" is in a non-used state
@@ -73,7 +73,7 @@
    //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
- static bool inited(const_node_ptr this_node)
+ static bool inited(const const_node_ptr &this_node)
    { return !NodeTraits::get_next(this_node); }
 
    //! <b>Effects</b>: Constructs an empty list, making this_node the only
@@ -84,7 +84,7 @@
    //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
- static void init_header(node_ptr this_node)
+ static void init_header(const node_ptr &this_node)
    {
       NodeTraits::set_next(this_node, this_node);
       NodeTraits::set_previous(this_node, this_node);
@@ -99,7 +99,7 @@
    //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
- static bool unique(const_node_ptr this_node)
+ static bool unique(const const_node_ptr &this_node)
    {
       node_ptr next = NodeTraits::get_next(this_node);
       return !next || next == this_node;
@@ -113,7 +113,7 @@
    //! <b>Complexity</b>: Linear
    //!
    //! <b>Throws</b>: Nothing.
- static std::size_t count(const_node_ptr this_node)
+ static std::size_t count(const const_node_ptr &this_node)
    {
       std::size_t result = 0;
       const_node_ptr p = this_node;
@@ -131,10 +131,10 @@
    //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr unlink(node_ptr this_node)
+ static node_ptr unlink(const node_ptr &this_node)
    {
- if(NodeTraits::get_next(this_node)){
- node_ptr next(NodeTraits::get_next(this_node));
+ node_ptr next(NodeTraits::get_next(this_node));
+ if(next){
          node_ptr prev(NodeTraits::get_previous(this_node));
          NodeTraits::set_next(prev, next);
          NodeTraits::set_previous(next, prev);
@@ -152,7 +152,7 @@
    //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
- static void unlink(node_ptr b, node_ptr e)
+ static void unlink(const node_ptr &b, const node_ptr &e)
    {
       if (b != e) {
          node_ptr prevb(NodeTraits::get_previous(b));
@@ -168,13 +168,16 @@
    //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
- static void link_before(node_ptr nxt_node, node_ptr this_node)
+ static void link_before(const node_ptr &nxt_node, const node_ptr &this_node)
    {
       node_ptr prev(NodeTraits::get_previous(nxt_node));
       NodeTraits::set_previous(this_node, prev);
- NodeTraits::set_next(prev, this_node);
- NodeTraits::set_previous(nxt_node, this_node);
       NodeTraits::set_next(this_node, nxt_node);
+ //nxt_node might be an alias for prev->next_
+ //so use it before update it before NodeTraits::set_next(prev, ...)
+ //is called and the reference changes it's value
+ NodeTraits::set_previous(nxt_node, this_node);
+ NodeTraits::set_next(prev, this_node);
    }
 
    //! <b>Requires</b>: prev_node must be a node of a circular list.
@@ -184,13 +187,16 @@
    //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
- static void link_after(node_ptr prev_node, node_ptr this_node)
+ static void link_after(const node_ptr &prev_node, const node_ptr &this_node)
    {
       node_ptr next(NodeTraits::get_next(prev_node));
       NodeTraits::set_previous(this_node, prev_node);
       NodeTraits::set_next(this_node, next);
- NodeTraits::set_previous(next, this_node);
+ //prev_node might be an alias for next->next_
+ //so use it before update it before NodeTraits::set_previous(next, ...)
+ //is called and the reference changes it's value
       NodeTraits::set_next(prev_node, this_node);
+ NodeTraits::set_previous(next, this_node);
    }
 
    //! <b>Requires</b>: this_node and other_node must be nodes inserted
@@ -204,7 +210,7 @@
    //!
    //! <b>Throws</b>: Nothing.
 /*
- static void swap_nodes(node_ptr this_node, node_ptr other_node)
+ static void swap_nodes(const node_ptr &this_node, const node_ptr &other_node)
    {
 
       if (other_node == this_node)
@@ -243,13 +249,13 @@
 
    //Watanabe version
    private:
- static void swap_prev(node_ptr this_node, node_ptr other_node)
+ static void swap_prev(const node_ptr &this_node, const node_ptr &other_node)
    {
       node_ptr temp(NodeTraits::get_previous(this_node));
       NodeTraits::set_previous(this_node, NodeTraits::get_previous(other_node));
       NodeTraits::set_previous(other_node, temp);
    }
- static void swap_next(node_ptr this_node, node_ptr other_node)
+ static void swap_next(const node_ptr &this_node, const node_ptr &other_node)
    {
       node_ptr temp(NodeTraits::get_next(this_node));
       NodeTraits::set_next(this_node, NodeTraits::get_next(other_node));
@@ -257,7 +263,7 @@
    }
 
    public:
- static void swap_nodes(node_ptr this_node, node_ptr other_node)
+ static void swap_nodes(const node_ptr &this_node, const node_ptr &other_node)
    {
       if (other_node == this_node)
          return;
@@ -298,7 +304,7 @@
    //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
- static void transfer(node_ptr p, node_ptr b, node_ptr e)
+ static void transfer(const node_ptr &p, const node_ptr &b, const node_ptr &e)
    {
       if (b != e) {
          node_ptr prev_p(NodeTraits::get_previous(p));
@@ -323,7 +329,7 @@
    //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
- static void transfer(node_ptr p, node_ptr i)
+ static void transfer(const node_ptr &p, const node_ptr &i)
    {
       node_ptr n(NodeTraits::get_next(i));
       if(n != p && i != p){
@@ -344,7 +350,7 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Complexity</b>: This function is linear time.
- static void reverse(node_ptr p)
+ static void reverse(const node_ptr &p)
    {
       node_ptr f(NodeTraits::get_next(p));
       node_ptr i(NodeTraits::get_next(f)), e(p);
@@ -362,7 +368,7 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Complexity</b>: Linear to the number of moved positions.
- static void move_backwards(node_ptr p, std::size_t n)
+ static void move_backwards(const node_ptr &p, std::size_t n)
    {
       //Null shift, nothing to do
       if(!n) return;
@@ -382,7 +388,7 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Complexity</b>: Linear to the number of moved positions.
- static void move_forward(node_ptr p, std::size_t n)
+ static void move_forward(const node_ptr &p, std::size_t n)
    {
       //Null shift, nothing to do
       if(!n) return;

Modified: branches/release/boost/intrusive/circular_slist_algorithms.hpp
==============================================================================
--- branches/release/boost/intrusive/circular_slist_algorithms.hpp (original)
+++ branches/release/boost/intrusive/circular_slist_algorithms.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -63,7 +63,7 @@
 
    //! <b>Effects</b>: Constructs an non-used list element, putting the next
    //! pointer to null:
- //! <tt>NodeTraits::get_next(this_node) == 0</tt>
+ //! <tt>NodeTraits::get_next(this_node) == node_ptr()</tt>
    //!
    //! <b>Complexity</b>: Constant
    //!
@@ -74,9 +74,9 @@
    //!
    //! <b>Effects</b>: Returns true is "this_node" is the only node of a circular list:
    //! or it's a not inserted node:
- //! <tt>return !NodeTraits::get_next(this_node) || NodeTraits::get_next(this_node) == this_node</tt>
+ //! <tt>return false == NodeTraits::get_next(this_node) || NodeTraits::get_next(this_node) == this_node</tt>
    //!
- //! <b>Complexity</b>: Constant
+ //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
    static bool unique(const_node_ptr this_node);
@@ -137,7 +137,7 @@
    //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
- static void init_header(node_ptr this_node)
+ static void init_header(const node_ptr &this_node)
    { NodeTraits::set_next(this_node, this_node); }
 
    //! <b>Requires</b>: this_node and prev_init_node must be in the same circular list.
@@ -149,7 +149,7 @@
    //! <b>Complexity</b>: Linear to the number of elements between prev_init_node and this_node.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr get_previous_node(node_ptr prev_init_node, node_ptr this_node)
+ static node_ptr get_previous_node(const node_ptr &prev_init_node, const node_ptr &this_node)
    { return base_t::get_previous_node(prev_init_node, this_node); }
 
    //! <b>Requires</b>: this_node must be in a circular list or be an empty circular list.
@@ -159,7 +159,7 @@
    //! <b>Complexity</b>: Linear to the number of elements in the circular list.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr get_previous_node(node_ptr this_node)
+ static node_ptr get_previous_node(const node_ptr & this_node)
    { return base_t::get_previous_node(this_node, this_node); }
 
    //! <b>Requires</b>: this_node must be in a circular list or be an empty circular list.
@@ -169,7 +169,7 @@
    //! <b>Complexity</b>: Linear to the number of elements in the circular list.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr get_previous_previous_node(node_ptr this_node)
+ static node_ptr get_previous_previous_node(const node_ptr & this_node)
    { return get_previous_previous_node(this_node, this_node); }
 
    //! <b>Requires</b>: this_node and prev_prev_init_node must be in the same circular list.
@@ -181,7 +181,7 @@
    //! <b>Complexity</b>: Linear to the number of elements in the circular list.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr get_previous_previous_node(node_ptr prev_prev_init_node, node_ptr this_node)
+ static node_ptr get_previous_previous_node(const node_ptr & prev_prev_init_node, const node_ptr & this_node)
    {
       node_ptr p = prev_prev_init_node;
       node_ptr p_next = NodeTraits::get_next(p);
@@ -202,7 +202,7 @@
    //! <b>Complexity</b>: Linear
    //!
    //! <b>Throws</b>: Nothing.
- static std::size_t count(const_node_ptr this_node)
+ static std::size_t count(const const_node_ptr & this_node)
    {
       std::size_t result = 0;
       const_node_ptr p = this_node;
@@ -220,7 +220,7 @@
    //! <b>Complexity</b>: Linear to the number of elements in the circular list
    //!
    //! <b>Throws</b>: Nothing.
- static void unlink(node_ptr this_node)
+ static void unlink(const node_ptr & this_node)
    {
       if(NodeTraits::get_next(this_node))
          base_t::unlink_after(get_previous_node(this_node));
@@ -233,7 +233,7 @@
    //! <b>Complexity</b>: Linear to the number of elements in the circular list.
    //!
    //! <b>Throws</b>: Nothing.
- static void link_before (node_ptr nxt_node, node_ptr this_node)
+ static void link_before (const node_ptr & nxt_node, const node_ptr & this_node)
    { base_t::link_after(get_previous_node(nxt_node), this_node); }
 
    //! <b>Requires</b>: this_node and other_node must be nodes inserted
@@ -246,7 +246,7 @@
    //! <b>Complexity</b>: Linear to number of elements of both lists
    //!
    //! <b>Throws</b>: Nothing.
- static void swap_nodes(node_ptr this_node, node_ptr other_node)
+ static void swap_nodes(const node_ptr & this_node, const node_ptr & other_node)
    {
       if (other_node == this_node)
          return;
@@ -284,7 +284,7 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Complexity</b>: This function is linear to the contained elements.
- static void reverse(node_ptr p)
+ static void reverse(const node_ptr & p)
    {
       node_ptr i = NodeTraits::get_next(p), e(p);
       for (;;) {
@@ -303,18 +303,18 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Complexity</b>: Linear to the number of elements plus the number moved positions.
- static node_ptr move_backwards(node_ptr p, std::size_t n)
+ static node_ptr move_backwards(const node_ptr & p, std::size_t n)
    {
       //Null shift, nothing to do
- if(!n) return node_ptr(0);
+ if(!n) return node_ptr();
       node_ptr first = NodeTraits::get_next(p);
 
       //count() == 1 or 2, nothing to do
       if(NodeTraits::get_next(first) == p)
- return node_ptr(0);
+ return node_ptr();
 
       bool end_found = false;
- node_ptr new_last(0);
+ node_ptr new_last = node_ptr();
 
       //Now find the new last node according to the shift count.
       //If we find p before finding the new last node
@@ -327,7 +327,7 @@
             //Shortcut the shift with the modulo of the size of the list
             n %= i;
             if(!n)
- return node_ptr(0);
+ return node_ptr();
             i = 0;
             //Unlink p and continue the new first node search
             first = NodeTraits::get_next(p);
@@ -355,14 +355,14 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Complexity</b>: Linear to the number of elements plus the number moved positions.
- static node_ptr move_forward(node_ptr p, std::size_t n)
+ static node_ptr move_forward(const node_ptr & p, std::size_t n)
    {
       //Null shift, nothing to do
- if(!n) return node_ptr(0);
+ if(!n) return node_ptr();
       node_ptr first = node_traits::get_next(p);
 
       //count() == 1 or 2, nothing to do
- if(node_traits::get_next(first) == p) return node_ptr(0);
+ if(node_traits::get_next(first) == p) return node_ptr();
 
       //Iterate until p is found to know where the current last node is.
       //If the shift count is less than the size of the list, we can also obtain
@@ -381,7 +381,7 @@
          //Shortcut the shift with the modulo of the size of the list
          std::size_t new_before_last_pos = (distance - (n % distance))% distance;
          //If the shift is a multiple of the size there is nothing to do
- if(!new_before_last_pos) return node_ptr(0);
+ if(!new_before_last_pos) return node_ptr();
          
          for( new_last = p
             ; new_before_last_pos--

Modified: branches/release/boost/intrusive/derivation_value_traits.hpp
==============================================================================
--- branches/release/boost/intrusive/derivation_value_traits.hpp (original)
+++ branches/release/boost/intrusive/derivation_value_traits.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -34,8 +34,10 @@
    typedef typename node_traits::const_node_ptr const_node_ptr;
    typedef typename boost::pointer_to_other<node_ptr, T>::type pointer;
    typedef typename boost::pointer_to_other<node_ptr, const T>::type const_pointer;
- typedef typename std::iterator_traits<pointer>::reference reference;
- typedef typename std::iterator_traits<const_pointer>::reference const_reference;
+ typedef typename boost::intrusive::
+ pointer_traits<pointer>::reference reference;
+ typedef typename boost::intrusive::
+ pointer_traits<const_pointer>::reference const_reference;
    static const link_mode_type link_mode = LinkMode;
 
    static node_ptr to_node_ptr(reference value)
@@ -44,7 +46,7 @@
    static const_node_ptr to_node_ptr(const_reference value)
    { return node_ptr(&value); }
 
- static pointer to_value_ptr(node_ptr n)
+ static pointer to_value_ptr(const node_ptr &n)
    {
 // This still fails in gcc < 4.4 so forget about it
 // using ::boost::static_pointer_cast;
@@ -52,7 +54,7 @@
       return pointer(&static_cast<value_type&>(*n));
    }
 
- static const_pointer to_value_ptr(const_node_ptr n)
+ static const_pointer to_value_ptr(const const_node_ptr &n)
    {
 // This still fails in gcc < 4.4 so forget about it
 // using ::boost::static_pointer_cast;

Modified: branches/release/boost/intrusive/detail/any_node_and_algorithms.hpp
==============================================================================
--- branches/release/boost/intrusive/detail/any_node_and_algorithms.hpp (original)
+++ branches/release/boost/intrusive/detail/any_node_and_algorithms.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -16,7 +16,7 @@
 #include <boost/intrusive/detail/config_begin.hpp>
 #include <iterator>
 #include <boost/intrusive/detail/assert.hpp>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <cstddef>
 #include <boost/intrusive/detail/mpl.hpp>
 #include <boost/pointer_cast.hpp>
@@ -27,8 +27,8 @@
 template<class VoidPointer>
 struct any_node
 {
- typedef typename boost::pointer_to_other
- <VoidPointer, any_node>::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<any_node>::type node_ptr;
    node_ptr node_ptr_1;
    node_ptr node_ptr_2;
    node_ptr node_ptr_3;
@@ -39,21 +39,21 @@
 struct any_list_node_traits
 {
    typedef any_node<VoidPointer> node;
- typedef typename boost::pointer_to_other
- <VoidPointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <VoidPointer, const node>::type const_node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<node>::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<const node>::type const_node_ptr;
 
- static node_ptr get_next(const_node_ptr n)
+ static const node_ptr &get_next(const const_node_ptr & n)
    { return n->node_ptr_1; }
 
- static void set_next(node_ptr n, node_ptr next)
+ static void set_next(const node_ptr & n, const node_ptr & next)
    { n->node_ptr_1 = next; }
 
- static node_ptr get_previous(const_node_ptr n)
+ static const node_ptr &get_previous(const const_node_ptr & n)
    { return n->node_ptr_2; }
 
- static void set_previous(node_ptr n, node_ptr prev)
+ static void set_previous(const node_ptr & n, const node_ptr & prev)
    { n->node_ptr_2 = prev; }
 };
 
@@ -62,15 +62,15 @@
 struct any_slist_node_traits
 {
    typedef any_node<VoidPointer> node;
- typedef typename boost::pointer_to_other
- <VoidPointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <VoidPointer, const node>::type const_node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<node>::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<const node>::type const_node_ptr;
 
- static node_ptr get_next(const_node_ptr n)
+ static const node_ptr &get_next(const const_node_ptr & n)
    { return n->node_ptr_1; }
 
- static void set_next(node_ptr n, node_ptr next)
+ static void set_next(const node_ptr & n, const node_ptr & next)
    { n->node_ptr_1 = next; }
 };
 
@@ -87,25 +87,22 @@
    static const bool store_hash = true;
    static const bool optimize_multikey = true;
 
- static node_ptr get_next(const_node_ptr n)
- {
- using ::boost::static_pointer_cast;
- return static_pointer_cast<node>(n->node_ptr_1);
- }
+ static const node_ptr &get_next(const const_node_ptr & n)
+ { return n->node_ptr_1; }
 
- static void set_next(node_ptr n, node_ptr next)
+ static void set_next(const node_ptr & n, const node_ptr & next)
    { n->node_ptr_1 = next; }
 
- static node_ptr get_prev_in_group(const_node_ptr n)
+ static node_ptr get_prev_in_group(const const_node_ptr & n)
    { return n->node_ptr_2; }
 
- static void set_prev_in_group(node_ptr n, node_ptr prev)
+ static void set_prev_in_group(const node_ptr & n, const node_ptr & prev)
    { n->node_ptr_2 = prev; }
 
- static std::size_t get_hash(const_node_ptr n)
+ static std::size_t get_hash(const const_node_ptr & n)
    { return n->size_t_1; }
 
- static void set_hash(node_ptr n, std::size_t h)
+ static void set_hash(const node_ptr & n, std::size_t h)
    { n->size_t_1 = h; }
 };
 
@@ -115,35 +112,35 @@
 {
    typedef any_node<VoidPointer> node;
 
- typedef typename boost::pointer_to_other
- <VoidPointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <VoidPointer, const node>::type const_node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<node>::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<const node>::type const_node_ptr;
 
    typedef std::size_t color;
 
- static node_ptr get_parent(const_node_ptr n)
+ static const node_ptr &get_parent(const const_node_ptr & n)
    { return n->node_ptr_1; }
 
- static void set_parent(node_ptr n, node_ptr p)
+ static void set_parent(const node_ptr & n, const node_ptr & p)
    { n->node_ptr_1 = p; }
 
- static node_ptr get_left(const_node_ptr n)
+ static const node_ptr &get_left(const const_node_ptr & n)
    { return n->node_ptr_2; }
 
- static void set_left(node_ptr n, node_ptr l)
+ static void set_left(const node_ptr & n, const node_ptr & l)
    { n->node_ptr_2 = l; }
 
- static node_ptr get_right(const_node_ptr n)
+ static const node_ptr &get_right(const const_node_ptr & n)
    { return n->node_ptr_3; }
 
- static void set_right(node_ptr n, node_ptr r)
+ static void set_right(const node_ptr & n, const node_ptr & r)
    { n->node_ptr_3 = r; }
 
- static color get_color(const_node_ptr n)
+ static color get_color(const const_node_ptr & n)
    { return n->size_t_1; }
 
- static void set_color(node_ptr n, color c)
+ static void set_color(const node_ptr & n, color c)
    { n->size_t_1 = c; }
 
    static color black()
@@ -159,34 +156,34 @@
 {
    typedef any_node<VoidPointer> node;
 
- typedef typename boost::pointer_to_other
- <VoidPointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <VoidPointer, const node>::type const_node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<node>::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<const node>::type const_node_ptr;
    typedef std::size_t balance;
 
- static node_ptr get_parent(const_node_ptr n)
+ static const node_ptr &get_parent(const const_node_ptr & n)
    { return n->node_ptr_1; }
 
- static void set_parent(node_ptr n, node_ptr p)
+ static void set_parent(const node_ptr & n, const node_ptr & p)
    { n->node_ptr_1 = p; }
 
- static node_ptr get_left(const_node_ptr n)
+ static const node_ptr &get_left(const const_node_ptr & n)
    { return n->node_ptr_2; }
 
- static void set_left(node_ptr n, node_ptr l)
+ static void set_left(const node_ptr & n, const node_ptr & l)
    { n->node_ptr_2 = l; }
 
- static node_ptr get_right(const_node_ptr n)
+ static const node_ptr &get_right(const const_node_ptr & n)
    { return n->node_ptr_3; }
 
- static void set_right(node_ptr n, node_ptr r)
+ static void set_right(const node_ptr & n, const node_ptr & r)
    { n->node_ptr_3 = r; }
 
- static balance get_balance(const_node_ptr n)
+ static balance get_balance(const const_node_ptr & n)
    { return n->size_t_1; }
 
- static void set_balance(node_ptr n, balance b)
+ static void set_balance(const node_ptr & n, balance b)
    { n->size_t_1 = b; }
 
    static balance negative()
@@ -205,27 +202,27 @@
 {
    typedef any_node<VoidPointer> node;
 
- typedef typename boost::pointer_to_other
- <VoidPointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <VoidPointer, const node>::type const_node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<node>::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<const node>::type const_node_ptr;
 
- static node_ptr get_parent(const_node_ptr n)
+ static const node_ptr &get_parent(const const_node_ptr & n)
    { return n->node_ptr_1; }
 
- static void set_parent(node_ptr n, node_ptr p)
+ static void set_parent(const node_ptr & n, const node_ptr & p)
    { n->node_ptr_1 = p; }
 
- static node_ptr get_left(const_node_ptr n)
+ static const node_ptr &get_left(const const_node_ptr & n)
    { return n->node_ptr_2; }
 
- static void set_left(node_ptr n, node_ptr l)
+ static void set_left(const node_ptr & n, const node_ptr & l)
    { n->node_ptr_2 = l; }
 
- static node_ptr get_right(const_node_ptr n)
+ static const node_ptr &get_right(const const_node_ptr & n)
    { return n->node_ptr_3; }
 
- static void set_right(node_ptr n, node_ptr r)
+ static void set_right(const node_ptr & n, const node_ptr & r)
    { n->node_ptr_3 = r; }
 };
 
@@ -234,10 +231,10 @@
 {
    public:
    typedef any_node<VoidPointer> node;
- typedef typename boost::pointer_to_other
- <VoidPointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <VoidPointer, const node>::type const_node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<node>::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<const node>::type const_node_ptr;
 };
 
 template<class VoidPointer>
@@ -249,10 +246,10 @@
 
    public:
    typedef any_node<VoidPointer> node;
- typedef typename boost::pointer_to_other
- <VoidPointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <VoidPointer, const node>::type const_node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<node>::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<const node>::type const_node_ptr;
    typedef any_node_traits<VoidPointer> node_traits;
 
    //! <b>Requires</b>: node must not be part of any tree.
@@ -264,7 +261,7 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Nodes</b>: If node is inserted in a tree, this function corrupts the tree.
- static void init(node_ptr node)
+ static void init(const node_ptr & node)
    { node->node_ptr_1 = 0; };
 
    //! <b>Effects</b>: Returns true if node is in the same state as if called init(node)
@@ -272,19 +269,19 @@
    //! <b>Complexity</b>: Constant.
    //!
    //! <b>Throws</b>: Nothing.
- static bool inited(const_node_ptr node)
+ static bool inited(const const_node_ptr & node)
    { return !node->node_ptr_1; };
 
- static bool unique(const_node_ptr node)
+ static bool unique(const const_node_ptr & node)
    { return 0 == node->node_ptr_1; }
 
- static void unlink(node_ptr)
+ static void unlink(const node_ptr &)
    {
       //Auto-unlink hooks and unlink() are not available for any hooks
       any_algorithms<VoidPointer>::template function_not_available_for_any_hooks<node_ptr>();
    }
 
- static void swap_nodes(node_ptr l, node_ptr r)
+ static void swap_nodes(const node_ptr & l, const node_ptr & r)
    {
       //Any nodes have no swap_nodes capability because they don't know
       //what algorithm they must use to unlink the node from the container

Modified: branches/release/boost/intrusive/detail/avltree_node.hpp
==============================================================================
--- branches/release/boost/intrusive/detail/avltree_node.hpp (original)
+++ branches/release/boost/intrusive/detail/avltree_node.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -15,7 +15,7 @@
 
 #include <boost/intrusive/detail/config_begin.hpp>
 #include <iterator>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/avltree_algorithms.hpp>
 #include <boost/intrusive/pointer_plus_bits.hpp>
 #include <boost/intrusive/detail/mpl.hpp>
@@ -33,9 +33,9 @@
 template<class VoidPointer>
 struct compact_avltree_node
 {
- typedef typename pointer_to_other
- <VoidPointer
- ,compact_avltree_node<VoidPointer> >::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer
+ <compact_avltree_node<VoidPointer> >::type node_ptr;
    enum balance { negative_t, zero_t, positive_t };
    node_ptr parent_, left_, right_;
 };
@@ -44,9 +44,9 @@
 template<class VoidPointer>
 struct avltree_node
 {
- typedef typename pointer_to_other
- <VoidPointer
- ,avltree_node<VoidPointer> >::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer
+ <avltree_node<VoidPointer> >::type node_ptr;
    enum balance { negative_t, zero_t, positive_t };
    node_ptr parent_, left_, right_;
    balance balance_;
@@ -59,34 +59,37 @@
 {
    typedef avltree_node<VoidPointer> node;
 
- typedef typename boost::pointer_to_other
- <VoidPointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <VoidPointer, const node>::type const_node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer
+ <node>::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer
+ <const node>::type const_node_ptr;
+
    typedef typename node::balance balance;
 
- static node_ptr get_parent(const_node_ptr n)
+ static const node_ptr & get_parent(const const_node_ptr & n)
    { return n->parent_; }
 
- static void set_parent(node_ptr n, node_ptr p)
+ static void set_parent(const node_ptr & n, const node_ptr & p)
    { n->parent_ = p; }
 
- static node_ptr get_left(const_node_ptr n)
+ static const node_ptr & get_left(const const_node_ptr & n)
    { return n->left_; }
 
- static void set_left(node_ptr n, node_ptr l)
+ static void set_left(const node_ptr & n, const node_ptr & l)
    { n->left_ = l; }
 
- static node_ptr get_right(const_node_ptr n)
+ static const node_ptr & get_right(const const_node_ptr & n)
    { return n->right_; }
 
- static void set_right(node_ptr n, node_ptr r)
+ static void set_right(const node_ptr & n, const node_ptr & r)
    { n->right_ = r; }
 
- static balance get_balance(const_node_ptr n)
+ static balance get_balance(const const_node_ptr & n)
    { return n->balance_; }
 
- static void set_balance(node_ptr n, balance b)
+ static void set_balance(const node_ptr & n, balance b)
    { n->balance_ = b; }
 
    static balance negative()
@@ -105,36 +108,39 @@
 struct compact_avltree_node_traits_impl
 {
    typedef compact_avltree_node<VoidPointer> node;
- typedef typename boost::pointer_to_other
- <VoidPointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <VoidPointer, const node>::type const_node_ptr;
+
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer
+ <node>::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer
+ <const node>::type const_node_ptr;
    typedef typename node::balance balance;
 
    typedef pointer_plus_bits<node_ptr, 2> ptr_bit;
 
- static node_ptr get_parent(const_node_ptr n)
+ static node_ptr get_parent(const const_node_ptr & n)
    { return ptr_bit::get_pointer(n->parent_); }
 
- static void set_parent(node_ptr n, node_ptr p)
+ static void set_parent(const node_ptr & n, const node_ptr & p)
    { ptr_bit::set_pointer(n->parent_, p); }
 
- static node_ptr get_left(const_node_ptr n)
+ static const node_ptr & get_left(const const_node_ptr & n)
    { return n->left_; }
 
- static void set_left(node_ptr n, node_ptr l)
+ static void set_left(const node_ptr & n, const node_ptr & l)
    { n->left_ = l; }
 
- static node_ptr get_right(const_node_ptr n)
+ static const node_ptr & get_right(const const_node_ptr & n)
    { return n->right_; }
 
- static void set_right(node_ptr n, node_ptr r)
+ static void set_right(const node_ptr & n, const node_ptr & r)
    { n->right_ = r; }
 
- static balance get_balance(const_node_ptr n)
+ static balance get_balance(const const_node_ptr & n)
    { return (balance)ptr_bit::get_bits(n->parent_); }
 
- static void set_balance(node_ptr n, balance b)
+ static void set_balance(const node_ptr & n, balance b)
    { ptr_bit::set_bits(n->parent_, (std::size_t)b); }
 
    static balance negative()

Modified: branches/release/boost/intrusive/detail/common_slist_algorithms.hpp
==============================================================================
--- branches/release/boost/intrusive/detail/common_slist_algorithms.hpp (original)
+++ branches/release/boost/intrusive/detail/common_slist_algorithms.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -31,7 +31,7 @@
    typedef typename NodeTraits::const_node_ptr const_node_ptr;
    typedef NodeTraits node_traits;
 
- static node_ptr get_previous_node(node_ptr prev_init_node, node_ptr this_node)
+ static node_ptr get_previous_node(const node_ptr & prev_init_node, const node_ptr & this_node)
    {
       node_ptr p = prev_init_node;
       for( node_ptr p_next
@@ -44,44 +44,44 @@
       return p;
    }
 
- static void init_header(node_ptr this_node)
+ static void init_header(const node_ptr & this_node)
    { NodeTraits::set_next(this_node, this_node); }
 
- static void init(node_ptr this_node)
- { NodeTraits::set_next(this_node, node_ptr(0)); }
+ static void init(const node_ptr & this_node)
+ { NodeTraits::set_next(this_node, node_ptr()); }
 
- static bool unique(const_node_ptr this_node)
+ static bool unique(const const_node_ptr & this_node)
    {
       node_ptr next = NodeTraits::get_next(this_node);
       return !next || next == this_node;
    }
 
- static bool inited(const_node_ptr this_node)
+ static bool inited(const const_node_ptr & this_node)
    { return !NodeTraits::get_next(this_node); }
 
- static void unlink_after(node_ptr prev_node)
+ static void unlink_after(const node_ptr & prev_node)
    {
- node_ptr this_node(NodeTraits::get_next(prev_node));
+ const_node_ptr this_node(NodeTraits::get_next(prev_node));
       NodeTraits::set_next(prev_node, NodeTraits::get_next(this_node));
    }
 
- static void unlink_after(node_ptr prev_node, node_ptr last_node)
+ static void unlink_after(const node_ptr & prev_node, const node_ptr & last_node)
    { NodeTraits::set_next(prev_node, last_node); }
 
- static void link_after(node_ptr prev_node, node_ptr this_node)
+ static void link_after(const node_ptr & prev_node, const node_ptr & this_node)
    {
       NodeTraits::set_next(this_node, NodeTraits::get_next(prev_node));
       NodeTraits::set_next(prev_node, this_node);
    }
 
- static void incorporate_after(node_ptr bp, node_ptr b, node_ptr be)
+ static void incorporate_after(const node_ptr & bp, const node_ptr & b, const node_ptr & be)
    {
       node_ptr p(NodeTraits::get_next(bp));
       NodeTraits::set_next(bp, b);
       NodeTraits::set_next(be, p);
    }
    
- static void transfer_after(node_ptr bp, node_ptr bb, node_ptr be)
+ static void transfer_after(const node_ptr & bp, const node_ptr & bb, const node_ptr & be)
    {
       if (bp != bb && bp != be && bb != be) {
          node_ptr next_b = NodeTraits::get_next(bb);

Modified: branches/release/boost/intrusive/detail/function_detector.hpp
==============================================================================
--- branches/release/boost/intrusive/detail/function_detector.hpp (original)
+++ branches/release/boost/intrusive/detail/function_detector.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -11,6 +11,7 @@
 /////////////////////////////////////////////////////////////////////////////
 // This code was modified from the code posted by Alexandre Courpron in his
 // article "Interface Detection" in The Code Project:
+// http://www.codeproject.com/KB/architecture/Detector.aspx
 ///////////////////////////////////////////////////////////////////////////////
 // Copyright 2007 Alexandre Courpron
 //

Modified: branches/release/boost/intrusive/detail/generic_hook.hpp
==============================================================================
--- branches/release/boost/intrusive/detail/generic_hook.hpp (original)
+++ branches/release/boost/intrusive/detail/generic_hook.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -15,10 +15,11 @@
 
 #include <boost/intrusive/detail/config_begin.hpp>
 #include <boost/intrusive/intrusive_fwd.hpp>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/link_mode.hpp>
 #include <boost/intrusive/detail/utilities.hpp>
 #include <boost/intrusive/detail/mpl.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/static_assert.hpp>
 
 namespace boost {
@@ -146,20 +147,26 @@
          (int)link_mode == (int)auto_unlink || (int)link_mode == (int)safe_link;
    };
 
+ node_ptr this_ptr()
+ { return pointer_traits<node_ptr>::pointer_to(static_cast<node&>(*this)); }
+
+ const_node_ptr this_ptr() const
+ { return pointer_traits<const_node_ptr>::pointer_to(static_cast<const node&>(*this)); }
+
    public:
    /// @endcond
 
    generic_hook()
    {
       if(boost_intrusive_tags::safemode_or_autounlink){
- node_algorithms::init(static_cast<node*>(this));
+ node_algorithms::init(this->this_ptr());
       }
    }
 
    generic_hook(const generic_hook& )
    {
       if(boost_intrusive_tags::safemode_or_autounlink){
- node_algorithms::init(static_cast<node*>(this));
+ node_algorithms::init(this->this_ptr());
       }
    }
 
@@ -175,22 +182,21 @@
    void swap_nodes(generic_hook &other)
    {
       node_algorithms::swap_nodes
- ( static_cast<node*>(this), static_cast<node*>(&other));
+ (this->this_ptr(), other.this_ptr());
    }
 
    bool is_linked() const
    {
       //is_linked() can be only used in safe-mode or auto-unlink
       BOOST_STATIC_ASSERT(( boost_intrusive_tags::safemode_or_autounlink ));
- return !node_algorithms::unique
- (static_cast<const node*>(this));
+ return !node_algorithms::unique(this->this_ptr());
    }
 
    void unlink()
    {
       BOOST_STATIC_ASSERT(( (int)boost_intrusive_tags::link_mode == (int)auto_unlink ));
- node_algorithms::unlink(static_cast<node*>(this));
- node_algorithms::init(static_cast<node*>(this));
+ node_algorithms::unlink(this->this_ptr());
+ node_algorithms::init(this->this_ptr());
    }
 };
 

Modified: branches/release/boost/intrusive/detail/hashtable_node.hpp
==============================================================================
--- branches/release/boost/intrusive/detail/hashtable_node.hpp (original)
+++ branches/release/boost/intrusive/detail/hashtable_node.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -16,11 +16,12 @@
 #include <boost/intrusive/detail/config_begin.hpp>
 #include <iterator>
 #include <boost/intrusive/detail/assert.hpp>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/circular_list_algorithms.hpp>
 #include <boost/intrusive/detail/mpl.hpp>
 #include <boost/intrusive/detail/utilities.hpp>
-#include <boost/intrusive/detail/slist_node.hpp> //remove-me
+//#include <boost/intrusive/detail/slist_node.hpp> //remove-me
+#include <boost/intrusive/pointer_traits.hpp>
 #include <cstddef>
 #include <boost/pointer_cast.hpp>
 #include <boost/move/move.hpp>
@@ -84,8 +85,10 @@
 
    public:
    /// @cond
- typedef typename boost::pointer_to_other
- < typename Slist::pointer, bucket_impl<Slist> >::type bucket_ptr;
+
+ typedef typename pointer_traits
+ <typename Slist::pointer>::template rebind_pointer
+ < bucket_impl<Slist> >::type bucket_ptr;
    typedef typename Slist::size_type size_type;
    /// @endcond
 
@@ -93,14 +96,19 @@
       : buckets_(buckets), buckets_len_(len)
    {}
 
+ bucket_traits_impl(const bucket_traits_impl &x)
+ : buckets_(x.buckets_), buckets_len_(x.buckets_len_)
+ {}
+
+
    bucket_traits_impl(BOOST_RV_REF(bucket_traits_impl) x)
       : buckets_(x.buckets_), buckets_len_(x.buckets_len_)
- { x.buckets_ = bucket_ptr(0); x.buckets_len_ = 0; }
+ { x.buckets_ = bucket_ptr(); x.buckets_len_ = 0; }
 
    bucket_traits_impl& operator=(BOOST_RV_REF(bucket_traits_impl) x)
    {
       buckets_ = x.buckets_; buckets_len_ = x.buckets_len_;
- x.buckets_ = bucket_ptr(0); x.buckets_len_ = 0; return *this;
+ x.buckets_ = bucket_ptr(); x.buckets_len_ = 0; return *this;
    }
 
    bucket_traits_impl& operator=(BOOST_COPY_ASSIGN_REF(bucket_traits_impl) x)
@@ -108,7 +116,7 @@
       buckets_ = x.buckets_; buckets_len_ = x.buckets_len_; return *this;
    }
 
- bucket_ptr bucket_begin() const
+ const bucket_ptr &bucket_begin() const
    { return buckets_; }
 
    size_type bucket_count() const
@@ -124,7 +132,7 @@
    : public std::iterator
          < std::forward_iterator_tag
          , typename Container::value_type
- , typename std::iterator_traits<typename Container::value_type*>::difference_type
+ , typename pointer_traits<typename Container::value_type*>::difference_type
          , typename detail::add_const_if_c
                      <typename Container::value_type, IsConst>::type *
          , typename detail::add_const_if_c
@@ -135,16 +143,16 @@
    typedef typename Container::siterator siterator;
    typedef typename Container::const_siterator const_siterator;
    typedef typename Container::bucket_type bucket_type;
- typedef typename boost::pointer_to_other
- < typename Container::pointer, const Container>::type const_cont_ptr;
+
+ typedef typename pointer_traits
+ <typename Container::pointer>::template rebind_pointer
+ < const Container >::type const_cont_ptr;
    typedef typename Container::size_type size_type;
 
    static typename Container::node_ptr downcast_bucket(typename bucket_type::node_ptr p)
    {
-// This still fails in gcc < 4.4 so forget about it
-// using ::boost::static_pointer_cast;
-// return static_pointer_cast<typename Container::node>(p);
- return typename Container::node_ptr(&static_cast<typename Container::node&>(*p));
+ return pointer_traits<typename Container::node_ptr>::
+ pointer_to(static_cast<typename Container::node&>(*p));
    }
 
    public:
@@ -158,7 +166,7 @@
    {}
 
    explicit hashtable_iterator(siterator ptr, const Container *cont)
- : slist_it_ (ptr), cont_ (cont)
+ : slist_it_ (ptr), cont_ (cont ? pointer_traits<const_cont_ptr>::pointer_to(*cont) : const_cont_ptr() )
    {}
 
    hashtable_iterator(const hashtable_iterator<Container, false> &other)
@@ -192,10 +200,13 @@
    { return *this->operator ->(); }
 
    pointer operator->() const
- { return detail::boost_intrusive_get_pointer(this->get_real_value_traits()->to_value_ptr(downcast_bucket(slist_it_.pointed_node()))); }
+ {
+ return boost::intrusive::detail::to_raw_pointer(this->get_real_value_traits()->to_value_ptr
+ (downcast_bucket(slist_it_.pointed_node())));
+ }
 
- const Container *get_container() const
- { return detail::boost_intrusive_get_pointer(cont_); }
+ const const_cont_ptr &get_container() const
+ { return cont_; }
 
    const real_value_traits *get_real_value_traits() const
    { return &this->get_container()->get_real_value_traits(); }
@@ -203,8 +214,8 @@
    private:
    void increment()
    {
- const Container *cont = detail::boost_intrusive_get_pointer(cont_);
- bucket_type* buckets = detail::boost_intrusive_get_pointer(cont->bucket_pointer());
+ const Container *cont = boost::intrusive::detail::to_raw_pointer(cont_);
+ bucket_type* buckets = boost::intrusive::detail::to_raw_pointer(cont->bucket_pointer());
       size_type buckets_len = cont->bucket_count();
 
       ++slist_it_;

Modified: branches/release/boost/intrusive/detail/list_node.hpp
==============================================================================
--- branches/release/boost/intrusive/detail/list_node.hpp (original)
+++ branches/release/boost/intrusive/detail/list_node.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -17,7 +17,7 @@
 #include <boost/intrusive/detail/config_begin.hpp>
 #include <iterator>
 #include <boost/intrusive/detail/assert.hpp>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 
 namespace boost {
 namespace intrusive {
@@ -29,8 +29,8 @@
 template<class VoidPointer>
 struct list_node
 {
- typedef typename boost::pointer_to_other
- <VoidPointer, list_node>::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>:: template rebind_pointer<list_node>::type node_ptr;
    node_ptr next_;
    node_ptr prev_;
 };
@@ -39,21 +39,21 @@
 struct list_node_traits
 {
    typedef list_node<VoidPointer> node;
- typedef typename boost::pointer_to_other
- <VoidPointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <VoidPointer, const node>::type const_node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>:: template rebind_pointer<node>::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>:: template rebind_pointer<const node>::type const_node_ptr;
 
- static node_ptr get_previous(const_node_ptr n)
+ static const node_ptr &get_previous(const const_node_ptr & n)
    { return n->prev_; }
 
- static void set_previous(node_ptr n, node_ptr prev)
+ static void set_previous(const node_ptr & n, const node_ptr & prev)
    { n->prev_ = prev; }
 
- static node_ptr get_next(const_node_ptr n)
+ static const node_ptr &get_next(const const_node_ptr & n)
    { return n->next_; }
 
- static void set_next(node_ptr n, node_ptr next)
+ static void set_next(const node_ptr & n, const node_ptr & next)
    { n->next_ = next; }
 };
 
@@ -74,8 +74,8 @@
    typedef typename real_value_traits::node_traits node_traits;
    typedef typename node_traits::node node;
    typedef typename node_traits::node_ptr node_ptr;
- typedef typename boost::pointer_to_other
- <node_ptr, void>::type void_pointer;
+ typedef typename pointer_traits<node_ptr>::
+ template rebind_pointer<void>::type void_pointer;
    static const bool store_container_ptr =
       detail::store_cont_ptr_on_it<Container>::value;
 
@@ -85,10 +85,10 @@
    typedef typename detail::if_c<IsConst,typename Container::const_reference,typename Container::reference>::type reference;
 
    list_iterator()
- : members_ (node_ptr(0), 0)
+ : members_ (node_ptr(), 0)
    {}
 
- explicit list_iterator(node_ptr node, const Container *cont_ptr)
+ explicit list_iterator(const node_ptr & node, const Container *cont_ptr)
       : members_ (node, cont_ptr)
    {}
 
@@ -104,8 +104,10 @@
 
    public:
    list_iterator& operator++()
- {
- members_.nodeptr_ = node_traits::get_next(members_.nodeptr_);
+ {
+ node_ptr p = node_traits::get_next(members_.nodeptr_);
+ members_.nodeptr_ = p;
+ //members_.nodeptr_ = node_traits::get_next(members_.nodeptr_);
       return static_cast<list_iterator&> (*this);
    }
    
@@ -139,7 +141,7 @@
    { return *operator->(); }
 
    pointer operator->() const
- { return detail::boost_intrusive_get_pointer(this->get_real_value_traits()->to_value_ptr(members_.nodeptr_)); }
+ { return this->get_real_value_traits()->to_value_ptr(members_.nodeptr_); }
 
    const Container *get_container() const
    {

Deleted: branches/release/boost/intrusive/detail/pointer_to_other.hpp
==============================================================================
--- branches/release/boost/intrusive/detail/pointer_to_other.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
+++ (empty file)
@@ -1,65 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztanaga 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)
-//
-// See http://www.boost.org/libs/intrusive for documentation.
-//
-/////////////////////////////////////////////////////////////////////////////
-
-#ifndef BOOST_INTRUSIVE_POINTER_TO_OTHER_HPP
-#define BOOST_INTRUSIVE_POINTER_TO_OTHER_HPP
-
-#include <boost/intrusive/detail/config_begin.hpp>
-#include <boost/version.hpp>
-
-#if (BOOST_VERSION < 103400)
-
-#ifndef BOOST_POINTER_TO_OTHER_HPP_INCLUDED
-#define BOOST_POINTER_TO_OTHER_HPP_INCLUDED
-
-namespace boost {
-
-template<class T, class U>
- struct pointer_to_other;
-
-template<class T, class U, template <class> class Sp>
- struct pointer_to_other< Sp<T>, U >
-{
- typedef Sp<U> type;
-};
-
-template<class T, class T2, class U,
- template <class, class> class Sp>
- struct pointer_to_other< Sp<T, T2>, U >
-{
- typedef Sp<U, T2> type;
-};
-
-template<class T, class T2, class T3, class U,
- template <class, class, class> class Sp>
-struct pointer_to_other< Sp<T, T2, T3>, U >
-{
- typedef Sp<U, T2, T3> type;
-};
-
-template<class T, class U>
-struct pointer_to_other< T*, U >
-{
- typedef U* type;
-};
-
-} // namespace boost
-
-#endif
-
-#else
-
-#include <boost/pointer_to_other.hpp>
-
-#endif //#ifndef BOOST_POINTER_TO_OTHER_HPP_INCLUDED
-
-#include <boost/intrusive/detail/config_end.hpp>
-
-#endif //#ifndef BOOST_INTRUSIVE_POINTER_TO_OTHER_HPP

Modified: branches/release/boost/intrusive/detail/rbtree_node.hpp
==============================================================================
--- branches/release/boost/intrusive/detail/rbtree_node.hpp (original)
+++ branches/release/boost/intrusive/detail/rbtree_node.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -16,7 +16,7 @@
 
 #include <boost/intrusive/detail/config_begin.hpp>
 #include <iterator>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/rbtree_algorithms.hpp>
 #include <boost/intrusive/pointer_plus_bits.hpp>
 #include <boost/intrusive/detail/mpl.hpp>
@@ -34,9 +34,9 @@
 template<class VoidPointer>
 struct compact_rbtree_node
 {
- typedef typename pointer_to_other
- <VoidPointer
- ,compact_rbtree_node<VoidPointer> >::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer
+ <compact_rbtree_node<VoidPointer> >::type node_ptr;
    enum color { red_t, black_t };
    node_ptr parent_, left_, right_;
 };
@@ -45,9 +45,9 @@
 template<class VoidPointer>
 struct rbtree_node
 {
- typedef typename pointer_to_other
- <VoidPointer
- ,rbtree_node<VoidPointer> >::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer
+ <rbtree_node<VoidPointer> >::type node_ptr;
 
    enum color { red_t, black_t };
    node_ptr parent_, left_, right_;
@@ -61,35 +61,35 @@
 {
    typedef rbtree_node<VoidPointer> node;
 
- typedef typename boost::pointer_to_other
- <VoidPointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <VoidPointer, const node>::type const_node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<node>::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<const node>::type const_node_ptr;
 
    typedef typename node::color color;
 
- static node_ptr get_parent(const_node_ptr n)
+ static const node_ptr & get_parent(const const_node_ptr & n)
    { return n->parent_; }
 
- static void set_parent(node_ptr n, node_ptr p)
+ static void set_parent(const node_ptr & n, const node_ptr & p)
    { n->parent_ = p; }
 
- static node_ptr get_left(const_node_ptr n)
+ static const node_ptr & get_left(const const_node_ptr & n)
    { return n->left_; }
 
- static void set_left(node_ptr n, node_ptr l)
+ static void set_left(const node_ptr & n, const node_ptr & l)
    { n->left_ = l; }
 
- static node_ptr get_right(const_node_ptr n)
+ static const node_ptr & get_right(const const_node_ptr & n)
    { return n->right_; }
 
- static void set_right(node_ptr n, node_ptr r)
+ static void set_right(const node_ptr & n, const node_ptr & r)
    { n->right_ = r; }
 
- static color get_color(const_node_ptr n)
+ static color get_color(const const_node_ptr & n)
    { return n->color_; }
 
- static void set_color(node_ptr n, color c)
+ static void set_color(const node_ptr & n, color c)
    { n->color_ = c; }
 
    static color black()
@@ -105,37 +105,37 @@
 struct compact_rbtree_node_traits_impl
 {
    typedef compact_rbtree_node<VoidPointer> node;
- typedef typename boost::pointer_to_other
- <VoidPointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <VoidPointer, const node>::type const_node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<node>::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<const node>::type const_node_ptr;
 
    typedef pointer_plus_bits<node_ptr, 1> ptr_bit;
 
    typedef typename node::color color;
 
- static node_ptr get_parent(const_node_ptr n)
+ static node_ptr get_parent(const const_node_ptr & n)
    { return ptr_bit::get_pointer(n->parent_); }
 
- static void set_parent(node_ptr n, node_ptr p)
+ static void set_parent(const node_ptr & n, const node_ptr & p)
    { ptr_bit::set_pointer(n->parent_, p); }
 
- static node_ptr get_left(const_node_ptr n)
+ static const node_ptr & get_left(const const_node_ptr & n)
    { return n->left_; }
 
- static void set_left(node_ptr n, node_ptr l)
+ static void set_left(const node_ptr & n, const node_ptr & l)
    { n->left_ = l; }
 
- static node_ptr get_right(const_node_ptr n)
+ static const node_ptr & get_right(const const_node_ptr & n)
    { return n->right_; }
 
- static void set_right(node_ptr n, node_ptr r)
+ static void set_right(const node_ptr & n, const node_ptr & r)
    { n->right_ = r; }
 
- static color get_color(const_node_ptr n)
+ static color get_color(const const_node_ptr & n)
    { return (color)ptr_bit::get_bits(n->parent_); }
 
- static void set_color(node_ptr n, color c)
+ static void set_color(const node_ptr & n, color c)
    { ptr_bit::set_bits(n->parent_, c != 0); }
 
    static color black()

Modified: branches/release/boost/intrusive/detail/slist_node.hpp
==============================================================================
--- branches/release/boost/intrusive/detail/slist_node.hpp (original)
+++ branches/release/boost/intrusive/detail/slist_node.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -17,7 +17,7 @@
 #include <boost/intrusive/detail/config_begin.hpp>
 #include <iterator>
 #include <boost/intrusive/detail/assert.hpp>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 
 namespace boost {
 namespace intrusive {
@@ -25,8 +25,8 @@
 template<class VoidPointer>
 struct slist_node
 {
- typedef typename boost::pointer_to_other
- <VoidPointer, slist_node>::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<slist_node>::type node_ptr;
    node_ptr next_;
 };
 
@@ -37,15 +37,15 @@
 struct slist_node_traits
 {
    typedef slist_node<VoidPointer> node;
- typedef typename boost::pointer_to_other
- <VoidPointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <VoidPointer, const node>::type const_node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<node>::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer<const node>::type const_node_ptr;
 
- static node_ptr get_next(const_node_ptr n)
+ static const node_ptr &get_next(const const_node_ptr & n)
    { return n->next_; }
 
- static void set_next(node_ptr n, node_ptr next)
+ static void set_next(const node_ptr & n, const node_ptr & next)
    { n->next_ = next; }
 };
 
@@ -66,8 +66,8 @@
    typedef typename real_value_traits::node_traits node_traits;
    typedef typename node_traits::node node;
    typedef typename node_traits::node_ptr node_ptr;
- typedef typename boost::pointer_to_other
- <node_ptr, void>::type void_pointer;
+ typedef typename pointer_traits
+ <node_ptr>::template rebind_pointer <void>::type void_pointer;
    static const bool store_container_ptr =
       detail::store_cont_ptr_on_it<Container>::value;
 
@@ -77,10 +77,10 @@
    typedef typename detail::if_c<IsConst,typename Container::const_reference,typename Container::reference>::type reference;
 
    slist_iterator()
- : members_ (node_ptr(0), 0)
+ : members_ (node_ptr(), 0)
    {}
 
- explicit slist_iterator(node_ptr node, const Container *cont_ptr)
+ explicit slist_iterator(const node_ptr & node, const Container *cont_ptr)
       : members_ (node, cont_ptr)
    {}
 
@@ -118,7 +118,7 @@
    { return *operator->(); }
 
    pointer operator->() const
- { return detail::boost_intrusive_get_pointer(this->get_real_value_traits()->to_value_ptr(members_.nodeptr_)); }
+ { return this->get_real_value_traits()->to_value_ptr(members_.nodeptr_); }
 
    const Container *get_container() const
    {

Modified: branches/release/boost/intrusive/detail/tree_algorithms.hpp
==============================================================================
--- branches/release/boost/intrusive/detail/tree_algorithms.hpp (original)
+++ branches/release/boost/intrusive/detail/tree_algorithms.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -18,7 +18,7 @@
 #include <boost/intrusive/intrusive_fwd.hpp>
 #include <cstddef>
 #include <boost/intrusive/detail/utilities.hpp>
-//iG pending #include <boost/pointer_cast.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 
 namespace boost {
 namespace intrusive {
@@ -106,7 +106,7 @@
    {
       insert_commit_data()
          : link_left(false)
- , node(0)
+ , node()
       {}
       bool link_left;
       node_ptr node;
@@ -114,7 +114,7 @@
 
    struct nop_erase_fixup
    {
- void operator()(node_ptr, node_ptr){}
+ void operator()(const node_ptr&, const node_ptr&){}
    };
 
    /// @cond
@@ -122,7 +122,7 @@
    template<class Disposer>
    struct dispose_subtree_disposer
    {
- dispose_subtree_disposer(Disposer &disp, node_ptr subtree)
+ dispose_subtree_disposer(Disposer &disp, const node_ptr & subtree)
          : disposer_(&disp), subtree_(subtree)
       {}
 
@@ -139,21 +139,19 @@
       node_ptr subtree_;
    };
 
- static node_ptr uncast(const_node_ptr ptr)
- {
- return node_ptr(const_cast<node*>(::boost::intrusive::detail::boost_intrusive_get_pointer(ptr)));
- //iG pending return node_ptr(boost::const_pointer_cast<node>(ptr));
- }
+ static node_ptr uncast(const const_node_ptr & ptr)
+ { return pointer_traits<node_ptr>::const_cast_from(ptr); }
+
    /// @endcond
 
    public:
- static node_ptr begin_node(const_node_ptr header)
+ static node_ptr begin_node(const const_node_ptr & header)
    { return node_traits::get_left(header); }
 
- static node_ptr end_node(const_node_ptr header)
+ static node_ptr end_node(const const_node_ptr & header)
    { return uncast(header); }
 
- //! <b>Requires</b>: node is a node of the tree or an node initialized
+ //! <b>Requires</b>: 'node' is a node of the tree or an node initialized
    //! by init(...) or init_node.
    //!
    //! <b>Effects</b>: Returns true if the node is initialized by init() or init_node().
@@ -161,10 +159,10 @@
    //! <b>Complexity</b>: Constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static bool unique(const_node_ptr node)
+ static bool unique(const const_node_ptr & node)
    { return !NodeTraits::get_parent(node); }
 
- static node_ptr get_header(const_node_ptr node)
+ static node_ptr get_header(const const_node_ptr & node)
    {
       node_ptr h = uncast(node);
       if(NodeTraits::get_parent(node)){
@@ -190,7 +188,7 @@
    //! node1 and node2 are not equivalent according to the ordering rules.
    //!
    //!Experimental function
- static void swap_nodes(node_ptr node1, node_ptr node2)
+ static void swap_nodes(const node_ptr & node1, const node_ptr & node2)
    {
       if(node1 == node2)
          return;
@@ -214,7 +212,7 @@
    //! node1 and node2 are not equivalent according to the ordering rules.
    //!
    //!Experimental function
- static void swap_nodes(node_ptr node1, node_ptr header1, node_ptr node2, node_ptr header2)
+ static void swap_nodes(const node_ptr & node1, const node_ptr & header1, const node_ptr & node2, const node_ptr & header2)
    {
       if(node1 == node2)
          return;
@@ -363,7 +361,7 @@
    //! the node, since no rebalancing and comparison is needed.
    //!
    //!Experimental function
- static void replace_node(node_ptr node_to_be_replaced, node_ptr new_node)
+ static void replace_node(const node_ptr & node_to_be_replaced, const node_ptr & new_node)
    {
       if(node_to_be_replaced == new_node)
          return;
@@ -386,7 +384,7 @@
    //! the node, since no rebalancing or comparison is needed.
    //!
    //!Experimental function
- static void replace_node(node_ptr node_to_be_replaced, node_ptr header, node_ptr new_node)
+ static void replace_node(const node_ptr & node_to_be_replaced, const node_ptr & header, const node_ptr & new_node)
    {
       if(node_to_be_replaced == new_node)
          return;
@@ -429,20 +427,21 @@
       }
    }
 
- //! <b>Requires</b>: p is a node from the tree except the header.
+ //! <b>Requires</b>: 'node' is a node from the tree except the header.
    //!
    //! <b>Effects</b>: Returns the next node of the tree.
    //!
    //! <b>Complexity</b>: Average constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr next_node(node_ptr p)
+ static node_ptr next_node(const node_ptr & node)
    {
- node_ptr p_right(NodeTraits::get_right(p));
+ node_ptr p_right(NodeTraits::get_right(node));
       if(p_right){
          return minimum(p_right);
       }
       else {
+ node_ptr p(node);
          node_ptr x = NodeTraits::get_parent(p);
          while(p == NodeTraits::get_right(x)){
             p = x;
@@ -452,23 +451,24 @@
       }
    }
 
- //! <b>Requires</b>: p is a node from the tree except the leftmost node.
+ //! <b>Requires</b>: 'node' is a node from the tree except the leftmost node.
    //!
    //! <b>Effects</b>: Returns the previous node of the tree.
    //!
    //! <b>Complexity</b>: Average constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr prev_node(node_ptr p)
+ static node_ptr prev_node(const node_ptr & node)
    {
- if(is_header(p)){
- return NodeTraits::get_right(p);
- //return maximum(NodeTraits::get_parent(p));
+ if(is_header(node)){
+ return NodeTraits::get_right(node);
+ //return maximum(NodeTraits::get_parent(node));
       }
- else if(NodeTraits::get_left(p)){
- return maximum(NodeTraits::get_left(p));
+ else if(NodeTraits::get_left(node)){
+ return maximum(NodeTraits::get_left(node));
       }
       else {
+ node_ptr p(node);
          node_ptr x = NodeTraits::get_parent(p);
          while(p == NodeTraits::get_left(x)){
             p = x;
@@ -478,15 +478,16 @@
       }
    }
 
- //! <b>Requires</b>: p is a node of a tree but not the header.
+ //! <b>Requires</b>: 'node' is a node of a tree but not the header.
    //!
    //! <b>Effects</b>: Returns the minimum node of the subtree starting at p.
    //!
    //! <b>Complexity</b>: Logarithmic to the size of the subtree.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr minimum (node_ptr p)
+ static node_ptr minimum (const node_ptr & node)
    {
+ node_ptr p(node);
       for(node_ptr p_left = NodeTraits::get_left(p)
          ;p_left
          ;p_left = NodeTraits::get_left(p)){
@@ -495,15 +496,16 @@
       return p;
    }
 
- //! <b>Requires</b>: p is a node of a tree but not the header.
+ //! <b>Requires</b>: 'node' is a node of a tree but not the header.
    //!
    //! <b>Effects</b>: Returns the maximum node of the subtree starting at p.
    //!
    //! <b>Complexity</b>: Logarithmic to the size of the subtree.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr maximum(node_ptr p)
+ static node_ptr maximum(const node_ptr & node)
    {
+ node_ptr p(node);
       for(node_ptr p_right = NodeTraits::get_right(p)
          ;p_right
          ;p_right = NodeTraits::get_right(p)){
@@ -512,7 +514,7 @@
       return p;
    }
 
- //! <b>Requires</b>: node must not be part of any tree.
+ //! <b>Requires</b>: 'node' must not be part of any tree.
    //!
    //! <b>Effects</b>: After the function unique(node) == true.
    //!
@@ -521,11 +523,11 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Nodes</b>: If node is inserted in a tree, this function corrupts the tree.
- static void init(node_ptr node)
+ static void init(const node_ptr & node)
    {
- NodeTraits::set_parent(node, node_ptr(0));
- NodeTraits::set_left(node, node_ptr(0));
- NodeTraits::set_right(node, node_ptr(0));
+ NodeTraits::set_parent(node, node_ptr());
+ NodeTraits::set_left(node, node_ptr());
+ NodeTraits::set_right(node, node_ptr());
    };
 
    //! <b>Effects</b>: Returns true if node is in the same state as if called init(node)
@@ -533,7 +535,7 @@
    //! <b>Complexity</b>: Constant.
    //!
    //! <b>Throws</b>: Nothing.
- static bool inited(const_node_ptr node)
+ static bool inited(const const_node_ptr & node)
    {
       return !NodeTraits::get_parent(node) &&
              !NodeTraits::get_left(node) &&
@@ -550,9 +552,9 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Nodes</b>: If node is inserted in a tree, this function corrupts the tree.
- static void init_header(node_ptr header)
+ static void init_header(const node_ptr & header)
    {
- NodeTraits::set_parent(header, node_ptr(0));
+ NodeTraits::set_parent(header, node_ptr());
       NodeTraits::set_left(header, header);
       NodeTraits::set_right(header, header);
    }
@@ -561,7 +563,7 @@
    //! taking a node_ptr parameter and shouldn't throw.
    //!
    //! <b>Effects</b>: Empties the target tree calling
- //! <tt>void disposer::operator()(node_ptr)</tt> for every node of the tree
+ //! <tt>void disposer::operator()(const node_ptr &)</tt> for every node of the tree
    //! except the header.
    //!
    //! <b>Complexity</b>: Linear to the number of element of the source tree plus the.
@@ -569,7 +571,7 @@
    //!
    //! <b>Throws</b>: If cloner functor throws. If this happens target nodes are disposed.
    template<class Disposer>
- static void clear_and_dispose(node_ptr header, Disposer disposer)
+ static void clear_and_dispose(const node_ptr & header, Disposer disposer)
    {
       node_ptr source_root = NodeTraits::get_parent(header);
       if(!source_root)
@@ -591,11 +593,11 @@
    //! only be used for more unlink_leftmost_without_rebalance calls.
    //! This function is normally used to achieve a step by step
    //! controlled destruction of the tree.
- static node_ptr unlink_leftmost_without_rebalance(node_ptr header)
+ static node_ptr unlink_leftmost_without_rebalance(const node_ptr & header)
    {
       node_ptr leftmost = NodeTraits::get_left(header);
       if (leftmost == header)
- return node_ptr(0);
+ return node_ptr();
       node_ptr leftmost_parent(NodeTraits::get_parent(leftmost));
       node_ptr leftmost_right (NodeTraits::get_right(leftmost));
       bool is_root = leftmost_parent == header;
@@ -610,12 +612,12 @@
             NodeTraits::set_left(NodeTraits::get_parent(header), leftmost_right);
       }
       else if (is_root){
- NodeTraits::set_parent(header, node_ptr(0));
+ NodeTraits::set_parent(header, node_ptr());
          NodeTraits::set_left(header, header);
          NodeTraits::set_right(header, header);
       }
       else{
- NodeTraits::set_left(leftmost_parent, node_ptr(0));
+ NodeTraits::set_left(leftmost_parent, node_ptr());
          NodeTraits::set_left(header, leftmost_parent);
       }
       return leftmost;
@@ -628,7 +630,7 @@
    //! <b>Complexity</b>: Linear time.
    //!
    //! <b>Throws</b>: Nothing.
- static std::size_t count(const_node_ptr subtree)
+ static std::size_t count(const const_node_ptr & subtree)
    {
       if(!subtree) return 0;
       std::size_t count = 0;
@@ -664,7 +666,7 @@
    //! <b>Complexity</b>: Linear time.
    //!
    //! <b>Throws</b>: Nothing.
- static std::size_t size(const_node_ptr header)
+ static std::size_t size(const const_node_ptr & header)
    {
       node_ptr beg(begin_node(header));
       node_ptr end(end_node(header));
@@ -682,7 +684,7 @@
    //! <b>Complexity</b>: Constant.
    //!
    //! <b>Throws</b>: Nothing.
- static void swap_tree(node_ptr header1, node_ptr header2)
+ static void swap_tree(const node_ptr & header1, const node_ptr & header2)
    {
       if(header1 == header2)
          return;
@@ -722,7 +724,7 @@
       }
    }
 
- static bool is_header(const_node_ptr p)
+ static bool is_header(const const_node_ptr & p)
    {
       node_ptr p_left (NodeTraits::get_left(p));
       node_ptr p_right(NodeTraits::get_right(p));
@@ -752,7 +754,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static node_ptr find
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    {
       node_ptr end = uncast(header);
       node_ptr y = lower_bound(header, key, comp);
@@ -774,7 +776,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static std::pair<node_ptr, node_ptr> equal_range
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    {
       node_ptr y = uncast(header);
       node_ptr x = NodeTraits::get_parent(header);
@@ -831,7 +833,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static node_ptr lower_bound
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    {
       node_ptr y = uncast(header);
       node_ptr x = NodeTraits::get_parent(header);
@@ -860,7 +862,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static node_ptr upper_bound
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    {
       node_ptr y = uncast(header);
       node_ptr x = NodeTraits::get_parent(header);
@@ -894,14 +896,14 @@
    //! previously executed to fill "commit_data". No value should be inserted or
    //! erased between the "insert_check" and "insert_commit" calls.
    static void insert_unique_commit
- (node_ptr header, node_ptr new_value, const insert_commit_data &commit_data)
+ (const node_ptr & header, const node_ptr & new_value, const insert_commit_data &commit_data)
    { return insert_commit(header, new_value, commit_data); }
 
    static void insert_commit
- (node_ptr header, node_ptr new_node, const insert_commit_data &commit_data)
+ (const node_ptr & header, const node_ptr & new_node, const insert_commit_data &commit_data)
    {
       //Check if commit_data has not been initialized by a insert_unique_check call.
- BOOST_INTRUSIVE_INVARIANT_ASSERT(commit_data.node != 0);
+ BOOST_INTRUSIVE_INVARIANT_ASSERT(commit_data.node != node_ptr());
       node_ptr parent_node(commit_data.node);
       if(parent_node == header){
          NodeTraits::set_parent(header, new_node);
@@ -919,8 +921,8 @@
              NodeTraits::set_right(header, new_node);
       }
       NodeTraits::set_parent(new_node, parent_node);
- NodeTraits::set_right(new_node, node_ptr(0));
- NodeTraits::set_left(new_node, node_ptr(0));
+ NodeTraits::set_right(new_node, node_ptr());
+ NodeTraits::set_left(new_node, node_ptr());
    }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -959,14 +961,14 @@
    //! if no more objects are inserted or erased from the set.
    template<class KeyType, class KeyNodePtrCompare>
    static std::pair<node_ptr, bool> insert_unique_check
- (const_node_ptr header, const KeyType &key
+ (const const_node_ptr & header, const KeyType &key
       ,KeyNodePtrCompare comp, insert_commit_data &commit_data, std::size_t *pdepth = 0)
    {
       std::size_t depth = 0;
       node_ptr h(uncast(header));
       node_ptr y(h);
       node_ptr x(NodeTraits::get_parent(y));
- node_ptr prev(0);
+ node_ptr prev = node_ptr();
 
       //Find the upper bound, cache the previous value and if we should
       //store it in the left or right node
@@ -997,7 +999,7 @@
 
    template<class KeyType, class KeyNodePtrCompare>
    static std::pair<node_ptr, bool> insert_unique_check
- (const_node_ptr header, node_ptr hint, const KeyType &key
+ (const const_node_ptr & header, const node_ptr &hint, const KeyType &key
       ,KeyNodePtrCompare comp, insert_commit_data &commit_data, std::size_t *pdepth = 0)
    {
       //hint must be bigger than the key
@@ -1019,7 +1021,7 @@
 
    template<class NodePtrCompare>
    static void insert_equal_check
- ( node_ptr header, node_ptr hint, node_ptr new_node, NodePtrCompare comp
+ (const node_ptr &header, const node_ptr & hint, const node_ptr & new_node, NodePtrCompare comp
       , insert_commit_data &commit_data, std::size_t *pdepth = 0)
    {
       if(hint == header || !comp(hint, new_node)){
@@ -1044,17 +1046,17 @@
 
    template<class NodePtrCompare>
    static void insert_equal_upper_bound_check
- (node_ptr h, node_ptr new_node, NodePtrCompare comp, insert_commit_data & commit_data, std::size_t *pdepth = 0)
+ (const node_ptr & h, const node_ptr & new_node, NodePtrCompare comp, insert_commit_data & commit_data, std::size_t *pdepth = 0)
    { insert_equal_check_impl(true, h, new_node, comp, commit_data, pdepth); }
 
    template<class NodePtrCompare>
    static void insert_equal_lower_bound_check
- (node_ptr h, node_ptr new_node, NodePtrCompare comp, insert_commit_data & commit_data, std::size_t *pdepth = 0)
+ (const node_ptr & h, const node_ptr & new_node, NodePtrCompare comp, insert_commit_data & commit_data, std::size_t *pdepth = 0)
    { insert_equal_check_impl(false, h, new_node, comp, commit_data, pdepth); }
 
    template<class NodePtrCompare>
    static node_ptr insert_equal
- (node_ptr h, node_ptr hint, node_ptr new_node, NodePtrCompare comp, std::size_t *pdepth = 0)
+ (const node_ptr & h, const node_ptr & hint, const node_ptr & new_node, NodePtrCompare comp, std::size_t *pdepth = 0)
    {
       insert_commit_data commit_data;
       insert_equal_check(h, hint, new_node, comp, commit_data, pdepth);
@@ -1064,7 +1066,7 @@
 
    template<class NodePtrCompare>
    static node_ptr insert_equal_upper_bound
- (node_ptr h, node_ptr new_node, NodePtrCompare comp, std::size_t *pdepth = 0)
+ (const node_ptr & h, const node_ptr & new_node, NodePtrCompare comp, std::size_t *pdepth = 0)
    {
       insert_commit_data commit_data;
       insert_equal_upper_bound_check(h, new_node, comp, commit_data, pdepth);
@@ -1074,7 +1076,7 @@
 
    template<class NodePtrCompare>
    static node_ptr insert_equal_lower_bound
- (node_ptr h, node_ptr new_node, NodePtrCompare comp, std::size_t *pdepth = 0)
+ (const node_ptr & h, const node_ptr & new_node, NodePtrCompare comp, std::size_t *pdepth = 0)
    {
       insert_commit_data commit_data;
       insert_equal_lower_bound_check(h, new_node, comp, commit_data, pdepth);
@@ -1083,7 +1085,7 @@
    }
 
    static node_ptr insert_before
- (node_ptr header, node_ptr pos, node_ptr new_node, std::size_t *pdepth = 0)
+ (const node_ptr & header, const node_ptr & pos, const node_ptr & new_node, std::size_t *pdepth = 0)
    {
       insert_commit_data commit_data;
       insert_before_check(header, pos, commit_data, pdepth);
@@ -1092,7 +1094,7 @@
    }
 
    static void insert_before_check
- ( node_ptr header, node_ptr pos
+ (const node_ptr &header, const node_ptr & pos
       , insert_commit_data &commit_data, std::size_t *pdepth = 0)
    {
       node_ptr prev(pos);
@@ -1107,7 +1109,7 @@
    }
 
    static void push_back
- (node_ptr header, node_ptr new_node, std::size_t *pdepth = 0)
+ (const node_ptr & header, const node_ptr & new_node, std::size_t *pdepth = 0)
    {
       insert_commit_data commit_data;
       push_back_check(header, commit_data, pdepth);
@@ -1115,7 +1117,7 @@
    }
 
    static void push_back_check
- (node_ptr header, insert_commit_data &commit_data, std::size_t *pdepth = 0)
+ (const node_ptr & header, insert_commit_data &commit_data, std::size_t *pdepth = 0)
    {
       node_ptr prev(NodeTraits::get_right(header));
       if(pdepth){
@@ -1126,7 +1128,7 @@
    }
 
    static void push_front
- (node_ptr header, node_ptr new_node, std::size_t *pdepth = 0)
+ (const node_ptr & header, const node_ptr & new_node, std::size_t *pdepth = 0)
    {
       insert_commit_data commit_data;
       push_front_check(header, commit_data, pdepth);
@@ -1134,7 +1136,7 @@
    }
 
    static void push_front_check
- (node_ptr header, insert_commit_data &commit_data, std::size_t *pdepth = 0)
+ (const node_ptr & header, insert_commit_data &commit_data, std::size_t *pdepth = 0)
    {
       node_ptr pos(NodeTraits::get_left(header));
       if(pdepth){
@@ -1144,7 +1146,7 @@
       commit_data.node = pos;
    }
 
- //! <b>Requires</b>: p can't be a header node.
+ //! <b>Requires</b>: 'node' can't be a header node.
    //!
    //! <b>Effects</b>: Calculates the depth of a node: the depth of a
    //! node is the length (number of edges) of the path from the root
@@ -1153,8 +1155,9 @@
    //! <b>Complexity</b>: Logarithmic to the number of nodes in the tree.
    //!
    //! <b>Throws</b>: Nothing.
- static std::size_t depth(const_node_ptr p)
+ static std::size_t depth(const const_node_ptr & node)
    {
+ const_node_ptr p(node);
       std::size_t depth = 0;
       node_ptr p_parent;
       while(p != NodeTraits::get_parent(p_parent = NodeTraits::get_parent(p))){
@@ -1169,13 +1172,13 @@
    //! take a node_ptr and shouldn't throw.
    //!
    //! <b>Effects</b>: First empties target tree calling
- //! <tt>void disposer::operator()(node_ptr)</tt> for every node of the tree
+ //! <tt>void disposer::operator()(const node_ptr &)</tt> for every node of the tree
    //! except the header.
    //!
    //! Then, duplicates the entire tree pointed by "source_header" cloning each
- //! source node with <tt>node_ptr Cloner::operator()(node_ptr)</tt> to obtain
+ //! source node with <tt>node_ptr Cloner::operator()(const node_ptr &)</tt> to obtain
    //! the nodes of the target tree. If "cloner" throws, the cloned target nodes
- //! are disposed using <tt>void disposer(node_ptr)</tt>.
+ //! are disposed using <tt>void disposer(const node_ptr &)</tt>.
    //!
    //! <b>Complexity</b>: Linear to the number of element of the source tree plus the.
    //! number of elements of tree target tree when calling this function.
@@ -1183,7 +1186,7 @@
    //! <b>Throws</b>: If cloner functor throws. If this happens target nodes are disposed.
    template <class Cloner, class Disposer>
    static void clone
- (const_node_ptr source_header, node_ptr target_header, Cloner cloner, Disposer disposer)
+ (const const_node_ptr & source_header, const node_ptr & target_header, Cloner cloner, Disposer disposer)
    {
       if(!unique(target_header)){
          clear_and_dispose(target_header, disposer);
@@ -1201,9 +1204,9 @@
 
    template <class Cloner, class Disposer>
    static node_ptr clone_subtree
- ( const_node_ptr source_parent, node_ptr target_parent
- , Cloner cloner, Disposer disposer
- , node_ptr &leftmost_out, node_ptr &rightmost_out
+ (const const_node_ptr &source_parent, const node_ptr &target_parent
+ , Cloner cloner, Disposer disposer
+ , node_ptr &leftmost_out, node_ptr &rightmost_out
       )
    {
       node_ptr target_sub_root = target_parent;
@@ -1221,8 +1224,8 @@
          node_ptr rightmost = target_sub_root;
 
          //First set the subroot
- NodeTraits::set_left(target_sub_root, node_ptr(0));
- NodeTraits::set_right(target_sub_root, node_ptr(0));
+ NodeTraits::set_left(target_sub_root, node_ptr());
+ NodeTraits::set_right(target_sub_root, node_ptr());
          NodeTraits::set_parent(target_sub_root, target_parent);
 
          dispose_subtree_disposer<Disposer> rollback(disposer, target_sub_root);
@@ -1234,8 +1237,8 @@
                node_ptr temp = insertion_point;
                //Clone and mark as leaf
                insertion_point = cloner(current);
- NodeTraits::set_left (insertion_point, node_ptr(0));
- NodeTraits::set_right (insertion_point, node_ptr(0));
+ NodeTraits::set_left (insertion_point, node_ptr());
+ NodeTraits::set_right (insertion_point, node_ptr());
                //Insert left
                NodeTraits::set_parent(insertion_point, temp);
                NodeTraits::set_left (temp, insertion_point);
@@ -1250,8 +1253,8 @@
                node_ptr temp = insertion_point;
                //Clone and mark as leaf
                insertion_point = cloner(current);
- NodeTraits::set_left (insertion_point, node_ptr(0));
- NodeTraits::set_right (insertion_point, node_ptr(0));
+ NodeTraits::set_left (insertion_point, node_ptr());
+ NodeTraits::set_right (insertion_point, node_ptr());
                //Insert right
                NodeTraits::set_parent(insertion_point, temp);
                NodeTraits::set_right (temp, insertion_point);
@@ -1276,9 +1279,10 @@
    }
 
    template<class Disposer>
- static void dispose_subtree(node_ptr x, Disposer disposer)
+ static void dispose_subtree(const node_ptr & node, Disposer disposer)
    {
       node_ptr save;
+ node_ptr x(node);
       while (x){
          save = NodeTraits::get_left(x);
          if (save) {
@@ -1302,7 +1306,7 @@
    //! <b>Complexity</b>: Constant.
    //!
    //! <b>Throws</b>: Nothing.
- static bool is_left_child(node_ptr p)
+ static bool is_left_child(const node_ptr & p)
    { return NodeTraits::get_left(NodeTraits::get_parent(p)) == p; }
 
    //! <b>Requires</b>: p is a node of a tree.
@@ -1312,11 +1316,11 @@
    //! <b>Complexity</b>: Constant.
    //!
    //! <b>Throws</b>: Nothing.
- static bool is_right_child(node_ptr p)
+ static bool is_right_child(const node_ptr & p)
    { return NodeTraits::get_right(NodeTraits::get_parent(p)) == p; }
 
    //Fix header and own's parent data when replacing x with own, providing own's old data with parent
- static void replace_own_impl(node_ptr own, node_ptr x, node_ptr header, node_ptr own_parent, bool own_was_left)
+ static void replace_own_impl(const node_ptr & own, const node_ptr & x, const node_ptr & header, const node_ptr & own_parent, bool own_was_left)
    {
       if(NodeTraits::get_parent(header) == own)
          NodeTraits::set_parent(header, x);
@@ -1328,7 +1332,7 @@
 
    //Fix header and own's parent data when replacing x with own, supposing own
    //links with its parent are still ok
- static void replace_own(node_ptr own, node_ptr x, node_ptr header)
+ static void replace_own(const node_ptr & own, const node_ptr & x, const node_ptr & header)
    {
       node_ptr own_parent(NodeTraits::get_parent(own));
       bool own_is_left(NodeTraits::get_left(own_parent) == own);
@@ -1336,7 +1340,7 @@
    }
 
    // rotate parent p to left (no header and p's parent fixup)
- static node_ptr rotate_left(node_ptr p)
+ static node_ptr rotate_left(const node_ptr & p)
    {
       node_ptr x(NodeTraits::get_right(p));
       node_ptr x_left(NodeTraits::get_left(x));
@@ -1350,7 +1354,7 @@
    }
 
    // rotate parent p to left (with header and p's parent fixup)
- static void rotate_left(node_ptr p, node_ptr header)
+ static void rotate_left(const node_ptr & p, const node_ptr & header)
    {
       bool p_was_left(is_left_child(p));
       node_ptr p_old_parent(NodeTraits::get_parent(p));
@@ -1360,7 +1364,7 @@
    }
 
    // rotate parent p to right (no header and p's parent fixup)
- static node_ptr rotate_right(node_ptr p)
+ static node_ptr rotate_right(const node_ptr & p)
    {
       node_ptr x(NodeTraits::get_left(p));
       node_ptr x_right(NodeTraits::get_right(x));
@@ -1374,7 +1378,7 @@
    }
 
    // rotate parent p to right (with header and p's parent fixup)
- static void rotate_right(node_ptr p, node_ptr header)
+ static void rotate_right(const node_ptr & p, const node_ptr & header)
    {
       bool p_was_left(is_left_child(p));
       node_ptr p_old_parent(NodeTraits::get_parent(p));
@@ -1383,7 +1387,7 @@
       replace_own_impl(p, x, header, p_old_parent, p_was_left);
    }
 
- static void erase(node_ptr header, node_ptr z)
+ static void erase(const node_ptr & header, const node_ptr & z)
    {
       data_for_rebalance ignored;
       erase_impl(header, z, ignored);
@@ -1397,7 +1401,7 @@
    };
 
    template<class F>
- static void erase(node_ptr header, node_ptr z, F z_and_successor_fixup, data_for_rebalance &info)
+ static void erase(const node_ptr & header, const node_ptr & z, F z_and_successor_fixup, data_for_rebalance &info)
    {
       erase_impl(header, z, info);
       if(info.y != z){
@@ -1405,7 +1409,7 @@
       }
    }
 
- static void unlink(node_ptr node)
+ static void unlink(const node_ptr & node)
    {
       node_ptr x = NodeTraits::get_parent(node);
       if(x){
@@ -1415,13 +1419,13 @@
       }
    }
 
- static void tree_to_vine(node_ptr header)
+ static void tree_to_vine(const node_ptr & header)
    { subtree_to_vine(NodeTraits::get_parent(header)); }
 
- static void vine_to_tree(node_ptr header, std::size_t count)
+ static void vine_to_tree(const node_ptr & header, std::size_t count)
    { vine_to_subtree(NodeTraits::get_parent(header), count); }
 
- static void rebalance(node_ptr header)
+ static void rebalance(const node_ptr & header)
    {
       //Taken from:
       //"Tree rebalancing in optimal time and space"
@@ -1431,18 +1435,18 @@
       vine_to_subtree(NodeTraits::get_parent(header), len);
    }
 
- static node_ptr rebalance_subtree(node_ptr old_root)
+ static node_ptr rebalance_subtree(const node_ptr & old_root)
    {
       std::size_t len = 0;
       node_ptr new_root = subtree_to_vine(old_root, &len);
       return vine_to_subtree(new_root, len);
    }
 
- static node_ptr subtree_to_vine(node_ptr old_root, std::size_t *plen = 0)
+ static node_ptr subtree_to_vine(const node_ptr & old_root, std::size_t *plen = 0)
    {
       std::size_t len;
       len = 0;
- if(!old_root) return node_ptr(0);
+ if(!old_root) return node_ptr();
 
       //To avoid irregularities in the algorithm (old_root can be a
       //left or right child or even the root of the tree) just put the
@@ -1499,7 +1503,7 @@
       return new_root;
    }
 
- static node_ptr vine_to_subtree(node_ptr old_root, std::size_t count)
+ static node_ptr vine_to_subtree(const node_ptr & old_root, std::size_t count)
    {
       std::size_t leaf_nodes = count + 1 - ((std::size_t) 1 << floor_log2 (count + 1));
       std::size_t vine_nodes = count - leaf_nodes;
@@ -1512,7 +1516,7 @@
       return new_root;
    }
 
- static node_ptr compress_subtree(node_ptr old_root, std::size_t count)
+ static node_ptr compress_subtree(const node_ptr & old_root, std::size_t count)
    {
       if(!old_root) return old_root;
 
@@ -1576,7 +1580,7 @@
    //! <b>Complexity</b>: Logarithmic.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr get_root(node_ptr node)
+ static node_ptr get_root(const node_ptr & node)
    {
       BOOST_INTRUSIVE_INVARIANT_ASSERT((!inited(node)));
       node_ptr x = NodeTraits::get_parent(node);
@@ -1594,7 +1598,7 @@
    private:
    template<class NodePtrCompare>
    static void insert_equal_check_impl
- (bool upper, node_ptr h, node_ptr new_node, NodePtrCompare comp, insert_commit_data & commit_data, std::size_t *pdepth = 0)
+ (bool upper, const node_ptr & h, const node_ptr & new_node, NodePtrCompare comp, insert_commit_data & commit_data, std::size_t *pdepth = 0)
    {
       std::size_t depth = 0;
       node_ptr y(h);
@@ -1625,11 +1629,11 @@
       if(pdepth) *pdepth = depth;
    }
 
- static void erase_impl(node_ptr header, node_ptr z, data_for_rebalance &info)
+ static void erase_impl(const node_ptr & header, const node_ptr & z, data_for_rebalance &info)
    {
       node_ptr y(z);
       node_ptr x;
- node_ptr x_parent(0);
+ node_ptr x_parent = node_ptr();
       node_ptr z_left(NodeTraits::get_left(z));
       node_ptr z_right(NodeTraits::get_right(z));
       if(!z_left){

Modified: branches/release/boost/intrusive/detail/tree_node.hpp
==============================================================================
--- branches/release/boost/intrusive/detail/tree_node.hpp (original)
+++ branches/release/boost/intrusive/detail/tree_node.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -15,7 +15,7 @@
 
 #include <boost/intrusive/detail/config_begin.hpp>
 #include <iterator>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/detail/mpl.hpp>
 
 namespace boost {
@@ -24,9 +24,9 @@
 template<class VoidPointer>
 struct tree_node
 {
- typedef typename pointer_to_other
- <VoidPointer
- ,tree_node<VoidPointer> >::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer
+ <tree_node<VoidPointer> >::type node_ptr;
 
    node_ptr parent_, left_, right_;
 };
@@ -36,27 +36,27 @@
 {
    typedef tree_node<VoidPointer> node;
 
- typedef typename boost::pointer_to_other
- <VoidPointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <VoidPointer, const node>::type const_node_ptr;
+ typedef typename pointer_traits<VoidPointer>::template
+ rebind_pointer<node>::type node_ptr;
+ typedef typename pointer_traits<VoidPointer>::template
+ rebind_pointer<const node>::type const_node_ptr;
 
- static node_ptr get_parent(const_node_ptr n)
+ static const node_ptr & get_parent(const const_node_ptr & n)
    { return n->parent_; }
 
- static void set_parent(node_ptr n, node_ptr p)
+ static void set_parent(const node_ptr & n, const node_ptr & p)
    { n->parent_ = p; }
 
- static node_ptr get_left(const_node_ptr n)
+ static const node_ptr & get_left(const const_node_ptr & n)
    { return n->left_; }
 
- static void set_left(node_ptr n, node_ptr l)
+ static void set_left(const node_ptr & n, const node_ptr & l)
    { n->left_ = l; }
 
- static node_ptr get_right(const_node_ptr n)
+ static const node_ptr & get_right(const const_node_ptr & n)
    { return n->right_; }
 
- static void set_right(node_ptr n, node_ptr r)
+ static void set_right(const node_ptr & n, const node_ptr & r)
    { n->right_ = r; }
 };
 
@@ -84,8 +84,8 @@
    typedef typename real_value_traits::node_traits node_traits;
    typedef typename node_traits::node node;
    typedef typename node_traits::node_ptr node_ptr;
- typedef typename boost::pointer_to_other
- <node_ptr, void>::type void_pointer;
+ typedef typename pointer_traits<node_ptr>::template
+ rebind_pointer<void>::type void_pointer;
    static const bool store_container_ptr =
       detail::store_cont_ptr_on_it<Container>::value;
 
@@ -96,10 +96,10 @@
 
 
    tree_iterator()
- : members_ (node_ptr(0), (const void *)0)
+ : members_ (node_ptr(), (const void *)0)
    {}
 
- explicit tree_iterator(node_ptr nodeptr, const Container *cont_ptr)
+ explicit tree_iterator(const node_ptr & nodeptr, const Container *cont_ptr)
       : members_ (nodeptr, cont_ptr)
    {}
 
@@ -150,7 +150,7 @@
    { return *operator->(); }
 
    pointer operator->() const
- { return detail::boost_intrusive_get_pointer(this->get_real_value_traits()->to_value_ptr(members_.nodeptr_)); }
+ { return this->get_real_value_traits()->to_value_ptr(members_.nodeptr_); }
 
    const Container *get_container() const
    { return static_cast<const Container*>(members_.get_ptr()); }

Modified: branches/release/boost/intrusive/detail/utilities.hpp
==============================================================================
--- branches/release/boost/intrusive/detail/utilities.hpp (original)
+++ branches/release/boost/intrusive/detail/utilities.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -14,13 +14,14 @@
 #define BOOST_INTRUSIVE_DETAIL_UTILITIES_HPP
 
 #include <boost/intrusive/detail/config_begin.hpp>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/detail/parent_from_member.hpp>
 #include <boost/intrusive/detail/ebo_functor_holder.hpp>
 #include <boost/intrusive/link_mode.hpp>
 #include <boost/intrusive/detail/mpl.hpp>
 #include <boost/intrusive/detail/assert.hpp>
 #include <boost/intrusive/detail/is_stateful_value_traits.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/cstdint.hpp>
 #include <cstddef>
 #include <climits>
@@ -104,29 +105,14 @@
    : public Node
 {};
 
-template<class SmartPtr>
-struct smart_ptr_type
-{
- typedef typename SmartPtr::value_type value_type;
- typedef value_type *pointer;
- static pointer get (const SmartPtr &smartptr)
- { return smartptr.get();}
-};
-
-template<class T>
-struct smart_ptr_type<T*>
-{
- typedef T value_type;
- typedef value_type *pointer;
- static pointer get (pointer ptr)
- { return ptr;}
-};
+template <class T>
+inline T* to_raw_pointer(T* p)
+{ return p; }
 
-//!Overload for smart pointers to avoid ADL problems with boost_intrusive_get_pointer
-template<class Ptr>
-inline typename smart_ptr_type<Ptr>::pointer
-boost_intrusive_get_pointer(const Ptr &ptr)
-{ return smart_ptr_type<Ptr>::get(ptr); }
+template <class Pointer>
+inline typename boost::intrusive::pointer_traits<Pointer>::element_type*
+to_raw_pointer(const Pointer &p)
+{ return boost::intrusive::detail::to_raw_pointer(p.operator->()); }
 
 //This functor compares a stored value
 //and the one passed as an argument
@@ -158,7 +144,7 @@
    typedef typename NodeAlgorithms::node_ptr node_ptr;
 
    public:
- void operator()(node_ptr p)
+ void operator()(const node_ptr & p)
    { NodeAlgorithms::init(p); }
 };
 
@@ -258,13 +244,14 @@
       : base_t(f), cont_(cont)
    {}
 
- node_ptr operator()(node_ptr p)
+ node_ptr operator()(const node_ptr & p)
    { return this->operator()(*p); }
 
    node_ptr operator()(const node &to_clone)
    {
       const value_type &v =
- *cont_->get_real_value_traits().to_value_ptr(const_node_ptr(&to_clone));
+ *cont_->get_real_value_traits().to_value_ptr
+ (pointer_traits<const_node_ptr>::pointer_to(to_clone));
       node_ptr n = cont_->get_real_value_traits().to_node_ptr(*base_t::get()(v));
       //Cloned node must be in default mode if the linking mode requires it
       if(safemode_or_autounlink)
@@ -291,7 +278,7 @@
       : base_t(f), cont_(cont)
    {}
 
- void operator()(node_ptr p)
+ void operator()(const node_ptr & p)
    {
       if(safemode_or_autounlink)
          node_algorithms::init(p);
@@ -312,15 +299,15 @@
 template<class VoidPointer>
 struct constptr
 {
- typedef typename boost::pointer_to_other
- <VoidPointer, const void>::type ConstVoidPtr;
+ typedef typename boost::intrusive::pointer_traits<VoidPointer>::
+ template rebind_pointer<const void>::type ConstVoidPtr;
 
    constptr(const void *ptr)
       : const_void_ptr_(ptr)
    {}
 
    const void *get_ptr() const
- { return detail::boost_intrusive_get_pointer(const_void_ptr_); }
+ { return boost::intrusive::detail::to_raw_pointer(const_void_ptr_); }
 
    ConstVoidPtr const_void_ptr_;
 };
@@ -371,27 +358,49 @@
    public:
    typedef detail::node_holder
       <typename NodeTraits::node, Tag, LinkMode, HookType> node_holder;
+ typedef typename NodeTraits::node node;
    typedef NodeTraits node_traits;
    typedef T value_type;
    typedef typename node_traits::node_ptr node_ptr;
    typedef typename node_traits::const_node_ptr const_node_ptr;
- typedef typename boost::pointer_to_other<node_ptr, T>::type pointer;
- typedef typename boost::pointer_to_other<node_ptr, const T>::type const_pointer;
- typedef typename std::iterator_traits<pointer>::reference reference;
- typedef typename std::iterator_traits<const_pointer>::reference const_reference;
+ typedef typename pointer_traits<node_ptr>::
+ template rebind_pointer<T>::type pointer;
+ typedef typename pointer_traits<node_ptr>::
+ template rebind_pointer<const T>::type const_pointer;
+ //typedef typename pointer_traits<pointer>::reference reference;
+ //typedef typename pointer_traits<const_pointer>::reference const_reference;
+ typedef T & reference;
+ typedef const T & const_reference;
+ typedef node_holder & node_holder_reference;
+ typedef const node_holder & const_node_holder_reference;
+ typedef node& node_reference;
+ typedef const node & const_node_reference;
+
    static const link_mode_type link_mode = LinkMode;
 
- static node_ptr to_node_ptr(reference value)
- { return static_cast<node_holder*>(&value); }
+ static pointer to_value_ptr(const node_ptr & n)
+ {
+ return pointer_traits<pointer>::pointer_to
+ (static_cast<reference>(static_cast<node_holder_reference>(*n)));
+ }
 
- static const_node_ptr to_node_ptr(const_reference value)
- { return static_cast<const node_holder*>(&value); }
+ static const_pointer to_value_ptr(const const_node_ptr & n)
+ {
+ return pointer_traits<const_pointer>::pointer_to
+ (static_cast<const_reference>(static_cast<const_node_holder_reference>(*n)));
+ }
 
- static pointer to_value_ptr(node_ptr n)
- { return static_cast<T*>(static_cast<node_holder*>(&*n)); }
+ static node_ptr to_node_ptr(reference value)
+ {
+ return pointer_traits<node_ptr>::pointer_to
+ (static_cast<node_reference>(static_cast<node_holder_reference>(value)));
+ }
 
- static const_pointer to_value_ptr(const_node_ptr n)
- { return static_cast<const T*>(static_cast<const node_holder*>(&*n)); }
+ static const_node_ptr to_node_ptr(const_reference value)
+ {
+ return pointer_traits<const_node_ptr>::pointer_to
+ (static_cast<const_node_reference>(static_cast<const_node_holder_reference>(value)));
+ }
 };
 
 template<class T, class Hook, Hook T::* P>
@@ -404,28 +413,43 @@
    typedef T value_type;
    typedef typename node_traits::node_ptr node_ptr;
    typedef typename node_traits::const_node_ptr const_node_ptr;
- typedef typename boost::pointer_to_other<node_ptr, T>::type pointer;
- typedef typename boost::pointer_to_other<node_ptr, const T>::type const_pointer;
- typedef typename std::iterator_traits<pointer>::reference reference;
- typedef typename std::iterator_traits<const_pointer>::reference const_reference;
+ typedef typename pointer_traits<node_ptr>::
+ template rebind_pointer<T>::type pointer;
+ typedef typename pointer_traits<node_ptr>::
+ template rebind_pointer<const T>::type const_pointer;
+ typedef T & reference;
+ typedef const T & const_reference;
+ typedef node& node_reference;
+ typedef const node & const_node_reference;
+ typedef hook_type& hook_reference;
+ typedef const hook_type & const_hook_reference;
+
    static const link_mode_type link_mode = Hook::boost_intrusive_tags::link_mode;
 
    static node_ptr to_node_ptr(reference value)
- { return static_cast<node*>(&(value.*P)); }
+ {
+ return pointer_traits<node_ptr>::pointer_to
+ (static_cast<node_reference>(static_cast<hook_reference>(value.*P)));
+ }
 
    static const_node_ptr to_node_ptr(const_reference value)
- { return static_cast<const node*>(&(value.*P)); }
+ {
+ return pointer_traits<const_node_ptr>::pointer_to
+ (static_cast<const_node_reference>(static_cast<const_hook_reference>(value.*P)));
+ }
 
- static pointer to_value_ptr(node_ptr n)
+ static pointer to_value_ptr(const node_ptr & n)
    {
- return detail::parent_from_member<T, Hook>
- (static_cast<Hook*>(detail::boost_intrusive_get_pointer(n)), P);
+ return pointer_traits<pointer>::pointer_to
+ (*detail::parent_from_member<T, Hook>
+ (static_cast<Hook*>(boost::intrusive::detail::to_raw_pointer(n)), P));
    }
 
- static const_pointer to_value_ptr(const_node_ptr n)
+ static const_pointer to_value_ptr(const const_node_ptr & n)
    {
- return detail::parent_from_member<T, Hook>
- (static_cast<const Hook*>(detail::boost_intrusive_get_pointer(n)), P);
+ return pointer_traits<const_pointer>::pointer_to
+ (*detail::parent_from_member<T, Hook>
+ (static_cast<const Hook*>(boost::intrusive::detail::to_raw_pointer(n)), P));
    }
 };
 
@@ -441,29 +465,31 @@
    typedef typename Functor::value_type value_type;
    typedef typename node_traits::node_ptr node_ptr;
    typedef typename node_traits::const_node_ptr const_node_ptr;
- typedef typename boost::pointer_to_other<node_ptr, value_type>::type pointer;
- typedef typename boost::pointer_to_other<node_ptr, const value_type>::type const_pointer;
- typedef typename std::iterator_traits<pointer>::reference reference;
- typedef typename std::iterator_traits<const_pointer>::reference const_reference;
+ typedef typename pointer_traits<node_ptr>::
+ template rebind_pointer<value_type>::type pointer;
+ typedef typename pointer_traits<node_ptr>::
+ template rebind_pointer<const value_type>::type const_pointer;
+ typedef value_type & reference;
+ typedef const value_type & const_reference;
    static const link_mode_type link_mode = hook_type::boost_intrusive_tags::link_mode;
 
    static node_ptr to_node_ptr(reference value)
- { return static_cast<node*>(&*Functor::to_hook_ptr(value)); }
+ { return static_cast<node*>(boost::intrusive::detail::to_raw_pointer(Functor::to_hook_ptr(value))); }
 
    static const_node_ptr to_node_ptr(const_reference value)
- { return static_cast<const node*>(&*Functor::to_hook_ptr(value)); }
+ { return static_cast<const node*>(boost::intrusive::detail::to_raw_pointer(Functor::to_hook_ptr(value))); }
 
- static pointer to_value_ptr(node_ptr n)
+ static pointer to_value_ptr(const node_ptr & n)
    { return Functor::to_value_ptr(to_hook_ptr(n)); }
 
- static const_pointer to_value_ptr(const_node_ptr n)
+ static const_pointer to_value_ptr(const const_node_ptr & n)
    { return Functor::to_value_ptr(to_hook_ptr(n)); }
 
    private:
- static hook_ptr to_hook_ptr(node_ptr n)
+ static hook_ptr to_hook_ptr(const node_ptr & n)
    { return hook_ptr(&*static_cast<hook_type*>(&*n)); }
 
- static const_hook_ptr to_hook_ptr(const_node_ptr n)
+ static const_hook_ptr to_hook_ptr(const const_node_ptr & n)
    { return const_hook_ptr(&*static_cast<const hook_type*>(&*n)); }
 };
 
@@ -624,8 +650,8 @@
 template<class Container, bool IsConst>
 struct node_to_value
    : public detail::select_constptr
- < typename boost::pointer_to_other
- <typename Container::pointer, void>::type
+ < typename pointer_traits
+ <typename Container::pointer>::template rebind_pointer<void>::type
       , detail::store_cont_ptr_on_it<Container>::value
>::type
 {
@@ -635,16 +661,16 @@
    typedef typename Container::real_value_traits real_value_traits;
    typedef typename real_value_traits::value_type value_type;
    typedef typename detail::select_constptr
- < typename boost::pointer_to_other
- <typename Container::pointer, void>::type
+ < typename pointer_traits
+ <typename Container::pointer>::template rebind_pointer<void>::type
       , store_container_ptr >::type Base;
    typedef typename real_value_traits::node_traits::node node;
    typedef typename detail::add_const_if_c
          <value_type, IsConst>::type vtype;
    typedef typename detail::add_const_if_c
          <node, IsConst>::type ntype;
- typedef typename boost::pointer_to_other
- <typename Container::pointer, ntype>::type npointer;
+ typedef typename pointer_traits
+ <typename Container::pointer>::template rebind_pointer<ntype>::type npointer;
 
    node_to_value(const Container *cont)
       : Base(cont)
@@ -670,7 +696,10 @@
    }
 
    result_type operator()(first_argument_type arg) const
- { return *(this->get_real_value_traits()->to_value_ptr(npointer(&arg))); }
+ {
+ return *(this->get_real_value_traits()->to_value_ptr
+ (pointer_traits<npointer>::pointer_to(arg)));
+ }
 };
 
 //This is not standard, but should work with all compilers
@@ -732,6 +761,115 @@
    detail::max_align rawbuf[(N*sizeof(T)-1)/sizeof(detail::max_align)+1];
 };
 
+
+
+
+template<class It>
+class reverse_iterator
+ : public std::iterator<
+ typename std::iterator_traits<It>::iterator_category,
+ typename std::iterator_traits<It>::value_type,
+ typename std::iterator_traits<It>::difference_type,
+ typename std::iterator_traits<It>::pointer,
+ typename std::iterator_traits<It>::reference>
+{
+ public:
+ typedef typename std::iterator_traits<It>::pointer pointer;
+ typedef typename std::iterator_traits<It>::reference reference;
+ typedef typename std::iterator_traits<It>::difference_type difference_type;
+ typedef It iterator_type;
+
+ reverse_iterator(){}
+
+ explicit reverse_iterator(It r)
+ : m_current(r)
+ {}
+
+ template<class OtherIt>
+ reverse_iterator(const reverse_iterator<OtherIt>& r)
+ : m_current(r.base())
+ {}
+
+ It base() const
+ { return m_current; }
+
+ reference operator*() const
+ { It temp(m_current); --temp; return *temp; }
+
+ pointer operator->() const
+ { It temp(m_current); --temp; return temp.operator->(); }
+
+ reference operator[](difference_type off) const
+ { return this->m_current[-off]; }
+
+ reverse_iterator& operator++()
+ { --m_current; return *this; }
+
+ reverse_iterator operator++(int)
+ {
+ reverse_iterator temp = *this;
+ --m_current;
+ return temp;
+ }
+
+ reverse_iterator& operator--()
+ {
+ ++m_current;
+ return *this;
+ }
+
+ reverse_iterator operator--(int)
+ {
+ reverse_iterator temp(*this);
+ ++m_current;
+ return temp;
+ }
+
+ friend bool operator==(const reverse_iterator& l, const reverse_iterator& r)
+ { return l.m_current == r.m_current; }
+
+ friend bool operator!=(const reverse_iterator& l, const reverse_iterator& r)
+ { return l.m_current != r.m_current; }
+
+ friend bool operator<(const reverse_iterator& l, const reverse_iterator& r)
+ { return l.m_current < r.m_current; }
+
+ friend bool operator<=(const reverse_iterator& l, const reverse_iterator& r)
+ { return l.m_current <= r.m_current; }
+
+ friend bool operator>(const reverse_iterator& l, const reverse_iterator& r)
+ { return l.m_current > r.m_current; }
+
+ friend bool operator>=(const reverse_iterator& l, const reverse_iterator& r)
+ { return l.m_current >= r.m_current; }
+
+ reverse_iterator& operator+=(difference_type off)
+ { m_current -= off; return *this; }
+
+ friend reverse_iterator operator+(const reverse_iterator & l, difference_type off)
+ {
+ reverse_iterator tmp(l.m_current);
+ tmp.m_current -= off;
+ return tmp;
+ }
+
+ reverse_iterator& operator-=(difference_type off)
+ { m_current += off; return *this; }
+
+ friend reverse_iterator operator-(const reverse_iterator & l, difference_type off)
+ {
+ reverse_iterator tmp(l.m_current);
+ tmp.m_current += off;
+ return tmp;
+ }
+
+ friend difference_type operator-(const reverse_iterator& l, const reverse_iterator& r)
+ { return r.m_current - l.m_current; }
+
+ private:
+ It m_current; // the wrapped iterator
+};
+
 } //namespace detail
 } //namespace intrusive
 } //namespace boost

Modified: branches/release/boost/intrusive/detail/workaround.hpp
==============================================================================
--- branches/release/boost/intrusive/detail/workaround.hpp (original)
+++ branches/release/boost/intrusive/detail/workaround.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -11,20 +11,12 @@
 #ifndef BOOST_INTRUSIVE_DETAIL_WRKRND_HPP
 #define BOOST_INTRUSIVE_DETAIL_WRKRND_HPP
 
-#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)
-// C++0x features are only enabled when -std=c++0x or -std=gnu++0x are
-// passed on the command line, which in turn defines
-// __GXX_EXPERIMENTAL_CXX0X__. Note: __GXX_EXPERIMENTAL_CPP0X__ is
-// defined by some very early development versions of GCC 4.3; we will
-// remove this part of the check in the near future.
-# if defined(__GXX_EXPERIMENTAL_CPP0X__) || defined(__GXX_EXPERIMENTAL_CXX0X__)
-# define BOOST_INTRUSIVE_RVALUE_REFERENCE
-# define BOOST_INTRUSIVE_VARIADIC_TEMPLATES
-# endif
-#endif
+#include <boost/intrusive/detail/config_begin.hpp>
 
-#if defined(BOOST_INTRUSIVE_RVALUE_REFERENCE) && defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
-#define BOOST_INTRUSIVE_PERFECT_FORWARDING
+#if !defined(BOOST_NO_RVALUE_REFERENCES) && !defined(BOOST_NO_VARIADIC_TEMPLATES)
+ #define BOOST_INTRUSIVE_PERFECT_FORWARDING
 #endif
 
+#include <boost/intrusive/detail/config_end.hpp>
+
 #endif //#ifndef BOOST_INTRUSIVE_DETAIL_WRKRND_HPP

Modified: branches/release/boost/intrusive/hashtable.hpp
==============================================================================
--- branches/release/boost/intrusive/hashtable.hpp (original)
+++ branches/release/boost/intrusive/hashtable.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -18,7 +18,6 @@
 #include <utility> //std::pair
 #include <algorithm> //std::swap, std::lower_bound, std::upper_bound
 #include <cstddef> //std::size_t
-#include <iterator> //std::iterator_traits
 //boost
 #include <boost/intrusive/detail/assert.hpp>
 #include <boost/static_assert.hpp>
@@ -26,7 +25,6 @@
 #include <boost/pointer_cast.hpp>
 //General intrusive utilities
 #include <boost/intrusive/intrusive_fwd.hpp>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
 #include <boost/intrusive/detail/hashtable_node.hpp>
 #include <boost/intrusive/detail/transform_iterator.hpp>
 #include <boost/intrusive/link_mode.hpp>
@@ -36,6 +34,7 @@
 #include <boost/intrusive/trivial_value_traits.hpp>
 #include <boost/intrusive/unordered_set_hook.hpp>
 #include <boost/intrusive/slist.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/detail/mpl.hpp>
 #include <boost/type_traits.hpp>
 #include <boost/move/move.hpp>
@@ -125,7 +124,8 @@
       < typename NodeTraits::node
       , boost::intrusive::value_traits<trivial_traits>
       , boost::intrusive::constant_time_size<false>
- , boost::intrusive::size_type<typename boost::make_unsigned<typename std::iterator_traits<typename NodeTraits::node_ptr>::difference_type>::type>
+ , boost::intrusive::size_type<typename boost::make_unsigned
+ <typename pointer_traits<typename NodeTraits::node_ptr>::difference_type>::type >
>::type
    {};
 };
@@ -174,8 +174,10 @@
       <SupposedValueTraits>::type::node_ptr node_ptr;
    typedef typename unordered_bucket_impl
       <SupposedValueTraits>::type bucket_type;
- typedef typename boost::pointer_to_other
- <node_ptr, bucket_type>::type implementation_defined;
+
+ typedef typename pointer_traits
+ <node_ptr>::template rebind_pointer
+ < bucket_type >::type implementation_defined;
    typedef implementation_defined type;
 };
 
@@ -267,6 +269,11 @@
       : detail::ebo_functor_holder<typename Config::equal>(e)//equal()
       , bucket_hash(::boost::forward<BucketTraits>(b_traits), h)
    {}
+
+ template<class T>
+ void set_cache(T)
+ {}
+
    bucket_hash_t<Config> bucket_hash;
 };
 
@@ -285,6 +292,10 @@
       : detail::ebo_functor_holder<typename Config::equal>(e) //equal()
       , bucket_hash(::boost::forward<BucketTraits>(b_traits), h)
    {}
+
+ void set_cache(const bucket_ptr & c)
+ { cached_begin_ = c; }
+
    bucket_hash_t<Config> bucket_hash;
    bucket_ptr cached_begin_;
 };
@@ -344,16 +355,11 @@
    typedef typename reduced_node_traits::node slist_node;
    typedef circular_slist_algorithms<group_traits> group_algorithms;
 
- static node_ptr dcast_bucket_ptr(slist_node_ptr p)
- {
-// This still fails in gcc < 4.4 so forget about it
-// using ::boost::static_pointer_cast;
-// return static_pointer_cast<node>(p);
- return node_ptr(&static_cast<node&>(*p));
- }
+ static node_ptr dcast_bucket_ptr(const slist_node_ptr &p)
+ { return pointer_traits<node_ptr>::pointer_to(static_cast<node&>(*p)); }
 
- static slist_node_ptr priv_get_bucket_before_begin
- (slist_node_ptr bucket_beg, slist_node_ptr bucket_end, node_ptr p)
+ static slist_node_ptr get_bucket_before_begin
+ (const slist_node_ptr &bucket_beg, const slist_node_ptr &bucket_end, const node_ptr &p)
    {
       //First find the last node of p's group.
       //This requires checking the first node of the next group or
@@ -384,7 +390,7 @@
       return possible_end;
    }
 
- static node_ptr priv_get_prev_to_first_in_group(slist_node_ptr bucket_node, node_ptr first_in_group)
+ static node_ptr get_prev_to_first_in_group(const slist_node_ptr &bucket_node, const node_ptr &first_in_group)
    {
       //Just iterate using group links and obtain the node
       //before "first_in_group)"
@@ -397,7 +403,7 @@
       return prev_node;
    }
 
- static node_ptr priv_get_first_in_group_of_last_in_group(node_ptr last_in_group)
+ static node_ptr get_first_in_group_of_last_in_group(const node_ptr &last_in_group)
    {
       //Just iterate using group links and obtain the node
       //before "last_in_group"
@@ -413,8 +419,7 @@
       return possible_first;
    }
 
-
- static void priv_erase_from_group(slist_node_ptr end_ptr, node_ptr to_erase_ptr, detail::true_)
+ static void erase_from_group(const slist_node_ptr &end_ptr, const node_ptr &to_erase_ptr, detail::true_)
    {
       node_ptr nxt_ptr(node_traits::get_next(to_erase_ptr));
       node_ptr prev_in_group_ptr(group_traits::get_next(to_erase_ptr));
@@ -430,7 +435,7 @@
       }
       else if(last_in_group){
          node_ptr first_in_group =
- priv_get_first_in_group_of_last_in_group(to_erase_ptr);
+ get_first_in_group_of_last_in_group(to_erase_ptr);
          group_algorithms::unlink_after(first_in_group);
       }
       else{
@@ -438,14 +443,87 @@
       }
    }
 
- static void priv_erase_from_group(slist_node_ptr, node_ptr, detail::false_)
+ static void erase_from_group(const slist_node_ptr&, const node_ptr&, detail::false_)
    {}
 
- static node_ptr priv_get_last_in_group(node_ptr first_in_group, detail::true_)
+ static node_ptr get_last_in_group(const node_ptr &first_in_group, detail::true_)
    { return group_traits::get_next(first_in_group); }
 
- static node_ptr priv_get_last_in_group(node_ptr n, detail::false_)
+ static node_ptr get_last_in_group(const node_ptr &n, detail::false_)
    { return n; }
+
+ static void init_group(const node_ptr &n, true_)
+ { group_algorithms::init(n); }
+
+ static void init_group(const node_ptr &, false_)
+ {}
+
+ static void insert_in_group(const node_ptr &first_in_group, const node_ptr &n, true_)
+ {
+ if(first_in_group){
+ if(group_algorithms::unique(first_in_group))
+ group_algorithms::link_after(first_in_group, n);
+ else{
+ group_algorithms::link_after(group_algorithms::node_traits::get_next(first_in_group), n);
+ }
+ }
+ else{
+ group_algorithms::init_header(n);
+ }
+ }
+
+ static slist_node_ptr get_previous_and_next_in_group
+ ( const slist_node_ptr &i, node_ptr &nxt_in_group
+ //If first_end_ptr == last_end_ptr, then first_end_ptr is the bucket of i
+ //Otherwise first_end_ptr is the first bucket and last_end_ptr the last one.
+ , const slist_node_ptr &first_end_ptr, const slist_node_ptr &last_end_ptr)
+ {
+ slist_node_ptr prev;
+ node_ptr elem(dcast_bucket_ptr(i));
+
+ //It's the last in group if the next_node is a bucket
+ slist_node_ptr nxt(node_traits::get_next(elem));
+ bool last_in_group = (first_end_ptr <= nxt && nxt <= last_end_ptr)/* ||
+ (group_traits::get_next(nxt) != elem)*/;
+ //It's the first in group if group_previous's next_node is not
+ //itself, as group list does not link bucket
+ node_ptr prev_in_group(group_traits::get_next(elem));
+ bool first_in_group = node_traits::get_next(prev_in_group) != elem;
+
+ if(first_in_group){
+ node_ptr start_pos;
+ if(last_in_group){
+ start_pos = elem;
+ nxt_in_group = node_ptr();
+ }
+ else{
+ start_pos = prev_in_group;
+ nxt_in_group = node_traits::get_next(elem);
+ }
+ slist_node_ptr bucket_node;
+ if(first_end_ptr != last_end_ptr){
+ bucket_node = group_functions::get_bucket_before_begin
+ (first_end_ptr, last_end_ptr, start_pos);
+ }
+ else{
+ bucket_node = first_end_ptr;
+ }
+ prev = group_functions::get_prev_to_first_in_group(bucket_node, elem);
+ }
+ else{
+ if(last_in_group){
+ nxt_in_group = group_functions::get_first_in_group_of_last_in_group(elem);
+ }
+ else{
+ nxt_in_group = node_traits::get_next(elem);
+ }
+ prev = group_traits::get_next(elem);
+ }
+ return prev;
+ }
+
+ static void insert_in_group(const node_ptr&, const node_ptr&, false_)
+ {}
 };
 
 template<class BucketType, class SplitTraits>
@@ -486,6 +564,16 @@
    bool released_;
 };
 
+template<class NodeTraits>
+struct node_functions
+{
+ static void store_hash(typename NodeTraits::node_ptr p, std::size_t h, true_)
+ { return NodeTraits::set_hash(p, h); }
+
+ static void store_hash(typename NodeTraits::node_ptr, std::size_t, false_)
+ {}
+};
+
 } //namespace detail {
 
 //!This metafunction will obtain the type of a bucket
@@ -620,27 +708,30 @@
 
    typedef typename real_value_traits::pointer pointer;
    typedef typename real_value_traits::const_pointer const_pointer;
- typedef typename real_value_traits::value_type value_type;
- typedef typename std::iterator_traits<pointer>::reference reference;
- typedef typename std::iterator_traits<const_pointer>::reference const_reference;
- typedef typename std::iterator_traits<pointer>::difference_type difference_type;
+ typedef typename real_value_traits::value_type value_type;
+ typedef typename pointer_traits<pointer>::reference reference;
+ typedef typename pointer_traits<const_pointer>::reference const_reference;
+ typedef typename pointer_traits<pointer>::difference_type difference_type;
    typedef typename Config::size_type size_type;
    typedef value_type key_type;
    typedef typename Config::equal key_equal;
    typedef typename Config::hash hasher;
    typedef detail::bucket_impl<slist_impl> bucket_type;
- typedef typename boost::pointer_to_other
- <pointer, bucket_type>::type bucket_ptr;
+ typedef typename pointer_traits
+ <pointer>::template rebind_pointer
+ < bucket_type >::type bucket_ptr;
    typedef typename slist_impl::iterator siterator;
    typedef typename slist_impl::const_iterator const_siterator;
    typedef detail::hashtable_iterator<hashtable_impl, false> iterator;
    typedef detail::hashtable_iterator<hashtable_impl, true> const_iterator;
    typedef typename real_value_traits::node_traits node_traits;
    typedef typename node_traits::node node;
- typedef typename boost::pointer_to_other
- <pointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <node_ptr, const node>::type const_node_ptr;
+ typedef typename pointer_traits
+ <pointer>::template rebind_pointer
+ < node >::type node_ptr;
+ typedef typename pointer_traits
+ <pointer>::template rebind_pointer
+ < const node >::type const_node_ptr;
    typedef typename slist_impl::node_algorithms node_algorithms;
 
    static const bool stateful_value_traits = detail::is_stateful_value_traits<real_value_traits>::value;
@@ -664,8 +755,9 @@
    BOOST_STATIC_ASSERT((!compare_hash || store_hash));
 
    typedef typename slist_impl::node_ptr slist_node_ptr;
- typedef typename boost::pointer_to_other
- <slist_node_ptr, void>::type void_pointer;
+ typedef typename pointer_traits
+ <slist_node_ptr>::template rebind_pointer
+ < void >::type void_pointer;
    //We'll define group traits, but these won't be instantiated if
    //optimize_multikey is not true
    typedef unordered_group_adapter<node_traits> group_traits;
@@ -677,6 +769,7 @@
    typedef detail::size_holder<constant_time_size, size_type> size_traits;
    typedef detail::size_holder<incremental, size_type> split_traits;
    typedef detail::group_functions<node_traits> group_functions_t;
+ typedef detail::node_functions<node_traits> node_functions_t;
 
    static const std::size_t hashtable_data_bool_flags_mask =
       ( detail::hash_bool_flags::cache_begin_pos
@@ -721,7 +814,9 @@
       { return base_t::operator()(static_cast<const node &>(to_clone)); }
 
       void operator()(typename slist_impl::node_ptr to_clone)
- { base_t::operator()(node_ptr(&static_cast<node &>(*to_clone))); }
+ {
+ base_t::operator()(pointer_traits<node_ptr>::pointer_to(static_cast<node &>(*to_clone)));
+ }
    };
 
    private:
@@ -757,16 +852,16 @@
 
    /// @cond
 
- const real_value_traits &get_real_value_traits(detail::bool_<false>) const
+ const real_value_traits &get_real_value_traits(detail::false_) const
    { return this->data_; }
 
- const real_value_traits &get_real_value_traits(detail::bool_<true>) const
+ const real_value_traits &get_real_value_traits(detail::true_) const
    { return data_.get_value_traits(*this); }
 
- real_value_traits &get_real_value_traits(detail::bool_<false>)
+ real_value_traits &get_real_value_traits(detail::false_)
    { return this->data_; }
 
- real_value_traits &get_real_value_traits(detail::bool_<true>)
+ real_value_traits &get_real_value_traits(detail::true_)
    { return data_.get_value_traits(*this); }
 
    /// @endcond
@@ -931,7 +1026,7 @@
       }
       else{
          size_type buckets_len = this->priv_buckets_len();
- const bucket_type *b = detail::boost_intrusive_get_pointer(this->priv_buckets());
+ const bucket_type *b = boost::intrusive::detail::to_raw_pointer(this->priv_buckets());
          for (size_type n = 0; n < buckets_len; ++n, ++b){
             if(!b->empty()){
                return false;
@@ -954,7 +1049,7 @@
       else{
          size_type len = 0;
          size_type buckets_len = this->priv_buckets_len();
- const bucket_type *b = detail::boost_intrusive_get_pointer(this->priv_buckets());
+ const bucket_type *b = boost::intrusive::detail::to_raw_pointer(this->priv_buckets());
          for (size_type n = 0; n < buckets_len; ++n, ++b){
             len += b->size();
          }
@@ -1258,12 +1353,12 @@
       size_type bucket_num = priv_hash_to_bucket(commit_data.hash);
       bucket_type &b = this->priv_buckets()[bucket_num];
       this->priv_size_traits().increment();
- node_ptr n = node_ptr(&priv_value_to_node(value));
- this->priv_store_hash(n, commit_data.hash, store_hash_t());
+ node_ptr n = pointer_traits<node_ptr>::pointer_to(priv_value_to_node(value));
+ node_functions_t::store_hash(n, commit_data.hash, store_hash_t());
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(n));
       priv_insertion_update_cache(bucket_num);
- this->priv_insert_in_group(node_ptr(0), n, optimize_multikey_t());
+ group_functions_t::insert_in_group(node_ptr(), n, optimize_multikey_t());
       return iterator(b.insert_after(b.before_begin(), *n), this);
    }
 
@@ -1442,7 +1537,7 @@
       }
       else if(optimize_multikey){
          siterator last = bucket_type::s_iterator_to
- (*node_traits::get_next(group_functions_t::priv_get_last_in_group
+ (*node_traits::get_next(group_functions_t::get_last_in_group
                (dcast_bucket_ptr(it.pointed_node()), optimize_multikey_t())));
          this->priv_erase_range_impl(bucket_num, prev, last, disposer, count);
       }
@@ -2012,7 +2107,7 @@
                if(cache_begin && new_n < new_first_bucket_num)
                   new_first_bucket_num = new_n;
                siterator last = bucket_type::s_iterator_to
- (*group_functions_t::priv_get_last_in_group
+ (*group_functions_t::get_last_in_group
                      (dcast_bucket_ptr(i.pointed_node()), optimize_multikey_t()));
                if(same_buffer && new_n == n){
                   before_i = last;
@@ -2086,7 +2181,7 @@
             const std::size_t hash_value = this->priv_stored_or_compute_hash(v, store_hash_t());
             const size_type new_n = priv_hash_to_bucket(hash_value);
             siterator last = bucket_type::s_iterator_to
- (*group_functions_t::priv_get_last_in_group
+ (*group_functions_t::get_last_in_group
                   (dcast_bucket_ptr(i.pointed_node()), optimize_multikey_t()));
             if(new_n == bucket_to_rehash){
                before_i = last;
@@ -2234,10 +2329,10 @@
       return bucket_number;
    }
 
- std::size_t priv_hash_to_bucket_impl(std::size_t hash_value, std::size_t bucket_len, detail::bool_<false>) const
+ std::size_t priv_hash_to_bucket_impl(std::size_t hash_value, std::size_t bucket_len, detail::false_) const
    { return hash_value % bucket_len; }
 
- std::size_t priv_hash_to_bucket_impl(std::size_t hash_value, std::size_t bucket_len, detail::bool_<true>) const
+ std::size_t priv_hash_to_bucket_impl(std::size_t hash_value, std::size_t bucket_len, detail::true_) const
    { return hash_value & (bucket_len - 1); }
 
    const key_equal &priv_equal() const
@@ -2258,16 +2353,16 @@
    const value_type &priv_value_from_slist_node(slist_node_ptr n) const
    { return *this->get_real_value_traits().to_value_ptr(dcast_bucket_ptr(n)); }
 
- const real_bucket_traits &priv_real_bucket_traits(detail::bool_<false>) const
+ const real_bucket_traits &priv_real_bucket_traits(detail::false_) const
    { return this->data_.internal_.bucket_hash_equal_.bucket_hash.bucket_plus_size_.bucket_traits_; }
 
- const real_bucket_traits &priv_real_bucket_traits(detail::bool_<true>) const
+ const real_bucket_traits &priv_real_bucket_traits(detail::true_) const
    { return this->data_.internal_.bucket_hash_equal_.bucket_hash.bucket_plus_size_.bucket_traits_.get_bucket_traits(*this); }
 
- real_bucket_traits &priv_real_bucket_traits(detail::bool_<false>)
+ real_bucket_traits &priv_real_bucket_traits(detail::false_)
    { return this->data_.internal_.bucket_hash_equal_.bucket_hash.bucket_plus_size_.bucket_traits_; }
 
- real_bucket_traits &priv_real_bucket_traits(detail::bool_<true>)
+ real_bucket_traits &priv_real_bucket_traits(detail::true_)
    { return this->data_.internal_.bucket_hash_equal_.bucket_hash.bucket_plus_size_.bucket_traits_.get_bucket_traits(*this); }
 
    const real_bucket_traits &priv_real_bucket_traits() const
@@ -2294,8 +2389,8 @@
    size_type priv_buckets_len() const
    { return this->priv_real_bucket_traits().bucket_count(); }
 
- static node_ptr uncast(const_node_ptr ptr)
- { return node_ptr(const_cast<node*>(detail::boost_intrusive_get_pointer(ptr))); }
+ static node_ptr uncast(const const_node_ptr & ptr)
+ { return node_ptr(const_cast<node*>(boost::intrusive::detail::to_raw_pointer(ptr))); }
 
    node &priv_value_to_node(value_type &v)
    { return *this->get_real_value_traits().to_node_ptr(v); }
@@ -2331,7 +2426,7 @@
          ++to_erase;
          slist_node_ptr end_ptr = end.pointed_node();
          while(to_erase != end){
- group_functions_t::priv_erase_from_group(end_ptr, dcast_bucket_ptr(to_erase.pointed_node()), optimize_multikey_t());
+ group_functions_t::erase_from_group(end_ptr, dcast_bucket_ptr(to_erase.pointed_node()), optimize_multikey_t());
             to_erase = b.erase_after_and_dispose(before_first_it, make_node_disposer(disposer));
             ++num_erased;
          }
@@ -2353,7 +2448,7 @@
          ++nxt;
          siterator end(b.end());
          while(nxt != end){
- priv_init_group(nxt.pointed_node(), optimize_multikey_t());
+ group_functions_t::init_group(dcast_bucket_ptr(nxt.pointed_node()), optimize_multikey_t());
             nxt = b.erase_after_and_dispose
                (b_begin, make_node_disposer(disposer));
             this->priv_size_traits().decrement();
@@ -2381,12 +2476,7 @@
    }
 
    static node_ptr dcast_bucket_ptr(typename slist_impl::node_ptr p)
- {
-// This still fails in gcc < 4.4 so forget about it
-// using ::boost::static_pointer_cast;
-// return static_pointer_cast<node>(p);
- return node_ptr(&static_cast<node&>(*p));
- }
+ { return pointer_traits<node_ptr>::pointer_to(static_cast<node&>(*p)); }
 
    std::size_t priv_stored_or_compute_hash(const value_type &v, detail::true_) const
    { return node_traits::get_hash(this->get_real_value_traits().to_node_ptr(v)); }
@@ -2404,12 +2494,6 @@
       return 0;
    }
 
- static void priv_store_hash(node_ptr p, std::size_t h, detail::true_)
- { return node_traits::set_hash(p, h); }
-
- static void priv_store_hash(node_ptr, std::size_t, detail::false_)
- {}
-
    static void priv_clear_group_nodes(bucket_type &b, detail::true_)
    {
       siterator it(b.begin()), itend(b.end());
@@ -2438,7 +2522,7 @@
    std::size_t priv_get_bucket_num_no_hash_store(siterator it, detail::true_)
    {
       bucket_ptr f(priv_buckets()), l(f + priv_buckets_len() - 1);
- slist_node_ptr bb = group_functions_t::priv_get_bucket_before_begin
+ slist_node_ptr bb = group_functions_t::get_bucket_before_begin
          ( f->end().pointed_node()
          , l->end().pointed_node()
          , dcast_bucket_ptr(it.pointed_node()));
@@ -2468,29 +2552,6 @@
       return static_cast<std::size_t>(&b - &*f);
    }
 
- void priv_init_group(slist_node_ptr n, detail::true_)
- { group_algorithms::init(dcast_bucket_ptr(n)); }
-
- void priv_init_group(slist_node_ptr, detail::false_)
- {}
-
- void priv_insert_in_group(node_ptr first_in_group, node_ptr n, detail::true_)
- {
- if(first_in_group){
- if(group_algorithms::unique(first_in_group))
- group_algorithms::link_after(first_in_group, n);
- else{
- group_algorithms::link_after(node_traits::get_next(first_in_group), n);
- }
- }
- else{
- group_algorithms::init_header(n);
- }
- }
-
- void priv_insert_in_group(node_ptr, node_ptr, detail::false_)
- {}
-
    siterator priv_get_previous
       (bucket_type &b, siterator i)
    { return priv_get_previous(b, i, optimize_multikey_t()); }
@@ -2502,7 +2563,7 @@
       node_ptr prev_in_group(group_traits::get_next(elem));
       bool first_in_group = node_traits::get_next(prev_in_group) != elem;
       typename bucket_type::node &n = first_in_group
- ? *group_functions_t::priv_get_prev_to_first_in_group(b.end().pointed_node(), elem)
+ ? *group_functions_t::get_prev_to_first_in_group(b.end().pointed_node(), elem)
          : *group_traits::get_next(elem)
          ;
       return bucket_type::s_iterator_to(n);
@@ -2533,7 +2594,7 @@
 
    static siterator priv_get_last(bucket_type &b, detail::false_)
    { return b.previous(b.end()); }
-
+/*
    siterator priv_get_previous_and_next_in_group
       (siterator i, node_ptr &nxt_in_group)
    {
@@ -2554,7 +2615,7 @@
          node_ptr start_pos;
          if(last_in_group){
             start_pos = elem;
- nxt_in_group = 0;
+ nxt_in_group = node_ptr();
          }
          else{
             start_pos = prev_in_group;
@@ -2568,15 +2629,15 @@
                ].before_begin().pointed_node();
          }
          else{
- bucket_node = group_functions_t::priv_get_bucket_before_begin
+ bucket_node = group_functions_t::get_bucket_before_begin
                   (first_end_ptr, last_end_ptr, start_pos);
          }
          prev = bucket_type::s_iterator_to
- (*group_functions_t::priv_get_prev_to_first_in_group(bucket_node, elem));
+ (*group_functions_t::get_prev_to_first_in_group(bucket_node, elem));
       }
       else{
          if(last_in_group){
- nxt_in_group = group_functions_t::priv_get_first_in_group_of_last_in_group(elem);
+ nxt_in_group = group_functions_t::get_first_in_group_of_last_in_group(elem);
          }
          else{
             nxt_in_group = node_traits::get_next(elem);
@@ -2585,7 +2646,9 @@
       }
       return prev;
    }
+*/
 
+/*
    template<class Disposer>
    void priv_erase(const_iterator i, Disposer disposer, detail::true_)
    {
@@ -2598,6 +2661,47 @@
       if(safemode_or_autounlink)
          group_algorithms::init(dcast_bucket_ptr(elem.pointed_node()));
    }
+*/
+
+/*
+ if(store_hash){
+ bucket_node = this->priv_buckets()
+ [this->priv_hash_to_bucket
+ (this->priv_stored_hash(elem, store_hash_t()))
+ ].before_begin().pointed_node();
+ }
+ else{
+ bucket_node = group_functions_t::get_bucket_before_begin
+ (first_end_ptr, last_end_ptr, start_pos);
+ }
+*/
+ template<class Disposer>
+ void priv_erase(const_iterator i, Disposer disposer, detail::true_)
+ {
+ slist_node_ptr elem(i.slist_it().pointed_node());
+ slist_node_ptr f_bucket_end, l_bucket_end;
+ if(store_hash){
+ f_bucket_end = l_bucket_end =
+ (this->priv_buckets()
+ [this->priv_hash_to_bucket
+ (this->priv_stored_hash(elem, store_hash_t()))
+ ]).before_begin().pointed_node();
+ }
+ else{
+ f_bucket_end = this->priv_buckets()->cend().pointed_node();
+ l_bucket_end = f_bucket_end + priv_buckets_len() - 1;
+ }
+ node_ptr nxt_in_group;
+ siterator prev = bucket_type::s_iterator_to
+ (*group_functions_t::get_previous_and_next_in_group
+ ( elem, nxt_in_group, f_bucket_end, l_bucket_end)
+ );
+ bucket_type::s_erase_after_and_dispose(prev, make_node_disposer(disposer));
+ if(nxt_in_group)
+ group_algorithms::unlink_after(nxt_in_group);
+ if(safemode_or_autounlink)
+ group_algorithms::init(dcast_bucket_ptr(elem));
+ }
 
    template <class Disposer>
    void priv_erase(const_iterator i, Disposer disposer, detail::false_)
@@ -2620,7 +2724,7 @@
    siterator priv_begin() const
    { return priv_begin(cache_begin_t()); }
 
- siterator priv_begin(detail::bool_<false>) const
+ siterator priv_begin(detail::false_) const
    {
       size_type n = 0;
       size_type buckets_len = this->priv_buckets_len();
@@ -2633,7 +2737,7 @@
       return priv_invalid_local_it();
    }
 
- siterator priv_begin(detail::bool_<true>) const
+ siterator priv_begin(detail::true_) const
    {
       if(this->data_.internal_.bucket_hash_equal_.cached_begin_ == priv_invalid_bucket()){
          return priv_invalid_local_it();
@@ -2646,16 +2750,16 @@
    void priv_initialize_cache()
    { priv_initialize_cache(cache_begin_t()); }
 
- void priv_initialize_cache(detail::bool_<true>)
+ void priv_initialize_cache(detail::true_)
    { this->data_.internal_.bucket_hash_equal_.cached_begin_ = priv_invalid_bucket(); }
 
- void priv_initialize_cache(detail::bool_<false>)
+ void priv_initialize_cache(detail::false_)
    {}
 
    void priv_insertion_update_cache(size_type insertion_bucket)
    { priv_insertion_update_cache(insertion_bucket, cache_begin_t()); }
 
- void priv_insertion_update_cache(size_type insertion_bucket, detail::bool_<true>)
+ void priv_insertion_update_cache(size_type insertion_bucket, detail::true_)
    {
       bucket_ptr p = priv_buckets() + insertion_bucket;
       if(p < this->data_.internal_.bucket_hash_equal_.cached_begin_){
@@ -2663,13 +2767,13 @@
       }
    }
 
- void priv_insertion_update_cache(size_type, detail::bool_<false>)
+ void priv_insertion_update_cache(size_type, detail::false_)
    {}
 
    void priv_erasure_update_cache(size_type first_bucket, size_type last_bucket)
    { priv_erasure_update_cache(first_bucket, last_bucket, cache_begin_t()); }
 
- void priv_erasure_update_cache(size_type first_bucket_num, size_type last_bucket_num, detail::bool_<true>)
+ void priv_erasure_update_cache(size_type first_bucket_num, size_type last_bucket_num, detail::true_)
    {
       //If the last bucket is the end, the cache must be updated
       //to the last position if all
@@ -2680,13 +2784,13 @@
       }
    }
 
- void priv_erasure_update_cache(size_type, size_type, detail::bool_<false>)
+ void priv_erasure_update_cache(size_type, size_type, detail::false_)
    {}
 
    void priv_erasure_update_cache()
    { priv_erasure_update_cache(cache_begin_t()); }
 
- void priv_erasure_update_cache(detail::bool_<true>)
+ void priv_erasure_update_cache(detail::true_)
    {
       if(constant_time_size && !size()){
          priv_initialize_cache();
@@ -2704,43 +2808,37 @@
       }
    }
 
- void priv_erasure_update_cache(detail::bool_<false>)
+ void priv_erasure_update_cache(detail::false_)
    {}
 
- void priv_swap_cache(detail::bool_<true>, hashtable_impl &other)
+ void priv_swap_cache(detail::true_, hashtable_impl &other)
    {
       std::swap( this->data_.internal_.bucket_hash_equal_.cached_begin_
                , other.data_.internal_.bucket_hash_equal_.cached_begin_);
    }
 
- void priv_swap_cache(detail::bool_<false>, hashtable_impl &)
+ void priv_swap_cache(detail::false_, hashtable_impl &)
    {}
 
    bucket_ptr priv_get_cache()
    { return priv_get_cache(cache_begin_t()); }
 
- bucket_ptr priv_get_cache(detail::bool_<true>)
+ bucket_ptr priv_get_cache(detail::true_)
    { return this->data_.internal_.bucket_hash_equal_.cached_begin_; }
 
- bucket_ptr priv_get_cache(detail::bool_<false>)
+ bucket_ptr priv_get_cache(detail::false_)
    { return this->priv_buckets(); }
 
- void priv_set_cache(bucket_ptr p)
- { priv_set_cache(p, cache_begin_t()); }
-
- void priv_set_cache(bucket_ptr p, detail::bool_<true>)
- { this->data_.internal_.bucket_hash_equal_.cached_begin_ = p; }
-
- void priv_set_cache(bucket_ptr, detail::bool_<false>)
- {}
+ void priv_set_cache(const bucket_ptr &p)
+ { this->data_.internal_.bucket_hash_equal_.set_cache(p); }
 
    size_type priv_get_cache_bucket_num()
    { return priv_get_cache_bucket_num(cache_begin_t()); }
 
- size_type priv_get_cache_bucket_num(detail::bool_<true>)
+ size_type priv_get_cache_bucket_num(detail::true_)
    { return this->data_.internal_.bucket_hash_equal_.cached_begin_ - this->priv_buckets(); }
 
- size_type priv_get_cache_bucket_num(detail::bool_<false>)
+ size_type priv_get_cache_bucket_num(detail::false_)
    { return 0u; }
 
    void priv_clear_buckets()
@@ -2803,7 +2901,7 @@
          }
          if(optimize_multikey){
             previt = bucket_type::s_iterator_to
- (*group_functions_t::priv_get_last_in_group
+ (*group_functions_t::get_last_in_group
                   (dcast_bucket_ptr(it.pointed_node()), optimize_multikey_t()));
             it = previt;
          }
@@ -2833,16 +2931,16 @@
          it = b.before_begin();
       }
       //Now store hash if needed
- node_ptr n = node_ptr(&priv_value_to_node(value));
- this->priv_store_hash(n, hash_value, store_hash_t());
+ node_ptr n = pointer_traits<node_ptr>::pointer_to(priv_value_to_node(value));
+ node_functions_t::store_hash(n, hash_value, store_hash_t());
       //Checks for some modes
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(n));
       //Shorcut for optimize_multikey cases
       if(optimize_multikey){
          node_ptr first_in_group = found_equal ?
- dcast_bucket_ptr(it.pointed_node()) : node_ptr(0);
- this->priv_insert_in_group(first_in_group, n, optimize_multikey_t());
+ dcast_bucket_ptr(it.pointed_node()) : node_ptr();
+ group_functions_t::insert_in_group(first_in_group, n, optimize_multikey_t());
       }
       //Update cache and increment size if needed
       priv_insertion_update_cache(bucket_num);
@@ -2877,7 +2975,7 @@
       siterator it = to_return.first;
       if(optimize_multikey){
          to_return.second = bucket_type::s_iterator_to
- (*node_traits::get_next(group_functions_t::priv_get_last_in_group
+ (*node_traits::get_next(group_functions_t::get_last_in_group
                (dcast_bucket_ptr(it.pointed_node()), optimize_multikey_t())));
          count = std::distance(it, to_return.second);
          if(to_return.second != b.end()){

Modified: branches/release/boost/intrusive/linear_slist_algorithms.hpp
==============================================================================
--- branches/release/boost/intrusive/linear_slist_algorithms.hpp (original)
+++ branches/release/boost/intrusive/linear_slist_algorithms.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -62,18 +62,18 @@
 
    //! <b>Effects</b>: Constructs an non-used list element, putting the next
    //! pointer to null:
- //! <tt>NodeTraits::get_next(this_node) == 0
+ //! <tt>NodeTraits::get_next(this_node) == node_ptr()</tt>
    //!
    //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
- static void init(node_ptr this_node);
+ static void init(const node_ptr & this_node);
 
    //! <b>Requires</b>: this_node must be in a circular list or be an empty circular list.
    //!
    //! <b>Effects</b>: Returns true is "this_node" is the only node of a circular list:
    //! or it's a not inserted node:
- //! <tt>return !NodeTraits::get_next(this_node) || NodeTraits::get_next(this_node) == this_node</tt>
+ //! <tt>return false == NodeTraits::get_next(this_node) || NodeTraits::get_next(this_node) == this_node</tt>
    //!
    //! <b>Complexity</b>: Constant
    //!
@@ -95,7 +95,7 @@
    //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
- static void unlink_after(node_ptr prev_node);
+ static void unlink_after(const node_ptr & prev_node);
 
    //! <b>Requires</b>: prev_node and last_node must be in a circular list
    //! or be an empty circular list.
@@ -105,7 +105,7 @@
    //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
- static void unlink_after(node_ptr prev_node, node_ptr last_node);
+ static void unlink_after(const node_ptr & prev_node, const node_ptr & last_node);
 
    //! <b>Requires</b>: prev_node must be a node of a linear list.
    //!
@@ -114,7 +114,7 @@
    //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
- static void link_after(node_ptr prev_node, node_ptr this_node);
+ static void link_after(const node_ptr & prev_node, const node_ptr & this_node);
 
    //! <b>Requires</b>: b and e must be nodes of the same linear list or an empty range.
    //! and p must be a node of a different linear list.
@@ -125,7 +125,7 @@
    //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
- static void transfer_after(node_ptr p, node_ptr b, node_ptr e);
+ static void transfer_after(const node_ptr & p, const node_ptr & b, const node_ptr & e);
 
    #endif //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
 
@@ -136,8 +136,8 @@
    //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
- static void init_header(node_ptr this_node)
- { NodeTraits::set_next(this_node, node_ptr(0)); }
+ static void init_header(const node_ptr & this_node)
+ { NodeTraits::set_next(this_node, node_ptr ()); }
 
    //! <b>Requires</b>: this_node and prev_init_node must be in the same linear list.
    //!
@@ -148,7 +148,7 @@
    //! <b>Complexity</b>: Linear to the number of elements between prev_init_node and this_node.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr get_previous_node(node_ptr prev_init_node, node_ptr this_node)
+ static node_ptr get_previous_node(const node_ptr & prev_init_node, const node_ptr & this_node)
    { return base_t::get_previous_node(prev_init_node, this_node); }
 
    //! <b>Requires</b>: this_node must be in a linear list or be an empty linear list.
@@ -159,7 +159,7 @@
    //! <b>Complexity</b>: Linear
    //!
    //! <b>Throws</b>: Nothing.
- static std::size_t count(const_node_ptr this_node)
+ static std::size_t count(const const_node_ptr & this_node)
    {
       std::size_t result = 0;
       const_node_ptr p = this_node;
@@ -179,7 +179,7 @@
    //! <b>Complexity</b>: Constant
    //!
    //! <b>Throws</b>: Nothing.
- static void swap_trailing_nodes(node_ptr this_node, node_ptr other_node)
+ static void swap_trailing_nodes(const node_ptr & this_node, const node_ptr & other_node)
    {
       node_ptr this_nxt = NodeTraits::get_next(this_node);
       node_ptr other_nxt = NodeTraits::get_next(other_node);
@@ -194,9 +194,9 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Complexity</b>: This function is linear to the contained elements.
- static node_ptr reverse(node_ptr p)
+ static node_ptr reverse(const node_ptr & p)
    {
- if(!p) return node_ptr(0);
+ if(!p) return node_ptr();
       node_ptr i = NodeTraits::get_next(p);
       node_ptr first(p);
       while(i){
@@ -217,9 +217,9 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Complexity</b>: Linear to the number of elements plus the number moved positions.
- static std::pair<node_ptr, node_ptr> move_first_n_backwards(node_ptr p, std::size_t n)
+ static std::pair<node_ptr, node_ptr> move_first_n_backwards(const node_ptr & p, std::size_t n)
    {
- std::pair<node_ptr, node_ptr> ret(node_ptr(0), node_ptr(0));
+ std::pair<node_ptr, node_ptr> ret;
       //Null shift, or count() == 0 or 1, nothing to do
       if(!n || !p || !NodeTraits::get_next(p)){
          return ret;
@@ -227,8 +227,8 @@
 
       node_ptr first = p;
       bool end_found = false;
- node_ptr new_last(0);
- node_ptr old_last(0);
+ node_ptr new_last = node_ptr();
+ node_ptr old_last = node_ptr();
 
       //Now find the new last node according to the shift count.
       //If we find 0 before finding the new last node
@@ -237,7 +237,7 @@
       for(std::size_t i = 1; i <= n; ++i){
          new_last = first;
          first = NodeTraits::get_next(first);
- if(first == 0){
+ if(first == node_ptr()){
             //Shortcut the shift with the modulo of the size of the list
             n %= i;
             if(!n) return ret;
@@ -253,12 +253,12 @@
       //If the p has not been found in the previous loop, find it
       //starting in the new first node and unlink it
       if(!end_found){
- old_last = base_t::get_previous_node(first, node_ptr(0));
+ old_last = base_t::get_previous_node(first, node_ptr());
       }
       
       //Now link p after the new last node
       NodeTraits::set_next(old_last, p);
- NodeTraits::set_next(new_last, node_ptr(0));
+ NodeTraits::set_next(new_last, node_ptr());
       ret.first = first;
       ret.second = new_last;
       return ret;
@@ -272,9 +272,9 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Complexity</b>: Linear to the number of elements plus the number moved positions.
- static std::pair<node_ptr, node_ptr> move_first_n_forward(node_ptr p, std::size_t n)
+ static std::pair<node_ptr, node_ptr> move_first_n_forward(const node_ptr & p, std::size_t n)
    {
- std::pair<node_ptr, node_ptr> ret(node_ptr(0), node_ptr(0));
+ std::pair<node_ptr, node_ptr> ret;
       //Null shift, or count() == 0 or 1, nothing to do
       if(!n || !p || !NodeTraits::get_next(p))
          return ret;
@@ -312,7 +312,7 @@
       node_ptr new_first(node_traits::get_next(new_last));
       //Now put the old beginning after the old end
       NodeTraits::set_next(old_last, p);
- NodeTraits::set_next(new_last, node_ptr(0));
+ NodeTraits::set_next(new_last, node_ptr());
       ret.first = new_first;
       ret.second = new_last;
       return ret;

Modified: branches/release/boost/intrusive/list.hpp
==============================================================================
--- branches/release/boost/intrusive/list.hpp (original)
+++ branches/release/boost/intrusive/list.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -19,12 +19,13 @@
 #include <boost/intrusive/intrusive_fwd.hpp>
 #include <boost/intrusive/list_hook.hpp>
 #include <boost/intrusive/circular_list_algorithms.hpp>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/detail/clear_on_destructor_base.hpp>
 #include <boost/intrusive/detail/mpl.hpp>
 #include <boost/intrusive/link_mode.hpp>
 #include <boost/static_assert.hpp>
 #include <boost/intrusive/options.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/detail/utilities.hpp>
 #include <iterator>
 #include <algorithm>
@@ -91,15 +92,15 @@
    /// @endcond
    typedef typename real_value_traits::pointer pointer;
    typedef typename real_value_traits::const_pointer const_pointer;
- typedef typename std::iterator_traits<pointer>::value_type value_type;
- typedef typename std::iterator_traits<pointer>::reference reference;
- typedef typename std::iterator_traits<const_pointer>::reference const_reference;
- typedef typename std::iterator_traits<pointer>::difference_type difference_type;
+ typedef typename pointer_traits<pointer>::element_type value_type;
+ typedef typename pointer_traits<pointer>::reference reference;
+ typedef typename pointer_traits<const_pointer>::reference const_reference;
+ typedef typename pointer_traits<pointer>::difference_type difference_type;
    typedef typename Config::size_type size_type;
    typedef list_iterator<list_impl, false> iterator;
    typedef list_iterator<list_impl, true> const_iterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef boost::intrusive::detail::reverse_iterator<iterator> reverse_iterator;
+ typedef boost::intrusive::detail::reverse_iterator<const_iterator>const_reverse_iterator;
    typedef typename real_value_traits::node_traits node_traits;
    typedef typename node_traits::node node;
    typedef typename node_traits::node_ptr node_ptr;
@@ -127,17 +128,14 @@
                       ));
 
    //Const cast emulation for smart pointers
- static node_ptr uncast(const_node_ptr ptr)
- {
- return const_cast<node*>(detail::boost_intrusive_get_pointer(ptr));
- //iG pending return node_ptr(boost::const_pointer_cast<node>(ptr));
- }
+ static node_ptr uncast(const const_node_ptr & ptr)
+ { return pointer_traits<node_ptr>::const_cast_from(ptr); }
 
    node_ptr get_root_node()
- { return node_ptr(&data_.root_plus_size_.root_); }
+ { return pointer_traits<node_ptr>::pointer_to(data_.root_plus_size_.root_); }
 
    const_node_ptr get_root_node() const
- { return const_node_ptr(&data_.root_plus_size_.root_); }
+ { return pointer_traits<const_node_ptr>::pointer_to(data_.root_plus_size_.root_); }
 
    struct root_plus_size : public size_traits
    {
@@ -1299,7 +1297,7 @@
    static list_impl &priv_container_from_end_iterator(const const_iterator &end_iterator)
    {
       root_plus_size *r = detail::parent_from_member<root_plus_size, node>
- ( detail::boost_intrusive_get_pointer(end_iterator.pointed_node()), &root_plus_size::root_);
+ ( boost::intrusive::detail::to_raw_pointer(end_iterator.pointed_node()), &root_plus_size::root_);
       data_t *d = detail::parent_from_member<data_t, root_plus_size>
          ( r, &data_t::root_plus_size_);
       list_impl *s = detail::parent_from_member<list_impl, data_t>(d, &list_impl::data_);

Modified: branches/release/boost/intrusive/member_value_traits.hpp
==============================================================================
--- branches/release/boost/intrusive/member_value_traits.hpp (original)
+++ branches/release/boost/intrusive/member_value_traits.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -16,6 +16,7 @@
 #include <boost/intrusive/link_mode.hpp>
 #include <iterator>
 #include <boost/intrusive/detail/parent_from_member.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 
 namespace boost {
 namespace intrusive {
@@ -29,15 +30,19 @@
 struct member_value_traits
 {
    public:
- typedef NodeTraits node_traits;
- typedef T value_type;
- typedef typename node_traits::node node;
- typedef typename node_traits::node_ptr node_ptr;
- typedef typename node_traits::const_node_ptr const_node_ptr;
- typedef typename boost::pointer_to_other<node_ptr, T>::type pointer;
- typedef typename boost::pointer_to_other<node_ptr, const T>::type const_pointer;
- typedef typename std::iterator_traits<pointer>::reference reference;
- typedef typename std::iterator_traits<const_pointer>::reference const_reference;
+ typedef NodeTraits node_traits;
+ typedef T value_type;
+ typedef typename node_traits::node node;
+ typedef typename node_traits::node_ptr node_ptr;
+ typedef typename node_traits::const_node_ptr const_node_ptr;
+ typedef typename pointer_traits<node_ptr>::template
+ rebind_pointer<T>::type pointer;
+ typedef typename pointer_traits<node_ptr>::template
+ rebind_pointer<const T>::type const_pointer;
+ //typedef typename pointer_traits<pointer>::reference reference;
+ //typedef typename pointer_traits<const_pointer>::reference const_reference;
+ typedef value_type & reference;
+ typedef const value_type & const_reference;
    static const link_mode_type link_mode = LinkMode;
 
    static node_ptr to_node_ptr(reference value)
@@ -46,16 +51,16 @@
    static const_node_ptr to_node_ptr(const_reference value)
    { return node_ptr(&(value.*PtrToMember)); }
 
- static pointer to_value_ptr(node_ptr n)
+ static pointer to_value_ptr(const node_ptr &n)
    {
       return pointer(detail::parent_from_member<value_type, node>
- (detail::boost_intrusive_get_pointer(n), PtrToMember));
+ (boost::intrusive::detail::to_raw_pointer(n), PtrToMember));
    }
 
- static const_pointer to_value_ptr(const_node_ptr n)
+ static const_pointer to_value_ptr(const const_node_ptr &n)
    {
       return pointer(detail::parent_from_member<value_type, node>
- (detail::boost_intrusive_get_pointer(n), PtrToMember));
+ (boost::intrusive::detail::to_raw_pointer(n), PtrToMember));
    }
 };
 

Modified: branches/release/boost/intrusive/rbtree.hpp
==============================================================================
--- branches/release/boost/intrusive/rbtree.hpp (original)
+++ branches/release/boost/intrusive/rbtree.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -27,9 +27,10 @@
 #include <boost/intrusive/detail/tree_node.hpp>
 #include <boost/intrusive/detail/ebo_functor_holder.hpp>
 #include <boost/intrusive/detail/mpl.hpp>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/detail/clear_on_destructor_base.hpp>
 #include <boost/intrusive/detail/function_detector.hpp>
+#include <boost/intrusive/detail/utilities.hpp>
 #include <boost/intrusive/options.hpp>
 #include <boost/intrusive/rbtree_algorithms.hpp>
 #include <boost/intrusive/link_mode.hpp>
@@ -97,18 +98,19 @@
    /// @endcond
    typedef typename real_value_traits::pointer pointer;
    typedef typename real_value_traits::const_pointer const_pointer;
- typedef typename std::iterator_traits<pointer>::value_type value_type;
+
+ typedef typename pointer_traits<pointer>::element_type value_type;
    typedef value_type key_type;
- typedef typename std::iterator_traits<pointer>::reference reference;
- typedef typename std::iterator_traits<const_pointer>::reference const_reference;
- typedef typename std::iterator_traits<pointer>::difference_type difference_type;
+ typedef typename pointer_traits<pointer>::reference reference;
+ typedef typename pointer_traits<const_pointer>::reference const_reference;
+ typedef typename pointer_traits<const_pointer>::difference_type difference_type;
    typedef typename Config::size_type size_type;
    typedef typename Config::compare value_compare;
    typedef value_compare key_compare;
    typedef tree_iterator<rbtree_impl, false> iterator;
    typedef tree_iterator<rbtree_impl, true> const_iterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef boost::intrusive::detail::reverse_iterator<iterator> reverse_iterator;
+ typedef boost::intrusive::detail::reverse_iterator<const_iterator>const_reverse_iterator;
    typedef typename real_value_traits::node_traits node_traits;
    typedef typename node_traits::node node;
    typedef typename node_traits::node_ptr node_ptr;
@@ -163,17 +165,14 @@
    value_traits &priv_value_traits()
    { return data_; }
 
- const node &priv_header() const
- { return data_.node_plus_pred_.header_plus_size_.header_; }
+ node_ptr priv_header_ptr()
+ { return pointer_traits<node_ptr>::pointer_to(data_.node_plus_pred_.header_plus_size_.header_); }
 
- node &priv_header()
- { return data_.node_plus_pred_.header_plus_size_.header_; }
+ const_node_ptr priv_header_ptr() const
+ { return pointer_traits<const_node_ptr>::pointer_to(data_.node_plus_pred_.header_plus_size_.header_); }
 
- static node_ptr uncast(const_node_ptr ptr)
- {
- return node_ptr(const_cast<node*>(detail::boost_intrusive_get_pointer(ptr)));
-//iG pending return node_ptr(boost::const_pointer_cast<node>(ptr));
- }
+ static node_ptr uncast(const const_node_ptr & ptr)
+ { return pointer_traits<node_ptr>::const_cast_from(ptr); }
 
    size_traits &priv_size_traits()
    { return data_.node_plus_pred_.header_plus_size_; }
@@ -198,10 +197,10 @@
    { return priv_comp(); }
 
    const node &prot_header_node() const
- { return priv_header(); }
+ { return data_.node_plus_pred_.header_plus_size_.header_; }
 
    node &prot_header_node()
- { return priv_header(); }
+ { return data_.node_plus_pred_.header_plus_size_.header_; }
 
    void prot_set_size(size_type s)
    { this->priv_size_traits().set_size(s); }
@@ -229,7 +228,7 @@
               , const value_traits &v_traits = value_traits())
       : data_(cmp, v_traits)
    {
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
       this->priv_size_traits().set_size(size_type(0));
    }
 
@@ -251,7 +250,7 @@
               , const value_traits &v_traits = value_traits())
       : data_(cmp, v_traits)
    {
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
       this->priv_size_traits().set_size(size_type(0));
       if(unique)
          this->insert_unique(b, e);
@@ -264,7 +263,7 @@
    rbtree_impl(BOOST_RV_REF(rbtree_impl) x)
       : data_(::boost::move(x.priv_comp()), ::boost::move(x.priv_value_traits()))
    {
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
       this->priv_size_traits().set_size(size_type(0));
       this->swap(x);
    }
@@ -290,7 +289,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    iterator begin()
- { return iterator (node_traits::get_left(node_ptr(&priv_header())), this); }
+ { return iterator (node_traits::get_left(this->priv_header_ptr()), this); }
 
    //! <b>Effects</b>: Returns a const_iterator pointing to the beginning of the tree.
    //!
@@ -306,7 +305,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    const_iterator cbegin() const
- { return const_iterator (node_traits::get_left(const_node_ptr(&priv_header())), this); }
+ { return const_iterator (node_traits::get_left(this->priv_header_ptr()), this); }
 
    //! <b>Effects</b>: Returns an iterator pointing to the end of the tree.
    //!
@@ -314,7 +313,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    iterator end()
- { return iterator (node_ptr(&priv_header()), this); }
+ { return iterator (this->priv_header_ptr(), this); }
 
    //! <b>Effects</b>: Returns a const_iterator pointing to the end of the tree.
    //!
@@ -330,7 +329,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    const_iterator cend() const
- { return const_iterator (uncast(const_node_ptr(&priv_header())), this); }
+ { return const_iterator (uncast(this->priv_header_ptr()), this); }
 
    //! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning of the
    //! reversed tree.
@@ -444,7 +443,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    bool empty() const
- { return node_algorithms::unique(const_node_ptr(&priv_header())); }
+ { return node_algorithms::unique(this->priv_header_ptr()); }
 
    //! <b>Effects</b>: Returns the number of elements stored in the tree.
    //!
@@ -457,7 +456,7 @@
       if(constant_time_size)
          return this->priv_size_traits().get_size();
       else{
- return (size_type)node_algorithms::size(const_node_ptr(&priv_header()));
+ return (size_type)node_algorithms::size(this->priv_header_ptr());
       }
    }
 
@@ -472,7 +471,7 @@
       using std::swap;
       swap(priv_comp(), priv_comp());
       //These can't throw
- node_algorithms::swap_tree(node_ptr(&priv_header()), node_ptr(&other.priv_header()));
+ node_algorithms::swap_tree(this->priv_header_ptr(), node_ptr(other.priv_header_ptr()));
       if(constant_time_size){
          size_type backup = this->priv_size_traits().get_size();
          this->priv_size_traits().set_size(other.priv_size_traits().get_size());
@@ -499,7 +498,7 @@
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       iterator ret(node_algorithms::insert_equal_upper_bound
- (node_ptr(&priv_header()), to_insert, key_node_comp), this);
+ (this->priv_header_ptr(), to_insert, key_node_comp), this);
       this->priv_size_traits().increment();
       return ret;
    }
@@ -526,7 +525,7 @@
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       iterator ret(node_algorithms::insert_equal
- (node_ptr(&priv_header()), hint.pointed_node(), to_insert, key_node_comp), this);
+ (this->priv_header_ptr(), hint.pointed_node(), to_insert, key_node_comp), this);
       this->priv_size_traits().increment();
       return ret;
    }
@@ -662,7 +661,7 @@
          comp(key_value_comp, this);
       std::pair<node_ptr, bool> ret =
          (node_algorithms::insert_unique_check
- (node_ptr(&priv_header()), key, comp, commit_data));
+ (this->priv_header_ptr(), key, comp, commit_data));
       return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
    }
 
@@ -707,7 +706,7 @@
          comp(key_value_comp, this);
       std::pair<node_ptr, bool> ret =
          (node_algorithms::insert_unique_check
- (node_ptr(&priv_header()), hint.pointed_node(), key, comp, commit_data));
+ (this->priv_header_ptr(), hint.pointed_node(), key, comp, commit_data));
       return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
    }
 
@@ -734,7 +733,7 @@
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       node_algorithms::insert_unique_commit
- (node_ptr(&priv_header()), to_insert, commit_data);
+ (this->priv_header_ptr(), to_insert, commit_data);
       this->priv_size_traits().increment();
       return iterator(to_insert, this);
    }
@@ -760,7 +759,7 @@
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       this->priv_size_traits().increment();
       return iterator(node_algorithms::insert_before
- (node_ptr(&priv_header()), pos.pointed_node(), to_insert), this);
+ (this->priv_header_ptr(), pos.pointed_node(), to_insert), this);
    }
 
    //! <b>Requires</b>: value must be an lvalue, and it must be no less
@@ -783,7 +782,7 @@
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       this->priv_size_traits().increment();
- node_algorithms::push_back(node_ptr(&priv_header()), to_insert);
+ node_algorithms::push_back(this->priv_header_ptr(), to_insert);
    }
 
    //! <b>Requires</b>: value must be an lvalue, and it must be no greater
@@ -806,7 +805,7 @@
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       this->priv_size_traits().increment();
- node_algorithms::push_front(node_ptr(&priv_header()), to_insert);
+ node_algorithms::push_front(this->priv_header_ptr(), to_insert);
    }
 
    //! <b>Effects</b>: Erases the element pointed to by pos.
@@ -824,7 +823,7 @@
       node_ptr to_erase(i.pointed_node());
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!node_algorithms::unique(to_erase));
- node_algorithms::erase(&priv_header(), to_erase);
+ node_algorithms::erase(this->priv_header_ptr(), to_erase);
       this->priv_size_traits().decrement();
       if(safemode_or_autounlink)
          node_algorithms::init(to_erase);
@@ -986,7 +985,7 @@
          this->clear_and_dispose(detail::null_disposer());
       }
       else{
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
          this->priv_size_traits().set_size(0);
       }
    }
@@ -1003,9 +1002,9 @@
    template<class Disposer>
    void clear_and_dispose(Disposer disposer)
    {
- node_algorithms::clear_and_dispose(node_ptr(&priv_header())
+ node_algorithms::clear_and_dispose(this->priv_header_ptr()
          , detail::node_disposer<Disposer, rbtree_impl>(disposer, this));
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
       this->priv_size_traits().set_size(0);
    }
 
@@ -1061,7 +1060,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, rbtree_impl>
          key_node_comp(comp, this);
       return iterator(node_algorithms::lower_bound
- (const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Returns a const iterator to the first element whose
@@ -1076,7 +1075,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, rbtree_impl>
          key_node_comp(comp, this);
       return const_iterator(node_algorithms::lower_bound
- (const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Returns an iterator to the first element whose
@@ -1101,7 +1100,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, rbtree_impl>
          key_node_comp(comp, this);
       return iterator(node_algorithms::upper_bound
- (const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Returns an iterator to the first element whose
@@ -1126,7 +1125,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, rbtree_impl>
          key_node_comp(comp, this);
       return const_iterator(node_algorithms::upper_bound
- (const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Finds an iterator to the first element whose key is
@@ -1150,7 +1149,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, rbtree_impl>
          key_node_comp(comp, this);
       return iterator
- (node_algorithms::find(const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (node_algorithms::find(this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Finds a const_iterator to the first element whose key is
@@ -1174,7 +1173,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, rbtree_impl>
          key_node_comp(comp, this);
       return const_iterator
- (node_algorithms::find(const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (node_algorithms::find(this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Finds a range containing all elements whose key is k or
@@ -1200,7 +1199,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, rbtree_impl>
          key_node_comp(comp, this);
       std::pair<node_ptr, node_ptr> ret
- (node_algorithms::equal_range(const_node_ptr(&priv_header()), key, key_node_comp));
+ (node_algorithms::equal_range(this->priv_header_ptr(), key, key_node_comp));
       return std::pair<iterator, iterator>(iterator(ret.first, this), iterator(ret.second, this));
    }
 
@@ -1229,7 +1228,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, rbtree_impl>
          key_node_comp(comp, this);
       std::pair<node_ptr, node_ptr> ret
- (node_algorithms::equal_range(const_node_ptr(&priv_header()), key, key_node_comp));
+ (node_algorithms::equal_range(this->priv_header_ptr(), key, key_node_comp));
       return std::pair<const_iterator, const_iterator>(const_iterator(ret.first, this), const_iterator(ret.second, this));
    }
 
@@ -1255,8 +1254,8 @@
          detail::exception_disposer<rbtree_impl, Disposer>
             rollback(*this, disposer);
          node_algorithms::clone
- (const_node_ptr(&src.priv_header())
- ,node_ptr(&this->priv_header())
+ (const_node_ptr(src.priv_header_ptr())
+ ,node_ptr(this->priv_header_ptr())
             ,detail::node_cloner<Cloner, rbtree_impl>(cloner, this)
             ,detail::node_disposer<Disposer, rbtree_impl>(disposer, this));
          this->priv_size_traits().set_size(src.priv_size_traits().get_size());
@@ -1278,7 +1277,7 @@
    pointer unlink_leftmost_without_rebalance()
    {
       node_ptr to_be_disposed(node_algorithms::unlink_leftmost_without_rebalance
- (node_ptr(&priv_header())));
+ (this->priv_header_ptr()));
       if(!to_be_disposed)
          return 0;
       this->priv_size_traits().decrement();
@@ -1304,7 +1303,7 @@
    void replace_node(iterator replace_this, reference with_this)
    {
       node_algorithms::replace_node( get_real_value_traits().to_node_ptr(*replace_this)
- , node_ptr(&priv_header())
+ , this->priv_header_ptr()
                                    , get_real_value_traits().to_node_ptr(with_this));
       if(safemode_or_autounlink)
          node_algorithms::init(replace_this.pointed_node());
@@ -1427,7 +1426,7 @@
    static rbtree_impl &priv_container_from_end_iterator(const const_iterator &end_iterator)
    {
       header_plus_size *r = detail::parent_from_member<header_plus_size, node>
- ( detail::boost_intrusive_get_pointer(end_iterator.pointed_node()), &header_plus_size::header_);
+ ( boost::intrusive::detail::to_raw_pointer(end_iterator.pointed_node()), &header_plus_size::header_);
       node_plus_pred_t *n = detail::parent_from_member
          <node_plus_pred_t, header_plus_size>(r, &node_plus_pred_t::header_plus_size_);
       data_t *d = detail::parent_from_member<data_t, node_plus_pred_t>(n, &data_t::node_plus_pred_);

Modified: branches/release/boost/intrusive/rbtree_algorithms.hpp
==============================================================================
--- branches/release/boost/intrusive/rbtree_algorithms.hpp (original)
+++ branches/release/boost/intrusive/rbtree_algorithms.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -56,6 +56,7 @@
 #include <boost/intrusive/detail/assert.hpp>
 #include <boost/intrusive/detail/utilities.hpp>
 #include <boost/intrusive/detail/tree_algorithms.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 
 namespace boost {
 namespace intrusive {
@@ -135,7 +136,7 @@
          : base_t(f)
       {}
       
- node_ptr operator()(node_ptr p)
+ node_ptr operator()(const node_ptr & p)
       {
          node_ptr n = base_t::get()(p);
          NodeTraits::set_color(n, NodeTraits::get_color(p));
@@ -145,7 +146,7 @@
 
    struct rbtree_erase_fixup
    {
- void operator()(node_ptr to_erase, node_ptr successor)
+ void operator()(const node_ptr & to_erase, const node_ptr & successor)
       {
          //Swap color of y and z
          color tmp(NodeTraits::get_color(successor));
@@ -154,17 +155,15 @@
       }
    };
 
- static node_ptr uncast(const_node_ptr ptr)
- {
- return node_ptr(const_cast<node*>(::boost::intrusive::detail::boost_intrusive_get_pointer(ptr)));
- }
+ static node_ptr uncast(const const_node_ptr & ptr)
+ { return pointer_traits<node_ptr>::const_cast_from(ptr); }
    /// @endcond
 
    public:
- static node_ptr begin_node(const_node_ptr header)
+ static node_ptr begin_node(const const_node_ptr & header)
    { return tree_algorithms::begin_node(header); }
 
- static node_ptr end_node(const_node_ptr header)
+ static node_ptr end_node(const const_node_ptr & header)
    { return tree_algorithms::end_node(header); }
 
    //! This type is the information that will be
@@ -180,7 +179,7 @@
    //! <b>Complexity</b>: Constant.
    //!
    //! <b>Throws</b>: Nothing.
- static void swap_tree(node_ptr header1, node_ptr header2)
+ static void swap_tree(const node_ptr & header1, const node_ptr & header2)
    { return tree_algorithms::swap_tree(header1, header2); }
 
    //! <b>Requires</b>: node1 and node2 can't be header nodes
@@ -198,7 +197,7 @@
    //! node1 and node2 are not equivalent according to the ordering rules.
    //!
    //!Experimental function
- static void swap_nodes(node_ptr node1, node_ptr node2)
+ static void swap_nodes(const node_ptr & node1, const node_ptr & node2)
    {
       if(node1 == node2)
          return;
@@ -222,7 +221,7 @@
    //! node1 and node2 are not equivalent according to the ordering rules.
    //!
    //!Experimental function
- static void swap_nodes(node_ptr node1, node_ptr header1, node_ptr node2, node_ptr header2)
+ static void swap_nodes(const node_ptr & node1, const node_ptr & header1, const node_ptr & node2, const node_ptr & header2)
    {
       if(node1 == node2) return;
 
@@ -249,7 +248,7 @@
    //! the node, since no rebalancing and comparison is needed.
    //!
    //!Experimental function
- static void replace_node(node_ptr node_to_be_replaced, node_ptr new_node)
+ static void replace_node(const node_ptr & node_to_be_replaced, const node_ptr & new_node)
    {
       if(node_to_be_replaced == new_node)
          return;
@@ -272,7 +271,7 @@
    //! the node, since no rebalancing or comparison is needed.
    //!
    //!Experimental function
- static void replace_node(node_ptr node_to_be_replaced, node_ptr header, node_ptr new_node)
+ static void replace_node(const node_ptr & node_to_be_replaced, const node_ptr & header, const node_ptr & new_node)
    {
       tree_algorithms::replace_node(node_to_be_replaced, header, new_node);
       NodeTraits::set_color(new_node, NodeTraits::get_color(node_to_be_replaced));
@@ -285,7 +284,7 @@
    //! <b>Complexity</b>: Average complexity is constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static void unlink(node_ptr node)
+ static void unlink(const node_ptr & node)
    {
       node_ptr x = NodeTraits::get_parent(node);
       if(x){
@@ -308,7 +307,7 @@
    //! only be used for more unlink_leftmost_without_rebalance calls.
    //! This function is normally used to achieve a step by step
    //! controlled destruction of the tree.
- static node_ptr unlink_leftmost_without_rebalance(node_ptr header)
+ static node_ptr unlink_leftmost_without_rebalance(const node_ptr & header)
    { return tree_algorithms::unlink_leftmost_without_rebalance(header); }
 
    //! <b>Requires</b>: node is a node of the tree or an node initialized
@@ -319,7 +318,7 @@
    //! <b>Complexity</b>: Constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static bool unique(const_node_ptr node)
+ static bool unique(const const_node_ptr & node)
    { return tree_algorithms::unique(node); }
 
    //! <b>Requires</b>: node is a node of the tree but it's not the header.
@@ -329,7 +328,7 @@
    //! <b>Complexity</b>: Linear time.
    //!
    //! <b>Throws</b>: Nothing.
- static std::size_t count(const_node_ptr node)
+ static std::size_t count(const const_node_ptr & node)
    { return tree_algorithms::count(node); }
 
    //! <b>Requires</b>: header is the header node of the tree.
@@ -339,7 +338,7 @@
    //! <b>Complexity</b>: Linear time.
    //!
    //! <b>Throws</b>: Nothing.
- static std::size_t size(const_node_ptr header)
+ static std::size_t size(const const_node_ptr & header)
    { return tree_algorithms::size(header); }
 
    //! <b>Requires</b>: p is a node from the tree except the header.
@@ -349,7 +348,7 @@
    //! <b>Complexity</b>: Average constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr next_node(node_ptr p)
+ static node_ptr next_node(const node_ptr & p)
    { return tree_algorithms::next_node(p); }
 
    //! <b>Requires</b>: p is a node from the tree except the leftmost node.
@@ -359,7 +358,7 @@
    //! <b>Complexity</b>: Average constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr prev_node(node_ptr p)
+ static node_ptr prev_node(const node_ptr & p)
    { return tree_algorithms::prev_node(p); }
 
    //! <b>Requires</b>: node must not be part of any tree.
@@ -371,7 +370,7 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Nodes</b>: If node is inserted in a tree, this function corrupts the tree.
- static void init(node_ptr node)
+ static void init(const node_ptr & node)
    { tree_algorithms::init(node); }
 
    //! <b>Requires</b>: node must not be part of any tree.
@@ -384,7 +383,7 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Nodes</b>: If node is inserted in a tree, this function corrupts the tree.
- static void init_header(node_ptr header)
+ static void init_header(const node_ptr & header)
    {
       tree_algorithms::init_header(header);
       NodeTraits::set_color(header, NodeTraits::red());
@@ -398,7 +397,7 @@
    //! <b>Complexity</b>: Amortized constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr erase(node_ptr header, node_ptr z)
+ static node_ptr erase(const node_ptr & header, const node_ptr & z)
    {
       typename tree_algorithms::data_for_rebalance info;
       tree_algorithms::erase(header, z, rbtree_erase_fixup(), info);
@@ -417,13 +416,13 @@
    //! take a node_ptr and shouldn't throw.
    //!
    //! <b>Effects</b>: First empties target tree calling
- //! <tt>void disposer::operator()(node_ptr)</tt> for every node of the tree
+ //! <tt>void disposer::operator()(const node_ptr &)</tt> for every node of the tree
    //! except the header.
    //!
    //! Then, duplicates the entire tree pointed by "source_header" cloning each
- //! source node with <tt>node_ptr Cloner::operator()(node_ptr)</tt> to obtain
+ //! source node with <tt>node_ptr Cloner::operator()(const node_ptr &)</tt> to obtain
    //! the nodes of the target tree. If "cloner" throws, the cloned target nodes
- //! are disposed using <tt>void disposer(node_ptr)</tt>.
+ //! are disposed using <tt>void disposer(const node_ptr &)</tt>.
    //!
    //! <b>Complexity</b>: Linear to the number of element of the source tree plus the.
    //! number of elements of tree target tree when calling this function.
@@ -431,7 +430,7 @@
    //! <b>Throws</b>: If cloner functor throws. If this happens target nodes are disposed.
    template <class Cloner, class Disposer>
    static void clone
- (const_node_ptr source_header, node_ptr target_header, Cloner cloner, Disposer disposer)
+ (const const_node_ptr & source_header, const node_ptr & target_header, Cloner cloner, Disposer disposer)
    {
       rbtree_node_cloner<Cloner> new_cloner(cloner);
       tree_algorithms::clone(source_header, target_header, new_cloner, disposer);
@@ -441,7 +440,7 @@
    //! taking a node_ptr parameter and shouldn't throw.
    //!
    //! <b>Effects</b>: Empties the target tree calling
- //! <tt>void disposer::operator()(node_ptr)</tt> for every node of the tree
+ //! <tt>void disposer::operator()(const node_ptr &)</tt> for every node of the tree
    //! except the header.
    //!
    //! <b>Complexity</b>: Linear to the number of element of the source tree plus the.
@@ -449,7 +448,7 @@
    //!
    //! <b>Throws</b>: If cloner functor throws. If this happens target nodes are disposed.
    template<class Disposer>
- static void clear_and_dispose(node_ptr header, Disposer disposer)
+ static void clear_and_dispose(const node_ptr & header, Disposer disposer)
    { tree_algorithms::clear_and_dispose(header, disposer); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -466,7 +465,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static node_ptr lower_bound
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    { return tree_algorithms::lower_bound(header, key, comp); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -482,7 +481,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static node_ptr upper_bound
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    { return tree_algorithms::upper_bound(header, key, comp); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -498,7 +497,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static node_ptr find
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    { return tree_algorithms::find(header, key, comp); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -516,7 +515,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static std::pair<node_ptr, node_ptr> equal_range
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    { return tree_algorithms::equal_range(header, key, comp); }
 
    //! <b>Requires</b>: "h" must be the header node of a tree.
@@ -533,7 +532,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class NodePtrCompare>
    static node_ptr insert_equal_upper_bound
- (node_ptr h, node_ptr new_node, NodePtrCompare comp)
+ (const node_ptr & h, const node_ptr & new_node, NodePtrCompare comp)
    {
       tree_algorithms::insert_equal_upper_bound(h, new_node, comp);
       rebalance_after_insertion(h, new_node);
@@ -554,7 +553,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class NodePtrCompare>
    static node_ptr insert_equal_lower_bound
- (node_ptr h, node_ptr new_node, NodePtrCompare comp)
+ (const node_ptr & h, const node_ptr & new_node, NodePtrCompare comp)
    {
       tree_algorithms::insert_equal_lower_bound(h, new_node, comp);
       rebalance_after_insertion(h, new_node);
@@ -577,7 +576,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class NodePtrCompare>
    static node_ptr insert_equal
- (node_ptr header, node_ptr hint, node_ptr new_node, NodePtrCompare comp)
+ (const node_ptr & header, const node_ptr & hint, const node_ptr & new_node, NodePtrCompare comp)
    {
       tree_algorithms::insert_equal(header, hint, new_node, comp);
       rebalance_after_insertion(header, new_node);
@@ -599,7 +598,7 @@
    //! <b>Note</b>: If "pos" is not the successor of the newly inserted "new_node"
    //! tree invariants might be broken.
    static node_ptr insert_before
- (node_ptr header, node_ptr pos, node_ptr new_node)
+ (const node_ptr & header, const node_ptr & pos, const node_ptr & new_node)
    {
       tree_algorithms::insert_before(header, pos, new_node);
       rebalance_after_insertion(header, new_node);
@@ -619,7 +618,7 @@
    //! <b>Note</b>: If "new_node" is less than the greatest inserted key
    //! tree invariants are broken. This function is slightly faster than
    //! using "insert_before".
- static void push_back(node_ptr header, node_ptr new_node)
+ static void push_back(const node_ptr & header, const node_ptr & new_node)
    {
       tree_algorithms::push_back(header, new_node);
       rebalance_after_insertion(header, new_node);
@@ -638,7 +637,7 @@
    //! <b>Note</b>: If "new_node" is greater than the lowest inserted key
    //! tree invariants are broken. This function is slightly faster than
    //! using "insert_before".
- static void push_front(node_ptr header, node_ptr new_node)
+ static void push_front(const node_ptr & header, const node_ptr & new_node)
    {
       tree_algorithms::push_front(header, new_node);
       rebalance_after_insertion(header, new_node);
@@ -680,7 +679,7 @@
    //! if no more objects are inserted or erased from the set.
    template<class KeyType, class KeyNodePtrCompare>
    static std::pair<node_ptr, bool> insert_unique_check
- (const_node_ptr header, const KeyType &key
+ (const const_node_ptr & header, const KeyType &key
       ,KeyNodePtrCompare comp, insert_commit_data &commit_data)
    { return tree_algorithms::insert_unique_check(header, key, comp, commit_data); }
 
@@ -725,7 +724,7 @@
    //! if no more objects are inserted or erased from the set.
    template<class KeyType, class KeyNodePtrCompare>
    static std::pair<node_ptr, bool> insert_unique_check
- (const_node_ptr header, node_ptr hint, const KeyType &key
+ (const const_node_ptr & header, const node_ptr &hint, const KeyType &key
       ,KeyNodePtrCompare comp, insert_commit_data &commit_data)
    { return tree_algorithms::insert_unique_check(header, hint, key, comp, commit_data); }
 
@@ -747,7 +746,7 @@
    //! previously executed to fill "commit_data". No value should be inserted or
    //! erased between the "insert_check" and "insert_commit" calls.
    static void insert_unique_commit
- (node_ptr header, node_ptr new_value, const insert_commit_data &commit_data)
+ (const node_ptr & header, const node_ptr & new_value, const insert_commit_data &commit_data)
    {
       tree_algorithms::insert_unique_commit(header, new_value, commit_data);
       rebalance_after_insertion(header, new_value);
@@ -760,7 +759,7 @@
    //! <b>Complexity</b>: Logarithmic.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr get_header(node_ptr n)
+ static node_ptr get_header(const node_ptr & n)
    { return tree_algorithms::get_header(n); }
 
    /// @cond
@@ -773,7 +772,7 @@
    //! <b>Complexity</b>: Constant.
    //!
    //! <b>Throws</b>: Nothing.
- static bool is_header(const_node_ptr p)
+ static bool is_header(const const_node_ptr & p)
    {
       return NodeTraits::get_color(p) == NodeTraits::red() &&
             tree_algorithms::is_header(p);
@@ -781,9 +780,10 @@
       // NodeTraits::get_parent(NodeTraits::get_parent(p)) == p;
    }
 
- static void rebalance_after_erasure(node_ptr header, node_ptr x, node_ptr x_parent)
+ static void rebalance_after_erasure(const node_ptr & header, const node_ptr &xnode, const node_ptr &xnode_parent)
    {
- while(x != NodeTraits::get_parent(header) && (x == 0 || NodeTraits::get_color(x) == NodeTraits::black())){
+ node_ptr x(xnode), x_parent(xnode_parent);
+ while(x != NodeTraits::get_parent(header) && (x == node_ptr() || NodeTraits::get_color(x) == NodeTraits::black())){
          if(x == NodeTraits::get_left(x_parent)){
             node_ptr w = NodeTraits::get_right(x_parent);
             if(NodeTraits::get_color(w) == NodeTraits::red()){
@@ -792,14 +792,14 @@
                tree_algorithms::rotate_left(x_parent, header);
                w = NodeTraits::get_right(x_parent);
             }
- if((NodeTraits::get_left(w) == 0 || NodeTraits::get_color(NodeTraits::get_left(w)) == NodeTraits::black()) &&
- (NodeTraits::get_right(w) == 0 || NodeTraits::get_color(NodeTraits::get_right(w)) == NodeTraits::black())){
+ if((NodeTraits::get_left(w) == node_ptr() || NodeTraits::get_color(NodeTraits::get_left(w)) == NodeTraits::black()) &&
+ (NodeTraits::get_right(w) == node_ptr() || NodeTraits::get_color(NodeTraits::get_right(w)) == NodeTraits::black())){
                NodeTraits::set_color(w, NodeTraits::red());
                x = x_parent;
                x_parent = NodeTraits::get_parent(x_parent);
             }
             else {
- if(NodeTraits::get_right(w) == 0 || NodeTraits::get_color(NodeTraits::get_right(w)) == NodeTraits::black()){
+ if(NodeTraits::get_right(w) == node_ptr() || NodeTraits::get_color(NodeTraits::get_right(w)) == NodeTraits::black()){
                   NodeTraits::set_color(NodeTraits::get_left(w), NodeTraits::black());
                   NodeTraits::set_color(w, NodeTraits::red());
                   tree_algorithms::rotate_right(w, header);
@@ -822,14 +822,14 @@
                tree_algorithms::rotate_right(x_parent, header);
                w = NodeTraits::get_left(x_parent);
             }
- if((NodeTraits::get_right(w) == 0 || NodeTraits::get_color(NodeTraits::get_right(w)) == NodeTraits::black()) &&
- (NodeTraits::get_left(w) == 0 || NodeTraits::get_color(NodeTraits::get_left(w)) == NodeTraits::black())){
+ if((NodeTraits::get_right(w) == node_ptr() || NodeTraits::get_color(NodeTraits::get_right(w)) == NodeTraits::black()) &&
+ (NodeTraits::get_left(w) == node_ptr() || NodeTraits::get_color(NodeTraits::get_left(w)) == NodeTraits::black())){
                NodeTraits::set_color(w, NodeTraits::red());
                x = x_parent;
                x_parent = NodeTraits::get_parent(x_parent);
             }
             else {
- if(NodeTraits::get_left(w) == 0 || NodeTraits::get_color(NodeTraits::get_left(w)) == NodeTraits::black()){
+ if(NodeTraits::get_left(w) == node_ptr() || NodeTraits::get_color(NodeTraits::get_left(w)) == NodeTraits::black()){
                   NodeTraits::set_color(NodeTraits::get_right(w), NodeTraits::black());
                   NodeTraits::set_color(w, NodeTraits::red());
                   tree_algorithms::rotate_left(w, header);
@@ -849,8 +849,9 @@
    }
 
 
- static void rebalance_after_insertion(node_ptr header, node_ptr p)
+ static void rebalance_after_insertion(const node_ptr & header, const node_ptr &pnode)
    {
+ node_ptr p(pnode);
       NodeTraits::set_color(p, NodeTraits::red());
       while(p != NodeTraits::get_parent(header) && NodeTraits::get_color(NodeTraits::get_parent(p)) == NodeTraits::red()){
          node_ptr p_parent(NodeTraits::get_parent(p));

Modified: branches/release/boost/intrusive/sgtree.hpp
==============================================================================
--- branches/release/boost/intrusive/sgtree.hpp (original)
+++ branches/release/boost/intrusive/sgtree.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -32,9 +32,10 @@
 #include <boost/intrusive/bs_set_hook.hpp>
 #include <boost/intrusive/detail/tree_node.hpp>
 #include <boost/intrusive/detail/ebo_functor_holder.hpp>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/detail/clear_on_destructor_base.hpp>
 #include <boost/intrusive/detail/mpl.hpp>
+#include <boost/intrusive/detail/utilities.hpp>
 #include <boost/intrusive/options.hpp>
 #include <boost/intrusive/sgtree_algorithms.hpp>
 #include <boost/intrusive/link_mode.hpp>
@@ -223,24 +224,26 @@
    /// @endcond
    typedef typename real_value_traits::pointer pointer;
    typedef typename real_value_traits::const_pointer const_pointer;
- typedef typename std::iterator_traits<pointer>::value_type value_type;
+ typedef typename pointer_traits<pointer>::element_type value_type;
    typedef value_type key_type;
- typedef typename std::iterator_traits<pointer>::reference reference;
- typedef typename std::iterator_traits<const_pointer>::reference const_reference;
- typedef typename std::iterator_traits<pointer>::difference_type difference_type;
+ typedef typename pointer_traits<pointer>::reference reference;
+ typedef typename pointer_traits<const_pointer>::reference const_reference;
+ typedef typename pointer_traits<const_pointer>::difference_type difference_type;
    typedef typename Config::size_type size_type;
    typedef typename Config::compare value_compare;
    typedef value_compare key_compare;
    typedef tree_iterator<sgtree_impl, false> iterator;
    typedef tree_iterator<sgtree_impl, true> const_iterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef boost::intrusive::detail::reverse_iterator<iterator> reverse_iterator;
+ typedef boost::intrusive::detail::reverse_iterator<const_iterator>const_reverse_iterator;
    typedef typename real_value_traits::node_traits node_traits;
    typedef typename node_traits::node node;
- typedef typename boost::pointer_to_other
- <pointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <node_ptr, const node>::type const_node_ptr;
+ typedef typename pointer_traits
+ <pointer>::template rebind_pointer
+ <node>::type node_ptr;
+ typedef typename pointer_traits
+ <pointer>::template rebind_pointer
+ <const node>::type const_node_ptr;
    typedef sgtree_algorithms<node_traits> node_algorithms;
 
    static const bool floating_point = Config::floating_point;
@@ -309,14 +312,14 @@
    value_traits &priv_value_traits()
    { return data_; }
 
- const node &priv_header() const
- { return data_.node_plus_pred_.header_plus_alpha_.header_; }
+ node_ptr priv_header_ptr()
+ { return pointer_traits<node_ptr>::pointer_to(data_.node_plus_pred_.header_plus_alpha_.header_); }
 
- node &priv_header()
- { return data_.node_plus_pred_.header_plus_alpha_.header_; }
+ const_node_ptr priv_header_ptr() const
+ { return pointer_traits<const_node_ptr>::pointer_to(data_.node_plus_pred_.header_plus_alpha_.header_); }
 
- static node_ptr uncast(const_node_ptr ptr)
- { return node_ptr(const_cast<node*>(detail::boost_intrusive_get_pointer(ptr))); }
+ static node_ptr uncast(const const_node_ptr & ptr)
+ { return pointer_traits<node_ptr>::const_cast_from(ptr); }
 
    size_traits &priv_size_traits()
    { return data_.node_plus_pred_.size_traits_; }
@@ -371,7 +374,7 @@
               , const value_traits &v_traits = value_traits())
       : data_(cmp, v_traits)
    {
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
       this->priv_size_traits().set_size(size_type(0));
    }
 
@@ -393,7 +396,7 @@
               , const value_traits &v_traits = value_traits())
       : data_(cmp, v_traits)
    {
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
       this->priv_size_traits().set_size(size_type(0));
       if(unique)
          this->insert_unique(b, e);
@@ -406,7 +409,7 @@
    sgtree_impl(BOOST_RV_REF(sgtree_impl) x)
       : data_(::boost::move(x.priv_comp()), ::boost::move(x.priv_value_traits()))
    {
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
       this->priv_size_traits().set_size(size_type(0));
       this->swap(x);
    }
@@ -432,7 +435,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    iterator begin()
- { return iterator (node_traits::get_left(node_ptr(&priv_header())), this); }
+ { return iterator (node_traits::get_left(this->priv_header_ptr()), this); }
 
    //! <b>Effects</b>: Returns a const_iterator pointing to the beginning of the tree.
    //!
@@ -448,7 +451,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    const_iterator cbegin() const
- { return const_iterator (node_traits::get_left(const_node_ptr(&priv_header())), this); }
+ { return const_iterator (node_traits::get_left(this->priv_header_ptr()), this); }
 
    //! <b>Effects</b>: Returns an iterator pointing to the end of the tree.
    //!
@@ -456,7 +459,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    iterator end()
- { return iterator (node_ptr(&priv_header()), this); }
+ { return iterator (this->priv_header_ptr(), this); }
 
    //! <b>Effects</b>: Returns a const_iterator pointing to the end of the tree.
    //!
@@ -472,7 +475,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    const_iterator cend() const
- { return const_iterator (uncast(const_node_ptr(&priv_header())), this); }
+ { return const_iterator (uncast(this->priv_header_ptr()), this); }
 
    //! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning of the
    //! reversed tree.
@@ -586,7 +589,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    bool empty() const
- { return node_algorithms::unique(const_node_ptr(&priv_header())); }
+ { return node_algorithms::unique(this->priv_header_ptr()); }
 
    //! <b>Effects</b>: Returns the number of elements stored in the tree.
    //!
@@ -599,7 +602,7 @@
       if(constant_time_size)
          return this->priv_size_traits().get_size();
       else{
- return (size_type)node_algorithms::size(const_node_ptr(&priv_header()));
+ return (size_type)node_algorithms::size(this->priv_header_ptr());
       }
    }
 
@@ -616,7 +619,7 @@
       swap(priv_alpha_traits(), priv_alpha_traits());
       swap(data_.max_tree_size_, other.data_.max_tree_size_);
       //These can't throw
- node_algorithms::swap_tree(node_ptr(&priv_header()), node_ptr(&other.priv_header()));
+ node_algorithms::swap_tree(this->priv_header_ptr(), other.priv_header_ptr());
       if(constant_time_size){
          size_type backup = this->priv_size_traits().get_size();
          this->priv_size_traits().set_size(other.priv_size_traits().get_size());
@@ -644,7 +647,7 @@
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       std::size_t max_tree_size = (std::size_t)data_.max_tree_size_;
       node_ptr p = node_algorithms::insert_equal_upper_bound
- (node_ptr(&priv_header()), to_insert, key_node_comp
+ (this->priv_header_ptr(), to_insert, key_node_comp
          , (size_type)this->size(), this->get_h_alpha_func(), max_tree_size);
       this->priv_size_traits().increment();
       data_.max_tree_size_ = (size_type)max_tree_size;
@@ -674,7 +677,7 @@
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       std::size_t max_tree_size = (std::size_t)data_.max_tree_size_;
       node_ptr p = node_algorithms::insert_equal
- (node_ptr(&priv_header()), hint.pointed_node(), to_insert, key_node_comp
+ (this->priv_header_ptr(), hint.pointed_node(), to_insert, key_node_comp
          , (std::size_t)this->size(), this->get_h_alpha_func(), max_tree_size);
       this->priv_size_traits().increment();
       data_.max_tree_size_ = (size_type)max_tree_size;
@@ -812,7 +815,7 @@
          comp(key_value_comp, this);
       std::pair<node_ptr, bool> ret =
          (node_algorithms::insert_unique_check
- (node_ptr(&priv_header()), key, comp, commit_data));
+ (this->priv_header_ptr(), key, comp, commit_data));
       return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
    }
 
@@ -857,7 +860,7 @@
          comp(key_value_comp, this);
       std::pair<node_ptr, bool> ret =
          (node_algorithms::insert_unique_check
- (node_ptr(&priv_header()), hint.pointed_node(), key, comp, commit_data));
+ (this->priv_header_ptr(), hint.pointed_node(), key, comp, commit_data));
       return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
    }
 
@@ -885,7 +888,7 @@
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       std::size_t max_tree_size = (std::size_t)data_.max_tree_size_;
       node_algorithms::insert_unique_commit
- ( node_ptr(&priv_header()), to_insert, commit_data
+ ( this->priv_header_ptr(), to_insert, commit_data
          , (std::size_t)this->size(), this->get_h_alpha_func(), max_tree_size);
       this->priv_size_traits().increment();
       data_.max_tree_size_ = (size_type)max_tree_size;
@@ -913,7 +916,7 @@
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       std::size_t max_tree_size = (std::size_t)data_.max_tree_size_;
       node_ptr p = node_algorithms::insert_before
- ( node_ptr(&priv_header()), pos.pointed_node(), to_insert
+ ( this->priv_header_ptr(), pos.pointed_node(), to_insert
          , (size_type)this->size(), this->get_h_alpha_func(), max_tree_size);
       this->priv_size_traits().increment();
       data_.max_tree_size_ = (size_type)max_tree_size;
@@ -941,7 +944,7 @@
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       std::size_t max_tree_size = (std::size_t)data_.max_tree_size_;
       node_algorithms::push_back
- ( node_ptr(&priv_header()), to_insert
+ ( this->priv_header_ptr(), to_insert
          , (size_type)this->size(), this->get_h_alpha_func(), max_tree_size);
       this->priv_size_traits().increment();
       data_.max_tree_size_ = (size_type)max_tree_size;
@@ -968,7 +971,7 @@
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       std::size_t max_tree_size = (std::size_t)data_.max_tree_size_;
       node_algorithms::push_front
- ( node_ptr(&priv_header()), to_insert
+ ( this->priv_header_ptr(), to_insert
          , (size_type)this->size(), this->get_h_alpha_func(), max_tree_size);
       this->priv_size_traits().increment();
       data_.max_tree_size_ = (size_type)max_tree_size;
@@ -991,7 +994,7 @@
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!node_algorithms::unique(to_erase));
       std::size_t max_tree_size = data_.max_tree_size_;
       node_algorithms::erase
- ( &priv_header(), to_erase, (std::size_t)this->size()
+ ( this->priv_header_ptr(), to_erase, (std::size_t)this->size()
          , max_tree_size, this->get_alpha_by_max_size_func());
       data_.max_tree_size_ = (size_type)max_tree_size;
       this->priv_size_traits().decrement();
@@ -1155,7 +1158,7 @@
          this->clear_and_dispose(detail::null_disposer());
       }
       else{
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
          this->priv_size_traits().set_size(0);
       }
    }
@@ -1172,7 +1175,7 @@
    template<class Disposer>
    void clear_and_dispose(Disposer disposer)
    {
- node_algorithms::clear_and_dispose(node_ptr(&priv_header())
+ node_algorithms::clear_and_dispose(this->priv_header_ptr()
          , detail::node_disposer<Disposer, sgtree_impl>(disposer, this));
       this->priv_size_traits().set_size(0);
    }
@@ -1229,7 +1232,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, sgtree_impl>
          key_node_comp(comp, this);
       return iterator(node_algorithms::lower_bound
- (const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Returns a const iterator to the first element whose
@@ -1244,7 +1247,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, sgtree_impl>
          key_node_comp(comp, this);
       return const_iterator(node_algorithms::lower_bound
- (const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Returns an iterator to the first element whose
@@ -1269,7 +1272,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, sgtree_impl>
          key_node_comp(comp, this);
       return iterator(node_algorithms::upper_bound
- (const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Returns an iterator to the first element whose
@@ -1294,7 +1297,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, sgtree_impl>
          key_node_comp(comp, this);
       return const_iterator(node_algorithms::upper_bound
- (const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Finds an iterator to the first element whose key is
@@ -1318,7 +1321,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, sgtree_impl>
          key_node_comp(comp, this);
       return iterator
- (node_algorithms::find(const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (node_algorithms::find(this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Finds a const_iterator to the first element whose key is
@@ -1342,7 +1345,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, sgtree_impl>
          key_node_comp(comp, this);
       return const_iterator
- (node_algorithms::find(const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (node_algorithms::find(this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Finds a range containing all elements whose key is k or
@@ -1368,7 +1371,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, sgtree_impl>
          key_node_comp(comp, this);
       std::pair<node_ptr, node_ptr> ret
- (node_algorithms::equal_range(const_node_ptr(&priv_header()), key, key_node_comp));
+ (node_algorithms::equal_range(this->priv_header_ptr(), key, key_node_comp));
       return std::pair<iterator, iterator>(iterator(ret.first, this), iterator(ret.second, this));
    }
 
@@ -1397,7 +1400,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, sgtree_impl>
          key_node_comp(comp, this);
       std::pair<node_ptr, node_ptr> ret
- (node_algorithms::equal_range(const_node_ptr(&priv_header()), key, key_node_comp));
+ (node_algorithms::equal_range(this->priv_header_ptr(), key, key_node_comp));
       return std::pair<const_iterator, const_iterator>(const_iterator(ret.first, this), const_iterator(ret.second, this));
    }
 
@@ -1423,8 +1426,8 @@
          detail::exception_disposer<sgtree_impl, Disposer>
             rollback(*this, disposer);
          node_algorithms::clone
- (const_node_ptr(&src.priv_header())
- ,node_ptr(&this->priv_header())
+ (src.priv_header_ptr()
+ ,this->priv_header_ptr()
             ,detail::node_cloner<Cloner, sgtree_impl>(cloner, this)
             ,detail::node_disposer<Disposer, sgtree_impl>(disposer, this));
          this->priv_size_traits().set_size(src.priv_size_traits().get_size());
@@ -1446,7 +1449,7 @@
    pointer unlink_leftmost_without_rebalance()
    {
       node_ptr to_be_disposed(node_algorithms::unlink_leftmost_without_rebalance
- (node_ptr(&priv_header())));
+ (this->priv_header_ptr()));
       if(!to_be_disposed)
          return 0;
       this->priv_size_traits().decrement();
@@ -1472,7 +1475,7 @@
    void replace_node(iterator replace_this, reference with_this)
    {
       node_algorithms::replace_node( get_real_value_traits().to_node_ptr(*replace_this)
- , node_ptr(&priv_header())
+ , this->priv_header_ptr()
                                    , get_real_value_traits().to_node_ptr(with_this));
       if(safemode_or_autounlink)
          node_algorithms::init(replace_this.pointed_node());
@@ -1558,7 +1561,7 @@
    //!
    //! <b>Complexity</b>: Linear.
    void rebalance()
- { node_algorithms::rebalance(node_ptr(&priv_header())); }
+ { node_algorithms::rebalance(this->priv_header_ptr()); }
 
    //! <b>Requires</b>: old_root is a node of a tree.
    //!
@@ -1654,7 +1657,7 @@
    static sgtree_impl &priv_container_from_end_iterator(const const_iterator &end_iterator)
    {
       header_plus_alpha *r = detail::parent_from_member<header_plus_alpha, node>
- ( detail::boost_intrusive_get_pointer(end_iterator.pointed_node()), &header_plus_alpha::header_);
+ ( boost::intrusive::detail::to_raw_pointer(end_iterator.pointed_node()), &header_plus_alpha::header_);
       node_plus_pred_t *n = detail::parent_from_member
          <node_plus_pred_t, header_plus_alpha>(r, &node_plus_pred_t::header_plus_alpha_);
       data_t *d = detail::parent_from_member<data_t, node_plus_pred_t>(n, &data_t::node_plus_pred_);

Modified: branches/release/boost/intrusive/sgtree_algorithms.hpp
==============================================================================
--- branches/release/boost/intrusive/sgtree_algorithms.hpp (original)
+++ branches/release/boost/intrusive/sgtree_algorithms.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -24,6 +24,7 @@
 #include <boost/intrusive/detail/assert.hpp>
 #include <boost/intrusive/detail/utilities.hpp>
 #include <boost/intrusive/detail/tree_algorithms.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 
 
 namespace boost {
@@ -68,17 +69,15 @@
 
    typedef detail::tree_algorithms<NodeTraits> tree_algorithms;
 
- static node_ptr uncast(const_node_ptr ptr)
- {
- return node_ptr(const_cast<node*>(::boost::intrusive::detail::boost_intrusive_get_pointer(ptr)));
- }
+ static node_ptr uncast(const const_node_ptr & ptr)
+ { return pointer_traits<node_ptr>::const_cast_from(ptr); }
    /// @endcond
 
    public:
- static node_ptr begin_node(const_node_ptr header)
+ static node_ptr begin_node(const const_node_ptr & header)
    { return tree_algorithms::begin_node(header); }
 
- static node_ptr end_node(const_node_ptr header)
+ static node_ptr end_node(const const_node_ptr & header)
    { return tree_algorithms::end_node(header); }
 
    //! This type is the information that will be
@@ -98,7 +97,7 @@
    //! <b>Complexity</b>: Constant.
    //!
    //! <b>Throws</b>: Nothing.
- static void swap_tree(node_ptr header1, node_ptr header2)
+ static void swap_tree(const node_ptr & header1, const node_ptr & header2)
    { return tree_algorithms::swap_tree(header1, header2); }
 
    //! <b>Requires</b>: node1 and node2 can't be header nodes
@@ -116,7 +115,7 @@
    //! node1 and node2 are not equivalent according to the ordering rules.
    //!
    //!Experimental function
- static void swap_nodes(node_ptr node1, node_ptr node2)
+ static void swap_nodes(const node_ptr & node1, const node_ptr & node2)
    {
       if(node1 == node2)
          return;
@@ -140,7 +139,7 @@
    //! node1 and node2 are not equivalent according to the ordering rules.
    //!
    //!Experimental function
- static void swap_nodes(node_ptr node1, node_ptr header1, node_ptr node2, node_ptr header2)
+ static void swap_nodes(const node_ptr & node1, const node_ptr & header1, const node_ptr & node2, const node_ptr & header2)
    { tree_algorithms::swap_nodes(node1, header1, node2, header2); }
 
    //! <b>Requires</b>: node_to_be_replaced must be inserted in a tree
@@ -159,7 +158,7 @@
    //! the node, since no rebalancing and comparison is needed.
    //!
    //!Experimental function
- static void replace_node(node_ptr node_to_be_replaced, node_ptr new_node)
+ static void replace_node(const node_ptr & node_to_be_replaced, const node_ptr & new_node)
    {
       if(node_to_be_replaced == new_node)
          return;
@@ -182,7 +181,7 @@
    //! the node, since no rebalancing or comparison is needed.
    //!
    //!Experimental function
- static void replace_node(node_ptr node_to_be_replaced, node_ptr header, node_ptr new_node)
+ static void replace_node(const node_ptr & node_to_be_replaced, const node_ptr & header, const node_ptr & new_node)
    { tree_algorithms::replace_node(node_to_be_replaced, header, new_node); }
 
    //! <b>Requires</b>: node is a tree node but not the header.
@@ -192,7 +191,7 @@
    //! <b>Complexity</b>: Average complexity is constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static void unlink(node_ptr node)
+ static void unlink(const node_ptr & node)
    {
       node_ptr x = NodeTraits::get_parent(node);
       if(x){
@@ -215,7 +214,7 @@
    //! only be used for more unlink_leftmost_without_rebalance calls.
    //! This function is normally used to achieve a step by step
    //! controlled destruction of the tree.
- static node_ptr unlink_leftmost_without_rebalance(node_ptr header)
+ static node_ptr unlink_leftmost_without_rebalance(const node_ptr & header)
    { return tree_algorithms::unlink_leftmost_without_rebalance(header); }
 
    //! <b>Requires</b>: node is a node of the tree or an node initialized
@@ -226,7 +225,7 @@
    //! <b>Complexity</b>: Constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static bool unique(const_node_ptr node)
+ static bool unique(const const_node_ptr & node)
    { return tree_algorithms::unique(node); }
 
    //! <b>Requires</b>: node is a node of the tree but it's not the header.
@@ -236,7 +235,7 @@
    //! <b>Complexity</b>: Linear time.
    //!
    //! <b>Throws</b>: Nothing.
- static std::size_t count(const_node_ptr node)
+ static std::size_t count(const const_node_ptr & node)
    { return tree_algorithms::count(node); }
 
    //! <b>Requires</b>: header is the header node of the tree.
@@ -246,7 +245,7 @@
    //! <b>Complexity</b>: Linear time.
    //!
    //! <b>Throws</b>: Nothing.
- static std::size_t size(const_node_ptr header)
+ static std::size_t size(const const_node_ptr & header)
    { return tree_algorithms::size(header); }
 
    //! <b>Requires</b>: p is a node from the tree except the header.
@@ -256,7 +255,7 @@
    //! <b>Complexity</b>: Average constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr next_node(node_ptr p)
+ static node_ptr next_node(const node_ptr & p)
    { return tree_algorithms::next_node(p); }
 
    //! <b>Requires</b>: p is a node from the tree except the leftmost node.
@@ -266,7 +265,7 @@
    //! <b>Complexity</b>: Average constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr prev_node(node_ptr p)
+ static node_ptr prev_node(const node_ptr & p)
    { return tree_algorithms::prev_node(p); }
 
    //! <b>Requires</b>: node must not be part of any tree.
@@ -278,7 +277,7 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Nodes</b>: If node is inserted in a tree, this function corrupts the tree.
- static void init(node_ptr node)
+ static void init(const node_ptr & node)
    { tree_algorithms::init(node); }
 
    //! <b>Requires</b>: node must not be part of any tree.
@@ -291,7 +290,7 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Nodes</b>: If node is inserted in a tree, this function corrupts the tree.
- static void init_header(node_ptr header)
+ static void init_header(const node_ptr & header)
    { tree_algorithms::init_header(header); }
 
    //! <b>Requires</b>: header must be the header of a tree, z a node
@@ -303,7 +302,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    template<class AlphaByMaxSize>
- static node_ptr erase(node_ptr header, node_ptr z, std::size_t tree_size, std::size_t &max_tree_size, AlphaByMaxSize alpha_by_maxsize)
+ static node_ptr erase(const node_ptr & header, const node_ptr & z, std::size_t tree_size, std::size_t &max_tree_size, AlphaByMaxSize alpha_by_maxsize)
    {
       //typename tree_algorithms::data_for_rebalance info;
       tree_algorithms::erase(header, z);
@@ -321,13 +320,13 @@
    //! take a node_ptr and shouldn't throw.
    //!
    //! <b>Effects</b>: First empties target tree calling
- //! <tt>void disposer::operator()(node_ptr)</tt> for every node of the tree
+ //! <tt>void disposer::operator()(const node_ptr &)</tt> for every node of the tree
    //! except the header.
    //!
    //! Then, duplicates the entire tree pointed by "source_header" cloning each
- //! source node with <tt>node_ptr Cloner::operator()(node_ptr)</tt> to obtain
+ //! source node with <tt>node_ptr Cloner::operator()(const node_ptr &)</tt> to obtain
    //! the nodes of the target tree. If "cloner" throws, the cloned target nodes
- //! are disposed using <tt>void disposer(node_ptr)</tt>.
+ //! are disposed using <tt>void disposer(const node_ptr &)</tt>.
    //!
    //! <b>Complexity</b>: Linear to the number of element of the source tree plus the.
    //! number of elements of tree target tree when calling this function.
@@ -335,7 +334,7 @@
    //! <b>Throws</b>: If cloner functor throws. If this happens target nodes are disposed.
    template <class Cloner, class Disposer>
    static void clone
- (const_node_ptr source_header, node_ptr target_header, Cloner cloner, Disposer disposer)
+ (const const_node_ptr & source_header, const node_ptr & target_header, Cloner cloner, Disposer disposer)
    {
       tree_algorithms::clone(source_header, target_header, cloner, disposer);
    }
@@ -344,7 +343,7 @@
    //! taking a node_ptr parameter and shouldn't throw.
    //!
    //! <b>Effects</b>: Empties the target tree calling
- //! <tt>void disposer::operator()(node_ptr)</tt> for every node of the tree
+ //! <tt>void disposer::operator()(const node_ptr &)</tt> for every node of the tree
    //! except the header.
    //!
    //! <b>Complexity</b>: Linear to the number of element of the source tree plus the.
@@ -352,7 +351,7 @@
    //!
    //! <b>Throws</b>: If cloner functor throws. If this happens target nodes are disposed.
    template<class Disposer>
- static void clear_and_dispose(node_ptr header, Disposer disposer)
+ static void clear_and_dispose(const node_ptr & header, Disposer disposer)
    { tree_algorithms::clear_and_dispose(header, disposer); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -369,7 +368,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static node_ptr lower_bound
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    { return tree_algorithms::lower_bound(header, key, comp); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -385,7 +384,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static node_ptr upper_bound
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    { return tree_algorithms::upper_bound(header, key, comp); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -401,7 +400,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static node_ptr find
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    { return tree_algorithms::find(header, key, comp); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -419,7 +418,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static std::pair<node_ptr, node_ptr> equal_range
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    { return tree_algorithms::equal_range(header, key, comp); }
 
    //! <b>Requires</b>: "h" must be the header node of a tree.
@@ -436,7 +435,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class NodePtrCompare, class H_Alpha>
    static node_ptr insert_equal_upper_bound
- (node_ptr h, node_ptr new_node, NodePtrCompare comp
+ (const node_ptr & h, const node_ptr & new_node, NodePtrCompare comp
       ,std::size_t tree_size, H_Alpha h_alpha, std::size_t &max_tree_size)
    {
       std::size_t depth;
@@ -459,7 +458,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class NodePtrCompare, class H_Alpha>
    static node_ptr insert_equal_lower_bound
- (node_ptr h, node_ptr new_node, NodePtrCompare comp
+ (const node_ptr & h, const node_ptr & new_node, NodePtrCompare comp
       ,std::size_t tree_size, H_Alpha h_alpha, std::size_t &max_tree_size)
    {
       std::size_t depth;
@@ -484,7 +483,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class NodePtrCompare, class H_Alpha>
    static node_ptr insert_equal
- (node_ptr header, node_ptr hint, node_ptr new_node, NodePtrCompare comp
+ (const node_ptr & header, const node_ptr & hint, const node_ptr & new_node, NodePtrCompare comp
       ,std::size_t tree_size, H_Alpha h_alpha, std::size_t &max_tree_size)
    {
       std::size_t depth;
@@ -529,7 +528,7 @@
    //! if no more objects are inserted or erased from the set.
    template<class KeyType, class KeyNodePtrCompare>
    static std::pair<node_ptr, bool> insert_unique_check
- (const_node_ptr header, const KeyType &key
+ (const const_node_ptr & header, const KeyType &key
       ,KeyNodePtrCompare comp, insert_commit_data &commit_data)
    {
       std::size_t depth;
@@ -556,7 +555,7 @@
    //! tree invariants might be broken.
    template<class H_Alpha>
    static node_ptr insert_before
- (node_ptr header, node_ptr pos, node_ptr new_node
+ (const node_ptr & header, const node_ptr & pos, const node_ptr & new_node
       ,std::size_t tree_size, H_Alpha h_alpha, std::size_t &max_tree_size)
    {
       std::size_t depth;
@@ -579,7 +578,7 @@
    //! tree invariants are broken. This function is slightly faster than
    //! using "insert_before".
    template<class H_Alpha>
- static void push_back(node_ptr header, node_ptr new_node
+ static void push_back(const node_ptr & header, const node_ptr & new_node
          ,std::size_t tree_size, H_Alpha h_alpha, std::size_t &max_tree_size)
    {
       std::size_t depth;
@@ -601,7 +600,7 @@
    //! tree invariants are broken. This function is slightly faster than
    //! using "insert_before".
    template<class H_Alpha>
- static void push_front(node_ptr header, node_ptr new_node
+ static void push_front(const node_ptr & header, const node_ptr & new_node
          ,std::size_t tree_size, H_Alpha h_alpha, std::size_t &max_tree_size)
    {
       std::size_t depth;
@@ -650,7 +649,7 @@
    //! if no more objects are inserted or erased from the set.
    template<class KeyType, class KeyNodePtrCompare>
    static std::pair<node_ptr, bool> insert_unique_check
- (const_node_ptr header, node_ptr hint, const KeyType &key
+ (const const_node_ptr & header, const node_ptr &hint, const KeyType &key
       ,KeyNodePtrCompare comp, insert_commit_data &commit_data)
    {
       std::size_t depth;
@@ -680,7 +679,7 @@
    //! erased between the "insert_check" and "insert_commit" calls.
    template<class H_Alpha>
    static void insert_unique_commit
- (node_ptr header, node_ptr new_value, const insert_commit_data &commit_data
+ (const node_ptr & header, const node_ptr & new_value, const insert_commit_data &commit_data
       ,std::size_t tree_size, H_Alpha h_alpha, std::size_t &max_tree_size)
    {
       tree_algorithms::insert_unique_commit(header, new_value, commit_data);
@@ -694,7 +693,7 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Complexity</b>: Linear.
- static void rebalance(node_ptr header)
+ static void rebalance(const node_ptr & header)
    { tree_algorithms::rebalance(header); }
 
    //! <b>Requires</b>: old_root is a node of a tree.
@@ -706,7 +705,7 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Complexity</b>: Linear.
- static node_ptr rebalance_subtree(node_ptr old_root)
+ static node_ptr rebalance_subtree(const node_ptr & old_root)
    { return tree_algorithms::rebalance_subtree(old_root); }
 
    //! <b>Requires</b>: "n" must be a node inserted in a tree.
@@ -716,7 +715,7 @@
    //! <b>Complexity</b>: Logarithmic.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr get_header(node_ptr n)
+ static node_ptr get_header(const node_ptr & n)
    { return tree_algorithms::get_header(n); }
 
    /// @cond
@@ -729,12 +728,12 @@
    //! <b>Complexity</b>: Constant.
    //!
    //! <b>Throws</b>: Nothing.
- static bool is_header(const_node_ptr p)
+ static bool is_header(const const_node_ptr & p)
    { return tree_algorithms::is_header(p); }
 
    template<class H_Alpha>
    static void rebalance_after_insertion
- ( node_ptr x, std::size_t depth
+ (const node_ptr &x, std::size_t depth
       , std::size_t tree_size, H_Alpha h_alpha, std::size_t &max_tree_size)
    {
       if(tree_size > max_tree_size)

Modified: branches/release/boost/intrusive/slist.hpp
==============================================================================
--- branches/release/boost/intrusive/slist.hpp (original)
+++ branches/release/boost/intrusive/slist.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -21,7 +21,7 @@
 #include <boost/intrusive/slist_hook.hpp>
 #include <boost/intrusive/circular_slist_algorithms.hpp>
 #include <boost/intrusive/linear_slist_algorithms.hpp>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/detail/clear_on_destructor_base.hpp>
 #include <boost/intrusive/link_mode.hpp>
 #include <boost/intrusive/options.hpp>
@@ -121,10 +121,10 @@
    /// @endcond
    typedef typename real_value_traits::pointer pointer;
    typedef typename real_value_traits::const_pointer const_pointer;
- typedef typename std::iterator_traits<pointer>::value_type value_type;
- typedef typename std::iterator_traits<pointer>::reference reference;
- typedef typename std::iterator_traits<const_pointer>::reference const_reference;
- typedef typename std::iterator_traits<pointer>::difference_type difference_type;
+ typedef typename pointer_traits<pointer>::element_type value_type;
+ typedef typename pointer_traits<pointer>::reference reference;
+ typedef typename pointer_traits<const_pointer>::reference const_reference;
+ typedef typename pointer_traits<pointer>::difference_type difference_type;
    typedef typename Config::size_type size_type;
    typedef slist_iterator<slist_impl, false> iterator;
    typedef slist_iterator<slist_impl, true> const_iterator;
@@ -163,18 +163,18 @@
    BOOST_STATIC_ASSERT(!(cache_last && ((int)real_value_traits::link_mode == (int)auto_unlink)));
 
    node_ptr get_end_node()
- { return node_ptr(linear ? node_ptr(0) : this->get_root_node()); }
+ { return node_ptr(linear ? node_ptr() : this->get_root_node()); }
 
    const_node_ptr get_end_node() const
    {
       return const_node_ptr
- (linear ? const_node_ptr(0) : this->get_root_node()); }
+ (linear ? const_node_ptr() : this->get_root_node()); }
 
    node_ptr get_root_node()
- { return node_ptr(&data_.root_plus_size_.root_); }
+ { return pointer_traits<node_ptr>::pointer_to(data_.root_plus_size_.root_); }
 
    const_node_ptr get_root_node() const
- { return const_node_ptr(&data_.root_plus_size_.root_); }
+ { return pointer_traits<const_node_ptr>::pointer_to(data_.root_plus_size_.root_); }
 
    node_ptr get_last_node()
    { return this->get_last_node(detail::bool_<cache_last>()); }
@@ -182,13 +182,13 @@
    const_node_ptr get_last_node() const
    { return this->get_last_node(detail::bool_<cache_last>()); }
 
- void set_last_node(node_ptr n)
+ void set_last_node(const node_ptr &n)
    { return this->set_last_node(n, detail::bool_<cache_last>()); }
 
    static node_ptr get_last_node(detail::bool_<false>)
- { return node_ptr(0); }
+ { return node_ptr(); }
 
- static void set_last_node(node_ptr, detail::bool_<false>)
+ static void set_last_node(const node_ptr &, detail::bool_<false>)
    {}
 
    node_ptr get_last_node(detail::bool_<true>)
@@ -197,12 +197,11 @@
    const_node_ptr get_last_node(detail::bool_<true>) const
    { return const_node_ptr(data_.root_plus_size_.last_); }
 
- void set_last_node(node_ptr n, detail::bool_<true>)
+ void set_last_node(const node_ptr & n, detail::bool_<true>)
    { data_.root_plus_size_.last_ = n; }
 
- static node_ptr uncast(const_node_ptr ptr)
- { return node_ptr(const_cast<node*>(detail::boost_intrusive_get_pointer(ptr))); }
-//iG pending { return boost::const_pointer_cast<node>(ptr); }
+ static node_ptr uncast(const const_node_ptr & ptr)
+ { return pointer_traits<node_ptr>::const_cast_from(ptr); }
 
    void set_default_constructed_state()
    {
@@ -406,7 +405,7 @@
    //! This function is only available is cache_last<> is true.
    void push_back(reference value)
    {
- BOOST_STATIC_ASSERT((cache_last != 0));
+ BOOST_STATIC_ASSERT((cache_last));
       this->insert_after(const_iterator(this->get_last_node(), this), value);
    }
 
@@ -473,7 +472,7 @@
    //! This function is only available is cache_last<> is true.
    reference back()
    {
- BOOST_STATIC_ASSERT((cache_last != 0));
+ BOOST_STATIC_ASSERT((cache_last));
       return *this->get_real_value_traits().to_value_ptr(this->get_last_node());
    }
 
@@ -487,7 +486,7 @@
    //! This function is only available is cache_last<> is true.
    const_reference back() const
    {
- BOOST_STATIC_ASSERT((cache_last != 0));
+ BOOST_STATIC_ASSERT((cache_last));
       return *this->get_real_value_traits().to_value_ptr(this->get_last_node());
    }
 
@@ -835,7 +834,7 @@
          node_ptr bfp = before_first.pointed_node();
          node_ptr lp = last.pointed_node();
          if(cache_last){
- if((lp == this->get_end_node())){
+ if(lp == this->get_end_node()){
                this->set_last_node(bfp);
             }
          }
@@ -1110,7 +1109,8 @@
       this->insert_after(this->cbefore_begin(), b, e, disposer);
    }
 
- //! <b>Requires</b>: prev is an iterator to an element or x.end()/x.before_begin() in x.
+ //! <b>Requires</b>: prev must point to an element contained by this list or
+ //! to the before_begin() element
    //!
    //! <b>Effects</b>: Transfers all the elements of list x to this list, after the
    //! the element pointed by prev. No destructors or copy constructors are called.
@@ -1226,7 +1226,7 @@
       }
    }
 
- //! <b>Requires</b>: it is an iterator to an element in x.
+ //! <b>Requires</b>: it is an iterator to an element in *this.
    //!
    //! <b>Effects</b>: Transfers all the elements of list x to this list, before the
    //! the element pointed by it. No destructors or copy constructors are called.
@@ -1743,7 +1743,7 @@
    //!
    //! <b>Note</b>: Iterators of values obtained from list x now point to elements of this
    //! list. Iterators of this list and all the references are not invalidated.
- void incorporate_after(const_iterator prev_from, node_ptr first, node_ptr before_last)
+ void incorporate_after(const_iterator prev_from, const node_ptr & first, const node_ptr & before_last)
    {
       if(constant_time_size)
          this->incorporate_after(prev_from, first, before_last, std::distance(first, before_last)+1);
@@ -1766,7 +1766,7 @@
    //!
    //! <b>Note</b>: Iterators of values obtained from list x now point to elements of this
    //! list. Iterators of this list and all the references are not invalidated.
- void incorporate_after(const_iterator prev_pos, node_ptr first, node_ptr before_last, difference_type n)
+ void incorporate_after(const_iterator prev_pos, const node_ptr & first, const node_ptr & before_last, difference_type n)
    {
       if(n){
          BOOST_INTRUSIVE_INVARIANT_ASSERT(std::distance(iterator(first, this), iterator(before_last, this))+1 == n);
@@ -1778,7 +1778,7 @@
    }
 
    private:
- void priv_splice_after(node_ptr prev_pos_n, slist_impl &x, node_ptr before_first_n, node_ptr before_last_n)
+ void priv_splice_after(const node_ptr & prev_pos_n, slist_impl &x, const node_ptr & before_first_n, const node_ptr & before_last_n)
    {
       if (before_first_n != before_last_n && prev_pos_n != before_first_n && prev_pos_n != before_last_n)
       {
@@ -1794,7 +1794,7 @@
       }
    }
 
- void priv_incorporate_after(node_ptr prev_pos_n, node_ptr first_n, node_ptr before_last_n)
+ void priv_incorporate_after(const node_ptr & prev_pos_n, const node_ptr & first_n, const node_ptr & before_last_n)
    {
       if(cache_last){
          if(node_traits::get_next(prev_pos_n) == this->get_end_node()){
@@ -1894,11 +1894,11 @@
    }
 
    //circular version
- static void priv_swap_lists(node_ptr this_node, node_ptr other_node, detail::bool_<false>)
+ static void priv_swap_lists(const node_ptr & this_node, const node_ptr & other_node, detail::bool_<false>)
    { node_algorithms::swap_nodes(this_node, other_node); }
 
    //linear version
- static void priv_swap_lists(node_ptr this_node, node_ptr other_node, detail::bool_<true>)
+ static void priv_swap_lists(const node_ptr & this_node, const node_ptr & other_node, detail::bool_<true>)
    { node_algorithms::swap_trailing_nodes(this_node, other_node); }
 
    static slist_impl &priv_container_from_end_iterator(const const_iterator &end_iterator)
@@ -1907,7 +1907,7 @@
       //singly linked lists (because "end" is represented by the null pointer)
       BOOST_STATIC_ASSERT(!linear);
       root_plus_size *r = detail::parent_from_member<root_plus_size, node>
- ( detail::boost_intrusive_get_pointer(end_iterator.pointed_node()), (&root_plus_size::root_));
+ ( boost::intrusive::detail::to_raw_pointer(end_iterator.pointed_node()), (&root_plus_size::root_));
       data_t *d = detail::parent_from_member<data_t, root_plus_size>
          ( r, &data_t::root_plus_size_);
       slist_impl *s = detail::parent_from_member<slist_impl, data_t>(d, &slist_impl::data_);

Modified: branches/release/boost/intrusive/splaytree.hpp
==============================================================================
--- branches/release/boost/intrusive/splaytree.hpp (original)
+++ branches/release/boost/intrusive/splaytree.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -21,12 +21,14 @@
 #include <boost/intrusive/detail/assert.hpp>
 #include <boost/static_assert.hpp>
 #include <boost/intrusive/intrusive_fwd.hpp>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/splay_set_hook.hpp>
 #include <boost/intrusive/detail/tree_node.hpp>
 #include <boost/intrusive/detail/ebo_functor_holder.hpp>
 #include <boost/intrusive/detail/clear_on_destructor_base.hpp>
 #include <boost/intrusive/detail/mpl.hpp>
+#include <boost/intrusive/detail/utilities.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/options.hpp>
 #include <boost/intrusive/splaytree_algorithms.hpp>
 #include <boost/intrusive/link_mode.hpp>
@@ -95,24 +97,26 @@
    /// @endcond
    typedef typename real_value_traits::pointer pointer;
    typedef typename real_value_traits::const_pointer const_pointer;
- typedef typename std::iterator_traits<pointer>::value_type value_type;
- typedef value_type key_type;
- typedef typename std::iterator_traits<pointer>::reference reference;
- typedef typename std::iterator_traits<const_pointer>::reference const_reference;
- typedef typename std::iterator_traits<pointer>::difference_type difference_type;
+ typedef typename pointer_traits<pointer>::element_type value_type;
+ typedef typename pointer_traits<pointer>::reference reference;
+ typedef typename pointer_traits<const_pointer>::reference const_reference;
+ typedef typename pointer_traits<pointer>::difference_type difference_type;
    typedef typename Config::size_type size_type;
+ typedef value_type key_type;
    typedef typename Config::compare value_compare;
    typedef value_compare key_compare;
    typedef tree_iterator<splaytree_impl, false> iterator;
    typedef tree_iterator<splaytree_impl, true> const_iterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef boost::intrusive::detail::reverse_iterator<iterator> reverse_iterator;
+ typedef boost::intrusive::detail::reverse_iterator<const_iterator>const_reverse_iterator;
    typedef typename real_value_traits::node_traits node_traits;
    typedef typename node_traits::node node;
- typedef typename boost::pointer_to_other
- <pointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <node_ptr, const node>::type const_node_ptr;
+ typedef typename pointer_traits
+ <pointer>::template rebind_pointer
+ <node>::type node_ptr;
+ typedef typename pointer_traits
+ <pointer>::template rebind_pointer
+ <const node>::type const_node_ptr;
    typedef splaytree_algorithms<node_traits> node_algorithms;
 
    static const bool constant_time_size = Config::constant_time_size;
@@ -164,16 +168,14 @@
    value_traits &priv_value_traits()
    { return data_; }
 
- const node &priv_header() const
- { return data_.node_plus_pred_.header_plus_size_.header_; }
+ node_ptr priv_header_ptr()
+ { return pointer_traits<node_ptr>::pointer_to(data_.node_plus_pred_.header_plus_size_.header_); }
 
- node &priv_header()
- { return data_.node_plus_pred_.header_plus_size_.header_; }
+ const_node_ptr priv_header_ptr() const
+ { return pointer_traits<const_node_ptr>::pointer_to(data_.node_plus_pred_.header_plus_size_.header_); }
 
- static node_ptr uncast(const_node_ptr ptr)
- {
- return node_ptr(const_cast<node*>(detail::boost_intrusive_get_pointer(ptr)));
- }
+ static node_ptr uncast(const const_node_ptr & ptr)
+ { return pointer_traits<node_ptr>::const_cast_from(ptr); }
 
    size_traits &priv_size_traits()
    { return data_.node_plus_pred_.header_plus_size_; }
@@ -216,7 +218,7 @@
                  , const value_traits &v_traits = value_traits())
       : data_(cmp, v_traits)
    {
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
       this->priv_size_traits().set_size(size_type(0));
    }
 
@@ -238,7 +240,7 @@
                   , const value_traits &v_traits = value_traits())
       : data_(cmp, v_traits)
    {
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
       this->priv_size_traits().set_size(size_type(0));
       if(unique)
          this->insert_unique(b, e);
@@ -251,7 +253,7 @@
    splaytree_impl(BOOST_RV_REF(splaytree_impl) x)
       : data_(::boost::move(x.priv_comp()), ::boost::move(x.priv_value_traits()))
    {
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
       this->priv_size_traits().set_size(size_type(0));
       this->swap(x);
    }
@@ -278,7 +280,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    iterator begin()
- { return iterator(node_algorithms::begin_node(&priv_header()), this); }
+ { return iterator(node_algorithms::begin_node(this->priv_header_ptr()), this); }
 
    //! <b>Effects</b>: Returns a const_iterator pointing to the beginning of the tree.
    //!
@@ -294,7 +296,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    const_iterator cbegin() const
- { return const_iterator(node_algorithms::begin_node(&priv_header()), this); }
+ { return const_iterator(node_algorithms::begin_node(this->priv_header_ptr()), this); }
 
    //! <b>Effects</b>: Returns an iterator pointing to the end of the tree.
    //!
@@ -302,7 +304,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    iterator end()
- { return iterator (node_ptr(&priv_header()), this); }
+ { return iterator (this->priv_header_ptr(), this); }
 
    //! <b>Effects</b>: Returns a const_iterator pointing to the end of the tree.
    //!
@@ -318,7 +320,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    const_iterator cend() const
- { return const_iterator (uncast(const_node_ptr(&priv_header())), this); }
+ { return const_iterator (uncast(this->priv_header_ptr()), this); }
 
    //! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning of the
    //! reversed tree.
@@ -446,7 +448,7 @@
          return this->priv_size_traits().get_size();
       }
       else{
- return (size_type)node_algorithms::size(const_node_ptr(&priv_header()));
+ return (size_type)node_algorithms::size(this->priv_header_ptr());
       }
    }
 
@@ -461,7 +463,7 @@
       using std::swap;
       swap(priv_comp(), priv_comp());
       //These can't throw
- node_algorithms::swap_tree(node_ptr(&priv_header()), node_ptr(&other.priv_header()));
+ node_algorithms::swap_tree(this->priv_header_ptr(), other.priv_header_ptr());
       if(constant_time_size){
          size_type backup = this->priv_size_traits().get_size();
          this->priv_size_traits().set_size(other.priv_size_traits().get_size());
@@ -488,7 +490,7 @@
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       iterator ret (node_algorithms::insert_equal_lower_bound
- (node_ptr(&priv_header()), to_insert, key_node_comp), this);
+ (this->priv_header_ptr(), to_insert, key_node_comp), this);
       this->priv_size_traits().increment();
       return ret;
    }
@@ -515,7 +517,7 @@
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       iterator ret(node_algorithms::insert_equal
- (node_ptr(&priv_header()), hint.pointed_node(), to_insert, key_node_comp), this);
+ (this->priv_header_ptr(), hint.pointed_node(), to_insert, key_node_comp), this);
       this->priv_size_traits().increment();
       return ret;
    }
@@ -645,7 +647,7 @@
          comp(key_value_comp, this);
       std::pair<node_ptr, bool> ret =
          (node_algorithms::insert_unique_check
- (node_ptr(&priv_header()), key, comp, commit_data));
+ (this->priv_header_ptr(), key, comp, commit_data));
       return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
    }
 
@@ -690,7 +692,7 @@
          comp(key_value_comp, this);
       std::pair<node_ptr, bool> ret =
          node_algorithms::insert_unique_check
- (node_ptr(&priv_header()), hint.pointed_node(), key, comp, commit_data);
+ (this->priv_header_ptr(), hint.pointed_node(), key, comp, commit_data);
       return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
    }
 
@@ -717,7 +719,7 @@
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       node_algorithms::insert_unique_commit
- (node_ptr(&priv_header()), to_insert, commit_data);
+ (this->priv_header_ptr(), to_insert, commit_data);
       this->priv_size_traits().increment();
       return iterator(to_insert, this);
    }
@@ -737,7 +739,7 @@
       node_ptr to_erase(i.pointed_node());
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!node_algorithms::unique(to_erase));
- node_algorithms::erase(&priv_header(), to_erase);
+ node_algorithms::erase(this->priv_header_ptr(), to_erase);
       this->priv_size_traits().decrement();
       if(safemode_or_autounlink)
          node_algorithms::init(to_erase);
@@ -899,7 +901,7 @@
          this->clear_and_dispose(detail::null_disposer());
       }
       else{
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
          this->priv_size_traits().set_size(0);
       }
    }
@@ -916,7 +918,7 @@
    template<class Disposer>
    void clear_and_dispose(Disposer disposer)
    {
- node_algorithms::clear_and_dispose(node_ptr(&priv_header())
+ node_algorithms::clear_and_dispose(this->priv_header_ptr()
          , detail::node_disposer<Disposer, splaytree_impl>(disposer, this));
       this->priv_size_traits().set_size(0);
    }
@@ -995,7 +997,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, splaytree_impl>
          key_node_comp(comp, this);
       return iterator(node_algorithms::lower_bound
- (const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Returns a const iterator to the first element whose
@@ -1010,7 +1012,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, splaytree_impl>
          key_node_comp(comp, this);
       return const_iterator(node_algorithms::lower_bound
- (const_node_ptr(&priv_header()), key, key_node_comp, false), this);
+ (this->priv_header_ptr(), key, key_node_comp, false), this);
    }
 
    //! <b>Effects</b>: Returns an iterator to the first element whose
@@ -1035,7 +1037,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, splaytree_impl>
          key_node_comp(comp, this);
       return iterator(node_algorithms::upper_bound
- (const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Returns an iterator to the first element whose
@@ -1060,7 +1062,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, splaytree_impl>
          key_node_comp(comp, this);
       return const_iterator(node_algorithms::upper_bound_dont_splay
- (const_node_ptr(&priv_header()), key, key_node_comp, false), this);
+ (this->priv_header_ptr(), key, key_node_comp, false), this);
    }
 
    //! <b>Effects</b>: Finds an iterator to the first element whose key is
@@ -1084,7 +1086,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, splaytree_impl>
          key_node_comp(comp, this);
       return iterator
- (node_algorithms::find(const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (node_algorithms::find(this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Finds a const_iterator to the first element whose key is
@@ -1108,7 +1110,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, splaytree_impl>
          key_node_comp(comp, this);
       return const_iterator
- (node_algorithms::find(const_node_ptr(&priv_header()), key, key_node_comp, false), this);
+ (node_algorithms::find(this->priv_header_ptr(), key, key_node_comp, false), this);
    }
 
    //! <b>Effects</b>: Finds a range containing all elements whose key is k or
@@ -1134,7 +1136,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, splaytree_impl>
          key_node_comp(comp, this);
       std::pair<node_ptr, node_ptr> ret
- (node_algorithms::equal_range(const_node_ptr(&priv_header()), key, key_node_comp));
+ (node_algorithms::equal_range(this->priv_header_ptr(), key, key_node_comp));
       return std::pair<iterator, iterator>(iterator(ret.first, this), iterator(ret.second, this));
    }
 
@@ -1163,7 +1165,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, splaytree_impl>
          key_node_comp(comp, this);
       std::pair<node_ptr, node_ptr> ret
- (node_algorithms::equal_range(const_node_ptr(&priv_header()), key, key_node_comp, false));
+ (node_algorithms::equal_range(this->priv_header_ptr(), key, key_node_comp, false));
       return std::pair<const_iterator, const_iterator>(const_iterator(ret.first, this), const_iterator(ret.second, this));
    }
 
@@ -1189,8 +1191,8 @@
          detail::exception_disposer<splaytree_impl, Disposer>
             rollback(*this, disposer);
          node_algorithms::clone
- (const_node_ptr(&src.priv_header())
- ,node_ptr(&this->priv_header())
+ (src.priv_header_ptr()
+ ,this->priv_header_ptr()
             ,detail::node_cloner<Cloner, splaytree_impl>(cloner, this)
             ,detail::node_disposer<Disposer, splaytree_impl>(disposer, this));
          this->priv_size_traits().set_size(src.priv_size_traits().get_size());
@@ -1212,7 +1214,7 @@
    pointer unlink_leftmost_without_rebalance()
    {
       node_ptr to_be_disposed(node_algorithms::unlink_leftmost_without_rebalance
- (node_ptr(&priv_header())));
+ (this->priv_header_ptr()));
       if(!to_be_disposed)
          return 0;
       this->priv_size_traits().decrement();
@@ -1230,7 +1232,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    void splay_up(iterator i)
- { return node_algorithms::splay_up(i.pointed_node(), &priv_header()); }
+ { return node_algorithms::splay_up(i.pointed_node(), this->priv_header_ptr()); }
 
    //! <b>Effects</b>: Rearranges the splay set so that if *this stores an element
    //! with a key equivalent to value the element is placed as the root of the
@@ -1247,7 +1249,7 @@
    {
       detail::key_nodeptr_comp<KeyValueCompare, splaytree_impl>
          key_node_comp(comp, this);
- node_ptr r = node_algorithms::splay_down(&priv_header(), key, key_node_comp);
+ node_ptr r = node_algorithms::splay_down(this->priv_header_ptr(), key, key_node_comp);
       return iterator(r, this);
    }
 
@@ -1280,7 +1282,7 @@
    void replace_node(iterator replace_this, reference with_this)
    {
       node_algorithms::replace_node( get_real_value_traits().to_node_ptr(*replace_this)
- , node_ptr(&priv_header())
+ , this->priv_header_ptr()
                                    , get_real_value_traits().to_node_ptr(with_this));
       if(safemode_or_autounlink)
          node_algorithms::init(replace_this.pointed_node());
@@ -1366,7 +1368,7 @@
    //!
    //! <b>Complexity</b>: Linear.
    void rebalance()
- { node_algorithms::rebalance(node_ptr(&priv_header())); }
+ { node_algorithms::rebalance(this->priv_header_ptr()); }
 
    //! <b>Requires</b>: old_root is a node of a tree.
    //!
@@ -1430,7 +1432,7 @@
    static splaytree_impl &priv_container_from_end_iterator(const const_iterator &end_iterator)
    {
       header_plus_size *r = detail::parent_from_member<header_plus_size, node>
- ( detail::boost_intrusive_get_pointer(end_iterator.pointed_node()), &header_plus_size::header_);
+ ( boost::intrusive::detail::to_raw_pointer(end_iterator.pointed_node()), &header_plus_size::header_);
       node_plus_pred_t *n = detail::parent_from_member
          <node_plus_pred_t, header_plus_size>(r, &node_plus_pred_t::header_plus_size_);
       data_t *d = detail::parent_from_member<data_t, node_plus_pred_t>(n, &data_t::node_plus_pred_);

Modified: branches/release/boost/intrusive/splaytree_algorithms.hpp
==============================================================================
--- branches/release/boost/intrusive/splaytree_algorithms.hpp (original)
+++ branches/release/boost/intrusive/splaytree_algorithms.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -49,6 +49,7 @@
 #include <boost/intrusive/detail/config_begin.hpp>
 #include <boost/intrusive/detail/assert.hpp>
 #include <boost/intrusive/intrusive_fwd.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <cstddef>
 #include <boost/intrusive/detail/utilities.hpp>
 #include <boost/intrusive/detail/tree_algorithms.hpp>
@@ -63,8 +64,8 @@
 struct splaydown_rollback
 {
    typedef typename NodeTraits::node_ptr node_ptr;
- splaydown_rollback( const node_ptr *pcur_subtree, node_ptr header
- , node_ptr leftmost , node_ptr rightmost)
+ splaydown_rollback( const node_ptr *pcur_subtree, const node_ptr & header
+ , const node_ptr & leftmost , const node_ptr & rightmost)
       : pcur_subtree_(pcur_subtree) , header_(header)
       , leftmost_(leftmost) , rightmost_(rightmost)
    {}
@@ -145,17 +146,15 @@
 
    /// @cond
    private:
- static node_ptr uncast(const_node_ptr ptr)
- {
- return node_ptr(const_cast<node*>(::boost::intrusive::detail::boost_intrusive_get_pointer(ptr)));
- }
+ static node_ptr uncast(const const_node_ptr & ptr)
+ { return pointer_traits<node_ptr>::const_cast_from(ptr); }
    /// @endcond
 
    public:
- static node_ptr begin_node(const_node_ptr header)
+ static node_ptr begin_node(const const_node_ptr & header)
    { return tree_algorithms::begin_node(header); }
 
- static node_ptr end_node(const_node_ptr header)
+ static node_ptr end_node(const const_node_ptr & header)
    { return tree_algorithms::end_node(header); }
 
    //! <b>Requires</b>: node is a node of the tree or an node initialized
@@ -166,10 +165,10 @@
    //! <b>Complexity</b>: Constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static bool unique(const_node_ptr node)
+ static bool unique(const const_node_ptr & node)
    { return tree_algorithms::unique(node); }
 
- static void unlink(node_ptr node)
+ static void unlink(const node_ptr & node)
    { tree_algorithms::unlink(node); }
 
    //! <b>Requires</b>: node1 and node2 can't be header nodes
@@ -187,7 +186,7 @@
    //! node1 and node2 are not equivalent according to the ordering rules.
    //!
    //!Experimental function
- static void swap_nodes(node_ptr node1, node_ptr node2)
+ static void swap_nodes(const node_ptr & node1, const node_ptr & node2)
    {
       if(node1 == node2)
          return;
@@ -211,7 +210,7 @@
    //! node1 and node2 are not equivalent according to the ordering rules.
    //!
    //!Experimental function
- static void swap_nodes(node_ptr node1, node_ptr header1, node_ptr node2, node_ptr header2)
+ static void swap_nodes(const node_ptr & node1, const node_ptr & header1, const node_ptr & node2, const node_ptr & header2)
    { tree_algorithms::swap_nodes(node1, header1, node2, header2); }
 
    //! <b>Requires</b>: node_to_be_replaced must be inserted in a tree
@@ -230,7 +229,7 @@
    //! the node, since no rebalancing and comparison is needed.
    //!
    //!Experimental function
- static void replace_node(node_ptr node_to_be_replaced, node_ptr new_node)
+ static void replace_node(const node_ptr & node_to_be_replaced, const node_ptr & new_node)
    {
       if(node_to_be_replaced == new_node)
          return;
@@ -253,7 +252,7 @@
    //! the node, since no rebalancing or comparison is needed.
    //!
    //!Experimental function
- static void replace_node(node_ptr node_to_be_replaced, node_ptr header, node_ptr new_node)
+ static void replace_node(const node_ptr & node_to_be_replaced, const node_ptr & header, const node_ptr & new_node)
    { tree_algorithms::replace_node(node_to_be_replaced, header, new_node); }
 
    //! <b>Requires</b>: p is a node from the tree except the header.
@@ -263,7 +262,7 @@
    //! <b>Complexity</b>: Average constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr next_node(node_ptr p)
+ static node_ptr next_node(const node_ptr & p)
    { return tree_algorithms::next_node(p); }
 
    //! <b>Requires</b>: p is a node from the tree except the leftmost node.
@@ -273,7 +272,7 @@
    //! <b>Complexity</b>: Average constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr prev_node(node_ptr p)
+ static node_ptr prev_node(const node_ptr & p)
    { return tree_algorithms::prev_node(p); }
 
    //! <b>Requires</b>: node must not be part of any tree.
@@ -285,7 +284,7 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Nodes</b>: If node is inserted in a tree, this function corrupts the tree.
- static void init(node_ptr node)
+ static void init(const node_ptr & node)
    { tree_algorithms::init(node); }
 
    //! <b>Requires</b>: node must not be part of any tree.
@@ -298,14 +297,14 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Nodes</b>: If node is inserted in a tree, this function corrupts the tree.
- static void init_header(node_ptr header)
+ static void init_header(const node_ptr & header)
    { tree_algorithms::init_header(header); }
 
    //! <b>Requires</b>: "disposer" must be an object function
    //! taking a node_ptr parameter and shouldn't throw.
    //!
    //! <b>Effects</b>: Empties the target tree calling
- //! <tt>void disposer::operator()(node_ptr)</tt> for every node of the tree
+ //! <tt>void disposer::operator()(const node_ptr &)</tt> for every node of the tree
    //! except the header.
    //!
    //! <b>Complexity</b>: Linear to the number of element of the source tree plus the.
@@ -313,7 +312,7 @@
    //!
    //! <b>Throws</b>: If cloner functor throws. If this happens target nodes are disposed.
    template<class Disposer>
- static void clear_and_dispose(node_ptr header, Disposer disposer)
+ static void clear_and_dispose(const node_ptr & header, Disposer disposer)
    { tree_algorithms::clear_and_dispose(header, disposer); }
 
    //! <b>Requires</b>: node is a node of the tree but it's not the header.
@@ -323,7 +322,7 @@
    //! <b>Complexity</b>: Linear time.
    //!
    //! <b>Throws</b>: Nothing.
- static std::size_t count(const_node_ptr node)
+ static std::size_t count(const const_node_ptr & node)
    { return tree_algorithms::count(node); }
 
    //! <b>Requires</b>: header is the header node of the tree.
@@ -333,7 +332,7 @@
    //! <b>Complexity</b>: Linear time.
    //!
    //! <b>Throws</b>: Nothing.
- static std::size_t size(const_node_ptr header)
+ static std::size_t size(const const_node_ptr & header)
    { return tree_algorithms::size(header); }
 
    //! <b>Requires</b>: header1 and header2 must be the header nodes
@@ -345,7 +344,7 @@
    //! <b>Complexity</b>: Constant.
    //!
    //! <b>Throws</b>: Nothing.
- static void swap_tree(node_ptr header1, node_ptr header2)
+ static void swap_tree(const node_ptr & header1, const node_ptr & header2)
    { return tree_algorithms::swap_tree(header1, header2); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -366,7 +365,7 @@
    //! previously executed to fill "commit_data". No value should be inserted or
    //! erased between the "insert_check" and "insert_commit" calls.
    static void insert_unique_commit
- (node_ptr header, node_ptr new_value, const insert_commit_data &commit_data)
+ (const node_ptr & header, const node_ptr & new_value, const insert_commit_data &commit_data)
    { tree_algorithms::insert_unique_commit(header, new_value, commit_data); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -405,7 +404,7 @@
    //! if no more objects are inserted or erased from the set.
    template<class KeyType, class KeyNodePtrCompare>
    static std::pair<node_ptr, bool> insert_unique_check
- (node_ptr header, const KeyType &key
+ (const node_ptr & header, const KeyType &key
       ,KeyNodePtrCompare comp, insert_commit_data &commit_data)
    {
       splay_down(header, key, comp);
@@ -414,14 +413,14 @@
 
    template<class KeyType, class KeyNodePtrCompare>
    static std::pair<node_ptr, bool> insert_unique_check
- (node_ptr header, node_ptr hint, const KeyType &key
+ (const node_ptr & header, const node_ptr &hint, const KeyType &key
       ,KeyNodePtrCompare comp, insert_commit_data &commit_data)
    {
       splay_down(header, key, comp);
       return tree_algorithms::insert_unique_check(header, hint, key, comp, commit_data);
    }
 
- static bool is_header(const_node_ptr p)
+ static bool is_header(const const_node_ptr & p)
    { return tree_algorithms::is_header(p); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -437,7 +436,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static node_ptr find
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp, bool splay = true)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp, bool splay = true)
    {
       if(splay)
          splay_down(uncast(header), key, comp);
@@ -462,7 +461,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static std::pair<node_ptr, node_ptr> equal_range
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp, bool splay = true)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp, bool splay = true)
    {
       //if(splay)
          //splay_down(uncast(header), key, comp);
@@ -488,7 +487,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static node_ptr lower_bound
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp, bool splay = true)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp, bool splay = true)
    {
       //if(splay)
          //splay_down(uncast(header), key, comp);
@@ -511,7 +510,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static node_ptr upper_bound
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp, bool splay = true)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp, bool splay = true)
    {
       //if(splay)
          //splay_down(uncast(header), key, comp);
@@ -537,7 +536,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class NodePtrCompare>
    static node_ptr insert_equal
- (node_ptr header, node_ptr hint, node_ptr new_node, NodePtrCompare comp)
+ (const node_ptr & header, const node_ptr & hint, const node_ptr & new_node, NodePtrCompare comp)
    {
       splay_down(header, new_node, comp);
       return tree_algorithms::insert_equal(header, hint, new_node, comp);
@@ -559,7 +558,7 @@
    //! <b>Note</b>: If "pos" is not the successor of the newly inserted "new_node"
    //! tree invariants might be broken.
    static node_ptr insert_before
- (node_ptr header, node_ptr pos, node_ptr new_node)
+ (const node_ptr & header, const node_ptr & pos, const node_ptr & new_node)
    {
       tree_algorithms::insert_before(header, pos, new_node);
       splay_up(new_node, header);
@@ -579,7 +578,7 @@
    //! <b>Note</b>: If "new_node" is less than the greatest inserted key
    //! tree invariants are broken. This function is slightly faster than
    //! using "insert_before".
- static void push_back(node_ptr header, node_ptr new_node)
+ static void push_back(const node_ptr & header, const node_ptr & new_node)
    {
       tree_algorithms::push_back(header, new_node);
       splay_up(new_node, header);
@@ -598,7 +597,7 @@
    //! <b>Note</b>: If "new_node" is greater than the lowest inserted key
    //! tree invariants are broken. This function is slightly faster than
    //! using "insert_before".
- static void push_front(node_ptr header, node_ptr new_node)
+ static void push_front(const node_ptr & header, const node_ptr & new_node)
    {
       tree_algorithms::push_front(header, new_node);
       splay_up(new_node, header);
@@ -618,7 +617,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class NodePtrCompare>
    static node_ptr insert_equal_upper_bound
- (node_ptr header, node_ptr new_node, NodePtrCompare comp)
+ (const node_ptr & header, const node_ptr & new_node, NodePtrCompare comp)
    {
       splay_down(header, new_node, comp);
       return tree_algorithms::insert_equal_upper_bound(header, new_node, comp);
@@ -638,7 +637,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class NodePtrCompare>
    static node_ptr insert_equal_lower_bound
- (node_ptr header, node_ptr new_node, NodePtrCompare comp)
+ (const node_ptr & header, const node_ptr & new_node, NodePtrCompare comp)
    {
       splay_down(header, new_node, comp);
       return tree_algorithms::insert_equal_lower_bound(header, new_node, comp);
@@ -649,13 +648,13 @@
    //! take a node_ptr and shouldn't throw.
    //!
    //! <b>Effects</b>: First empties target tree calling
- //! <tt>void disposer::operator()(node_ptr)</tt> for every node of the tree
+ //! <tt>void disposer::operator()(const node_ptr &)</tt> for every node of the tree
    //! except the header.
    //!
    //! Then, duplicates the entire tree pointed by "source_header" cloning each
- //! source node with <tt>node_ptr Cloner::operator()(node_ptr)</tt> to obtain
+ //! source node with <tt>node_ptr Cloner::operator()(const node_ptr &)</tt> to obtain
    //! the nodes of the target tree. If "cloner" throws, the cloned target nodes
- //! are disposed using <tt>void disposer(node_ptr)</tt>.
+ //! are disposed using <tt>void disposer(const node_ptr &)</tt>.
    //!
    //! <b>Complexity</b>: Linear to the number of element of the source tree plus the.
    //! number of elements of tree target tree when calling this function.
@@ -663,23 +662,23 @@
    //! <b>Throws</b>: If cloner functor throws. If this happens target nodes are disposed.
    template <class Cloner, class Disposer>
    static void clone
- (const_node_ptr source_header, node_ptr target_header, Cloner cloner, Disposer disposer)
+ (const const_node_ptr & source_header, const node_ptr & target_header, Cloner cloner, Disposer disposer)
    { tree_algorithms::clone(source_header, target_header, cloner, disposer); }
 
    // delete node | complexity : constant | exception : nothrow
- static void erase(node_ptr header, node_ptr z, bool splay = true)
+ static void erase(const node_ptr & header, const node_ptr & z, bool splay = true)
    {
 // node_base* n = t->right;
-// if( t->left != 0 ){
+// if( t->left != node_ptr() ){
 // node_base* l = t->previous();
 // splay_up( l , t );
 // n = t->left;
 // n->right = t->right;
-// if( n->right != 0 )
+// if( n->right != node_ptr() )
 // n->right->parent = n;
 // }
 //
-// if( n != 0 )
+// if( n != node_ptr() )
 // n->parent = t->parent;
 //
 // if( t->parent->left == t )
@@ -695,11 +694,11 @@
       }
       /*
       //possibility 2
- if(splay && NodeTraits::get_left(z) != 0 ){
+ if(splay && NodeTraits::get_left(z) != node_ptr() ){
          node_ptr l = NodeTraits::get_left(z);
          splay_up(l, header);
       }*//*
- if(splay && NodeTraits::get_left(z) != 0 ){
+ if(splay && NodeTraits::get_left(z) != node_ptr() ){
          node_ptr l = prev_node(z);
          splay_up_impl(l, z);
       }*/
@@ -715,15 +714,13 @@
    }
 
    // bottom-up splay, use data_ as parent for n | complexity : logarithmic | exception : nothrow
- static void splay_up(node_ptr n, node_ptr header)
+ static void splay_up(const node_ptr & node, const node_ptr & header)
    {
- if(n == header){ // do a splay for the right most node instead
- // this is to boost performance of equal_range/count on equivalent containers in the case
- // where there are many equal elements at the end
- n = NodeTraits::get_right(header);
- }
-
- node_ptr t = header;
+ // If (node == header) do a splay for the right most node instead
+ // this is to boost performance of equal_range/count on equivalent containers in the case
+ // where there are many equal elements at the end
+ node_ptr n((node == header) ? NodeTraits::get_right(header) : node);
+ node_ptr t(header);
 
       if( n == t ) return;
       
@@ -753,7 +750,7 @@
 
    // top-down splay | complexity : logarithmic | exception : strong, note A
    template<class KeyType, class KeyNodePtrCompare>
- static node_ptr splay_down(node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ static node_ptr splay_down(const node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    {
       if(!NodeTraits::get_parent(header))
          return header;
@@ -782,19 +779,19 @@
 
          for( ;; ){
             if(comp(key, t)){
- if(NodeTraits::get_left(t) == 0 )
+ if(NodeTraits::get_left(t) == node_ptr() )
                   break;
                if(comp(key, NodeTraits::get_left(t))){
                   t = tree_algorithms::rotate_right(t);
 
- if(NodeTraits::get_left(t) == 0)
+ if(NodeTraits::get_left(t) == node_ptr())
                      break;
                   link_right(t, r);
                }
                else if(comp(NodeTraits::get_left(t), key)){
                   link_right(t, r);
 
- if(NodeTraits::get_right(t) == 0 )
+ if(NodeTraits::get_right(t) == node_ptr() )
                      break;
                   link_left(t, l);
                }
@@ -803,20 +800,20 @@
                }
             }
             else if(comp(t, key)){
- if(NodeTraits::get_right(t) == 0 )
+ if(NodeTraits::get_right(t) == node_ptr() )
                   break;
 
                if(comp(NodeTraits::get_right(t), key)){
                      t = tree_algorithms::rotate_left( t );
 
- if(NodeTraits::get_right(t) == 0 )
+ if(NodeTraits::get_right(t) == node_ptr() )
                         break;
                      link_left(t, l);
                }
                else if(comp(key, NodeTraits::get_right(t))){
                   link_left(t, l);
 
- if(NodeTraits::get_left(t) == 0)
+ if(NodeTraits::get_left(t) == node_ptr())
                      break;
 
                   link_right(t, r);
@@ -850,7 +847,7 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Complexity</b>: Linear.
- static void rebalance(node_ptr header)
+ static void rebalance(const node_ptr & header)
    { tree_algorithms::rebalance(header); }
 
    //! <b>Requires</b>: old_root is a node of a tree.
@@ -862,7 +859,7 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Complexity</b>: Linear.
- static node_ptr rebalance_subtree(node_ptr old_root)
+ static node_ptr rebalance_subtree(const node_ptr & old_root)
    { return tree_algorithms::rebalance_subtree(old_root); }
 
 
@@ -873,7 +870,7 @@
    //! <b>Complexity</b>: Logarithmic.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr get_header(node_ptr n)
+ static node_ptr get_header(const node_ptr & n)
    { return tree_algorithms::get_header(n); }
 
    private:
@@ -881,23 +878,23 @@
    /// @cond
 
    // assemble the three sub-trees into new tree pointed to by t | complexity : constant | exception : nothrow
- static void assemble( node_ptr t, node_ptr l, node_ptr r, const_node_ptr null_node )
+ static void assemble(const node_ptr &t, const node_ptr & l, const node_ptr & r, const const_node_ptr & null_node )
    {
       NodeTraits::set_right(l, NodeTraits::get_left(t));
       NodeTraits::set_left(r, NodeTraits::get_right(t));
 
- if(NodeTraits::get_right(l) != 0){
+ if(NodeTraits::get_right(l) != node_ptr()){
          NodeTraits::set_parent(NodeTraits::get_right(l), l);
       }
 
- if(NodeTraits::get_left(r) != 0){
+ if(NodeTraits::get_left(r) != node_ptr()){
          NodeTraits::set_parent(NodeTraits::get_left(r), r);
       }
 
       NodeTraits::set_left (t, NodeTraits::get_right(null_node));
       NodeTraits::set_right(t, NodeTraits::get_left(null_node));
 
- if( NodeTraits::get_left(t) != 0 ){
+ if( NodeTraits::get_left(t) != node_ptr() ){
          NodeTraits::set_parent(NodeTraits::get_left(t), t);
       }
 
@@ -907,7 +904,7 @@
    }
 
    // break link to left child node and attach it to left tree pointed to by l | complexity : constant | exception : nothrow
- static void link_left(node_ptr& t, node_ptr& l)
+ static void link_left(node_ptr & t, node_ptr & l)
    {
       NodeTraits::set_right(l, t);
       NodeTraits::set_parent(t, l);
@@ -916,7 +913,7 @@
    }
 
    // break link to right child node and attach it to right tree pointed to by r | complexity : constant | exception : nothrow
- static void link_right(node_ptr& t, node_ptr& r)
+ static void link_right(node_ptr & t, node_ptr & r)
    {
       NodeTraits::set_left(r, t);
       NodeTraits::set_parent(t, r);
@@ -925,7 +922,7 @@
    }
 
    // rotate n with its parent | complexity : constant | exception : nothrow
- static void rotate(node_ptr n)
+ static void rotate(const node_ptr & n)
    {
       node_ptr p = NodeTraits::get_parent(n);
       node_ptr g = NodeTraits::get_parent(p);
@@ -935,13 +932,13 @@
       
       if(NodeTraits::get_left(p) == n){
          NodeTraits::set_left(p, NodeTraits::get_right(n));
- if(NodeTraits::get_left(p) != 0)
+ if(NodeTraits::get_left(p) != node_ptr())
             NodeTraits::set_parent(NodeTraits::get_left(p), p);
          NodeTraits::set_right(n, p);
       }
       else{ // must be ( p->right == n )
          NodeTraits::set_right(p, NodeTraits::get_left(n));
- if(NodeTraits::get_right(p) != 0)
+ if(NodeTraits::get_right(p) != node_ptr())
             NodeTraits::set_parent(NodeTraits::get_right(p), p);
          NodeTraits::set_left(n, p);
       }
@@ -953,7 +950,7 @@
          if(NodeTraits::get_parent(g) == p)
             NodeTraits::set_parent(g, n);
          else{//must be ( g->right == p )
- BOOST_INTRUSIVE_INVARIANT_ASSERT(0);
+ BOOST_INTRUSIVE_INVARIANT_ASSERT(false);
             NodeTraits::set_right(g, n);
          }
       }

Modified: branches/release/boost/intrusive/treap.hpp
==============================================================================
--- branches/release/boost/intrusive/treap.hpp (original)
+++ branches/release/boost/intrusive/treap.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -25,8 +25,10 @@
 #include <boost/intrusive/bs_set_hook.hpp>
 #include <boost/intrusive/detail/tree_node.hpp>
 #include <boost/intrusive/detail/ebo_functor_holder.hpp>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/detail/clear_on_destructor_base.hpp>
+#include <boost/intrusive/detail/utilities.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/options.hpp>
 #include <boost/intrusive/detail/mpl.hpp>
 #include <boost/intrusive/treap_algorithms.hpp>
@@ -98,25 +100,27 @@
    /// @endcond
    typedef typename real_value_traits::pointer pointer;
    typedef typename real_value_traits::const_pointer const_pointer;
- typedef typename std::iterator_traits<pointer>::value_type value_type;
+ typedef typename pointer_traits<pointer>::element_type value_type;
+ typedef typename pointer_traits<pointer>::reference reference;
+ typedef typename pointer_traits<const_pointer>::reference const_reference;
+ typedef typename pointer_traits<pointer>::difference_type difference_type;
    typedef value_type key_type;
- typedef typename std::iterator_traits<pointer>::reference reference;
- typedef typename std::iterator_traits<const_pointer>::reference const_reference;
- typedef typename std::iterator_traits<pointer>::difference_type difference_type;
    typedef typename Config::size_type size_type;
    typedef typename Config::compare value_compare;
    typedef typename Config::priority_compare priority_compare;
    typedef value_compare key_compare;
- typedef tree_iterator<treap_impl, false> iterator;
- typedef tree_iterator<treap_impl, true> const_iterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef tree_iterator<treap_impl, false> iterator;
+ typedef tree_iterator<treap_impl, true> const_iterator;
+ typedef boost::intrusive::detail::reverse_iterator<iterator> reverse_iterator;
+ typedef boost::intrusive::detail::reverse_iterator<const_iterator>const_reverse_iterator;
    typedef typename real_value_traits::node_traits node_traits;
    typedef typename node_traits::node node;
- typedef typename boost::pointer_to_other
- <pointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <node_ptr, const node>::type const_node_ptr;
+ typedef typename pointer_traits
+ <pointer>::template rebind_pointer
+ <node>::type node_ptr;
+ typedef typename pointer_traits
+ <pointer>::template rebind_pointer
+ <const node>::type const_node_ptr;
    typedef treap_algorithms<node_traits> node_algorithms;
 
    static const bool constant_time_size = Config::constant_time_size;
@@ -182,16 +186,14 @@
    value_traits &priv_value_traits()
    { return data_; }
 
- const node &priv_header() const
- { return data_.node_plus_pred_.header_plus_priority_size_.header_plus_size_.header_; }
+ node_ptr priv_header_ptr()
+ { return pointer_traits<node_ptr>::pointer_to(data_.node_plus_pred_.header_plus_priority_size_.header_plus_size_.header_); }
 
- node &priv_header()
- { return data_.node_plus_pred_.header_plus_priority_size_.header_plus_size_.header_; }
+ const_node_ptr priv_header_ptr() const
+ { return pointer_traits<const_node_ptr>::pointer_to(data_.node_plus_pred_.header_plus_priority_size_.header_plus_size_.header_); }
 
- static node_ptr uncast(const_node_ptr ptr)
- {
- return node_ptr(const_cast<node*>(detail::boost_intrusive_get_pointer(ptr)));
- }
+ static node_ptr uncast(const const_node_ptr & ptr)
+ { return pointer_traits<node_ptr>::const_cast_from(ptr); }
 
    size_traits &priv_size_traits()
    { return data_.node_plus_pred_.header_plus_priority_size_.header_plus_size_; }
@@ -235,7 +237,7 @@
             , const value_traits &v_traits = value_traits())
       : data_(cmp, pcmp, v_traits)
    {
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
       this->priv_size_traits().set_size(size_type(0));
    }
 
@@ -259,7 +261,7 @@
             , const value_traits &v_traits = value_traits())
       : data_(cmp, pcmp, v_traits)
    {
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
       this->priv_size_traits().set_size(size_type(0));
       if(unique)
          this->insert_unique(b, e);
@@ -274,7 +276,7 @@
              , ::boost::move(x.priv_pcomp())
              , ::boost::move(x.priv_value_traits()))
    {
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
       this->priv_size_traits().set_size(size_type(0));
       this->swap(x);
    }
@@ -301,7 +303,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    iterator begin()
- { return iterator (node_traits::get_left(node_ptr(&priv_header())), this); }
+ { return iterator (node_traits::get_left(this->priv_header_ptr()), this); }
 
    //! <b>Effects</b>: Returns a const_iterator pointing to the beginning of the treap.
    //!
@@ -317,7 +319,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    const_iterator cbegin() const
- { return const_iterator (node_traits::get_left(const_node_ptr(&priv_header())), this); }
+ { return const_iterator (node_traits::get_left(this->priv_header_ptr()), this); }
 
    //! <b>Effects</b>: Returns an iterator pointing to the end of the treap.
    //!
@@ -325,7 +327,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    iterator end()
- { return iterator (node_ptr(&priv_header()), this); }
+ { return iterator (this->priv_header_ptr(), this); }
 
    //! <b>Effects</b>: Returns a const_iterator pointing to the end of the treap.
    //!
@@ -341,7 +343,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    const_iterator cend() const
- { return const_iterator (uncast(const_node_ptr(&priv_header())), this); }
+ { return const_iterator (uncast(this->priv_header_ptr()), this); }
 
 
    //! <b>Effects</b>: Returns an iterator pointing to the highest priority object of the treap.
@@ -350,7 +352,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    iterator top()
- { return this->empty() ? this->end() : iterator (node_traits::get_parent(node_ptr(&priv_header())), this); }
+ { return this->empty() ? this->end() : iterator (node_traits::get_parent(this->priv_header_ptr()), this); }
 
    //! <b>Effects</b>: Returns a const_iterator pointing to the highest priority object of the treap..
    //!
@@ -366,7 +368,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    const_iterator ctop() const
- { return this->empty() ? this->cend() : const_iterator (node_traits::get_parent(const_node_ptr(&priv_header())), this); }
+ { return this->empty() ? this->cend() : const_iterator (node_traits::get_parent(this->priv_header_ptr()), this); }
 
    //! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning of the
    //! reversed treap.
@@ -515,7 +517,7 @@
    //!
    //! <b>Throws</b>: Nothing.
    bool empty() const
- { return node_algorithms::unique(const_node_ptr(&priv_header())); }
+ { return node_algorithms::unique(this->priv_header_ptr()); }
 
    //! <b>Effects</b>: Returns the number of elements stored in the treap.
    //!
@@ -528,7 +530,7 @@
       if(constant_time_size)
          return this->priv_size_traits().get_size();
       else{
- return (size_type)node_algorithms::size(const_node_ptr(&priv_header()));
+ return (size_type)node_algorithms::size(this->priv_header_ptr());
       }
    }
 
@@ -544,7 +546,7 @@
       swap(priv_comp(), priv_comp());
       swap(priv_pcomp(), priv_pcomp());
       //These can't throw
- node_algorithms::swap_tree(node_ptr(&priv_header()), node_ptr(&other.priv_header()));
+ node_algorithms::swap_tree(this->priv_header_ptr(), other.priv_header_ptr());
       if(constant_time_size){
          size_type backup = this->priv_size_traits().get_size();
          this->priv_size_traits().set_size(other.priv_size_traits().get_size());
@@ -573,7 +575,7 @@
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       iterator ret(node_algorithms::insert_equal_upper_bound
- (node_ptr(&priv_header()), to_insert, key_node_comp, key_node_pcomp), this);
+ (this->priv_header_ptr(), to_insert, key_node_comp, key_node_pcomp), this);
       this->priv_size_traits().increment();
       return ret;
    }
@@ -602,7 +604,7 @@
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       iterator ret (node_algorithms::insert_equal
- (node_ptr(&priv_header()), hint.pointed_node(), to_insert, key_node_comp, key_node_pcomp), this);
+ (this->priv_header_ptr(), hint.pointed_node(), to_insert, key_node_comp, key_node_pcomp), this);
       this->priv_size_traits().increment();
       return ret;
    }
@@ -748,7 +750,7 @@
          pcomp(key_value_pcomp, this);
       std::pair<node_ptr, bool> ret =
          (node_algorithms::insert_unique_check
- (node_ptr(&priv_header()), key, comp, pcomp, commit_data));
+ (this->priv_header_ptr(), key, comp, pcomp, commit_data));
       return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
    }
 
@@ -800,7 +802,7 @@
          pcomp(key_value_pcomp, this);
       std::pair<node_ptr, bool> ret =
          (node_algorithms::insert_unique_check
- (node_ptr(&priv_header()), hint.pointed_node(), key, comp, pcomp, commit_data));
+ (this->priv_header_ptr(), hint.pointed_node(), key, comp, pcomp, commit_data));
       return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
    }
 
@@ -826,7 +828,7 @@
       node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
       if(safemode_or_autounlink)
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
- node_algorithms::insert_unique_commit(node_ptr(&priv_header()), to_insert, commit_data);
+ node_algorithms::insert_unique_commit(this->priv_header_ptr(), to_insert, commit_data);
       this->priv_size_traits().increment();
       return iterator(to_insert, this);
    }
@@ -853,7 +855,7 @@
       detail::key_nodeptr_comp<priority_compare, treap_impl>
          pcomp(priv_pcomp(), this);
       iterator ret (node_algorithms::insert_before
- (node_ptr(&priv_header()), pos.pointed_node(), to_insert, pcomp), this);
+ (this->priv_header_ptr(), pos.pointed_node(), to_insert, pcomp), this);
       this->priv_size_traits().increment();
       return ret;
    }
@@ -879,7 +881,7 @@
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       detail::key_nodeptr_comp<priority_compare, treap_impl>
          pcomp(priv_pcomp(), this);
- node_algorithms::push_back(node_ptr(&priv_header()), to_insert, pcomp);
+ node_algorithms::push_back(this->priv_header_ptr(), to_insert, pcomp);
       this->priv_size_traits().increment();
    }
 
@@ -904,7 +906,7 @@
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
       detail::key_nodeptr_comp<priority_compare, treap_impl>
          pcomp(priv_pcomp(), this);
- node_algorithms::push_front(node_ptr(&priv_header()), to_insert, pcomp);
+ node_algorithms::push_front(this->priv_header_ptr(), to_insert, pcomp);
       this->priv_size_traits().increment();
    }
 
@@ -925,7 +927,7 @@
          BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!node_algorithms::unique(to_erase));
       detail::key_nodeptr_comp<priority_compare, treap_impl>
          key_node_pcomp(priv_pcomp(), this);
- node_algorithms::erase(&priv_header(), to_erase, key_node_pcomp);
+ node_algorithms::erase(this->priv_header_ptr(), to_erase, key_node_pcomp);
       this->priv_size_traits().decrement();
       if(safemode_or_autounlink)
          node_algorithms::init(to_erase);
@@ -1090,7 +1092,7 @@
          this->clear_and_dispose(detail::null_disposer());
       }
       else{
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(priv_header_ptr());
          this->priv_size_traits().set_size(0);
       }
    }
@@ -1107,9 +1109,9 @@
    template<class Disposer>
    void clear_and_dispose(Disposer disposer)
    {
- node_algorithms::clear_and_dispose(node_ptr(&priv_header())
+ node_algorithms::clear_and_dispose(this->priv_header_ptr()
          , detail::node_disposer<Disposer, treap_impl>(disposer, this));
- node_algorithms::init_header(&priv_header());
+ node_algorithms::init_header(this->priv_header_ptr());
       this->priv_size_traits().set_size(0);
    }
 
@@ -1165,7 +1167,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, treap_impl>
          key_node_comp(comp, this);
       return iterator(node_algorithms::lower_bound
- (const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Returns a const iterator to the first element whose
@@ -1180,7 +1182,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, treap_impl>
          key_node_comp(comp, this);
       return const_iterator(node_algorithms::lower_bound
- (const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Returns an iterator to the first element whose
@@ -1205,7 +1207,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, treap_impl>
          key_node_comp(comp, this);
       return iterator(node_algorithms::upper_bound
- (const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Returns an iterator to the first element whose
@@ -1230,7 +1232,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, treap_impl>
          key_node_comp(comp, this);
       return const_iterator(node_algorithms::upper_bound
- (const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Finds an iterator to the first element whose key is
@@ -1254,7 +1256,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, treap_impl>
          key_node_comp(comp, this);
       return iterator
- (node_algorithms::find(const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (node_algorithms::find(this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Finds a const_iterator to the first element whose key is
@@ -1278,7 +1280,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, treap_impl>
          key_node_comp(comp, this);
       return const_iterator
- (node_algorithms::find(const_node_ptr(&priv_header()), key, key_node_comp), this);
+ (node_algorithms::find(this->priv_header_ptr(), key, key_node_comp), this);
    }
 
    //! <b>Effects</b>: Finds a range containing all elements whose key is k or
@@ -1304,7 +1306,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, treap_impl>
          key_node_comp(comp, this);
       std::pair<node_ptr, node_ptr> ret
- (node_algorithms::equal_range(const_node_ptr(&priv_header()), key, key_node_comp));
+ (node_algorithms::equal_range(this->priv_header_ptr(), key, key_node_comp));
       return std::pair<iterator, iterator>(iterator(ret.first, this), iterator(ret.second, this));
    }
 
@@ -1333,7 +1335,7 @@
       detail::key_nodeptr_comp<KeyValueCompare, treap_impl>
          key_node_comp(comp, this);
       std::pair<node_ptr, node_ptr> ret
- (node_algorithms::equal_range(const_node_ptr(&priv_header()), key, key_node_comp));
+ (node_algorithms::equal_range(this->priv_header_ptr(), key, key_node_comp));
       return std::pair<const_iterator, const_iterator>(const_iterator(ret.first, this), const_iterator(ret.second, this));
    }
 
@@ -1359,8 +1361,8 @@
          detail::exception_disposer<treap_impl, Disposer>
             rollback(*this, disposer);
          node_algorithms::clone
- (const_node_ptr(&src.priv_header())
- ,node_ptr(&this->priv_header())
+ (src.priv_header_ptr()
+ ,this->priv_header_ptr()
             ,detail::node_cloner<Cloner, treap_impl>(cloner, this)
             ,detail::node_disposer<Disposer, treap_impl>(disposer, this));
          this->priv_size_traits().set_size(src.priv_size_traits().get_size());
@@ -1382,7 +1384,7 @@
    pointer unlink_leftmost_without_rebalance()
    {
       node_ptr to_be_disposed(node_algorithms::unlink_leftmost_without_rebalance
- (node_ptr(&priv_header())));
+ (this->priv_header_ptr()));
       if(!to_be_disposed)
          return 0;
       this->priv_size_traits().decrement();
@@ -1408,7 +1410,7 @@
    void replace_node(iterator replace_this, reference with_this)
    {
       node_algorithms::replace_node( get_real_value_traits().to_node_ptr(*replace_this)
- , node_ptr(&priv_header())
+ , this->priv_header_ptr()
                                    , get_real_value_traits().to_node_ptr(with_this));
       if(safemode_or_autounlink)
          node_algorithms::init(replace_this.pointed_node());
@@ -1510,7 +1512,7 @@
    static treap_impl &priv_container_from_end_iterator(const const_iterator &end_iterator)
    {
       header_plus_size *r = detail::parent_from_member<header_plus_size, node>
- ( detail::boost_intrusive_get_pointer(end_iterator.pointed_node()), &header_plus_size::header_);
+ ( boost::intrusive::detail::to_raw_pointer(end_iterator.pointed_node()), &header_plus_size::header_);
       typename node_plus_pred_t::header_plus_priority_size *n =
          detail::parent_from_member
          < typename node_plus_pred_t::header_plus_priority_size

Modified: branches/release/boost/intrusive/treap_algorithms.hpp
==============================================================================
--- branches/release/boost/intrusive/treap_algorithms.hpp (original)
+++ branches/release/boost/intrusive/treap_algorithms.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -19,6 +19,7 @@
 #include <boost/intrusive/intrusive_fwd.hpp>
 
 #include <boost/intrusive/detail/assert.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/detail/utilities.hpp>
 #include <boost/intrusive/detail/tree_algorithms.hpp>
 #include <algorithm>
@@ -82,7 +83,7 @@
       remove_on_destroy(const remove_on_destroy&);
       remove_on_destroy& operator=(const remove_on_destroy&);
       public:
- remove_on_destroy(node_ptr header, node_ptr z)
+ remove_on_destroy(const node_ptr & header, const node_ptr & z)
          : header_(header), z_(z), remove_it_(true)
       {}
       ~remove_on_destroy()
@@ -106,7 +107,7 @@
       rerotate_on_destroy& operator=(const rerotate_on_destroy&);
 
       public:
- rerotate_on_destroy(node_ptr header, node_ptr p, std::size_t &n)
+ rerotate_on_destroy(const node_ptr & header, const node_ptr & p, std::size_t &n)
          : header_(header), p_(p), n_(n), remove_it_(true)
       {}
 
@@ -143,17 +144,16 @@
 
    typedef detail::tree_algorithms<NodeTraits> tree_algorithms;
 
- static node_ptr uncast(const_node_ptr ptr)
- {
- return node_ptr(const_cast<node*>(::boost::intrusive::detail::boost_intrusive_get_pointer(ptr)));
- }
+ static node_ptr uncast(const const_node_ptr & ptr)
+ { return pointer_traits<node_ptr>::const_cast_from(ptr); }
+
    /// @endcond
 
    public:
- static node_ptr begin_node(const_node_ptr header)
+ static node_ptr begin_node(const const_node_ptr & header)
    { return tree_algorithms::begin_node(header); }
 
- static node_ptr end_node(const_node_ptr header)
+ static node_ptr end_node(const const_node_ptr & header)
    { return tree_algorithms::end_node(header); }
 
    //! This type is the information that will be
@@ -177,7 +177,7 @@
    //! <b>Complexity</b>: Constant.
    //!
    //! <b>Throws</b>: Nothing.
- static void swap_tree(node_ptr header1, node_ptr header2)
+ static void swap_tree(const node_ptr & header1, const node_ptr & header2)
    { return tree_algorithms::swap_tree(header1, header2); }
 
    //! <b>Requires</b>: node1 and node2 can't be header nodes
@@ -195,7 +195,7 @@
    //! node1 and node2 are not equivalent according to the ordering rules.
    //!
    //!Experimental function
- static void swap_nodes(node_ptr node1, node_ptr node2)
+ static void swap_nodes(const node_ptr & node1, const node_ptr & node2)
    {
       if(node1 == node2)
          return;
@@ -219,7 +219,7 @@
    //! node1 and node2 are not equivalent according to the ordering rules.
    //!
    //!Experimental function
- static void swap_nodes(node_ptr node1, node_ptr header1, node_ptr node2, node_ptr header2)
+ static void swap_nodes(const node_ptr & node1, const node_ptr & header1, const node_ptr & node2, const node_ptr & header2)
    { tree_algorithms::swap_nodes(node1, header1, node2, header2); }
 
    //! <b>Requires</b>: node_to_be_replaced must be inserted in a tree
@@ -238,7 +238,7 @@
    //! the node, since no rebalancing and comparison is needed.
    //!
    //!Experimental function
- static void replace_node(node_ptr node_to_be_replaced, node_ptr new_node)
+ static void replace_node(const node_ptr & node_to_be_replaced, const node_ptr & new_node)
    {
       if(node_to_be_replaced == new_node)
          return;
@@ -261,7 +261,7 @@
    //! the node, since no rebalancing or comparison is needed.
    //!
    //!Experimental function
- static void replace_node(node_ptr node_to_be_replaced, node_ptr header, node_ptr new_node)
+ static void replace_node(const node_ptr & node_to_be_replaced, const node_ptr & header, const node_ptr & new_node)
    { tree_algorithms::replace_node(node_to_be_replaced, header, new_node); }
 
    //! <b>Requires</b>: node is a tree node but not the header.
@@ -272,7 +272,7 @@
    //!
    //! <b>Throws</b>: If "pcomp" throws, strong guarantee
    template<class NodePtrPriorityCompare>
- static void unlink(node_ptr node, NodePtrPriorityCompare pcomp)
+ static void unlink(const node_ptr & node, NodePtrPriorityCompare pcomp)
    {
       node_ptr x = NodeTraits::get_parent(node);
       if(x){
@@ -295,7 +295,7 @@
    //! only be used for more unlink_leftmost_without_rebalance calls.
    //! This function is normally used to achieve a step by step
    //! controlled destruction of the tree.
- static node_ptr unlink_leftmost_without_rebalance(node_ptr header)
+ static node_ptr unlink_leftmost_without_rebalance(const node_ptr & header)
    { return tree_algorithms::unlink_leftmost_without_rebalance(header); }
 
    //! <b>Requires</b>: node is a node of the tree or an node initialized
@@ -306,7 +306,7 @@
    //! <b>Complexity</b>: Constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static bool unique(const_node_ptr node)
+ static bool unique(const const_node_ptr & node)
    { return tree_algorithms::unique(node); }
 
    //! <b>Requires</b>: node is a node of the tree but it's not the header.
@@ -316,7 +316,7 @@
    //! <b>Complexity</b>: Linear time.
    //!
    //! <b>Throws</b>: Nothing.
- static std::size_t count(const_node_ptr node)
+ static std::size_t count(const const_node_ptr & node)
    { return tree_algorithms::count(node); }
 
    //! <b>Requires</b>: header is the header node of the tree.
@@ -326,7 +326,7 @@
    //! <b>Complexity</b>: Linear time.
    //!
    //! <b>Throws</b>: Nothing.
- static std::size_t size(const_node_ptr header)
+ static std::size_t size(const const_node_ptr & header)
    { return tree_algorithms::size(header); }
 
    //! <b>Requires</b>: p is a node from the tree except the header.
@@ -336,7 +336,7 @@
    //! <b>Complexity</b>: Average constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr next_node(node_ptr p)
+ static node_ptr next_node(const node_ptr & p)
    { return tree_algorithms::next_node(p); }
 
    //! <b>Requires</b>: p is a node from the tree except the leftmost node.
@@ -346,7 +346,7 @@
    //! <b>Complexity</b>: Average constant time.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr prev_node(node_ptr p)
+ static node_ptr prev_node(const node_ptr & p)
    { return tree_algorithms::prev_node(p); }
 
    //! <b>Requires</b>: node must not be part of any tree.
@@ -358,7 +358,7 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Nodes</b>: If node is inserted in a tree, this function corrupts the tree.
- static void init(node_ptr node)
+ static void init(const node_ptr & node)
    { tree_algorithms::init(node); }
 
    //! <b>Requires</b>: node must not be part of any tree.
@@ -371,7 +371,7 @@
    //! <b>Throws</b>: Nothing.
    //!
    //! <b>Nodes</b>: If node is inserted in a tree, this function corrupts the tree.
- static void init_header(node_ptr header)
+ static void init_header(const node_ptr & header)
    {
       tree_algorithms::init_header(header);
    }
@@ -385,7 +385,7 @@
    //!
    //! <b>Throws</b>: If "pcomp" throws, strong guarantee.
    template<class NodePtrPriorityCompare>
- static node_ptr erase(node_ptr header, node_ptr z, NodePtrPriorityCompare pcomp)
+ static node_ptr erase(const node_ptr & header, const node_ptr & z, NodePtrPriorityCompare pcomp)
    {
       rebalance_for_erasure(header, z, pcomp);
       tree_algorithms::erase(header, z);
@@ -398,13 +398,13 @@
    //! take a node_ptr and shouldn't throw.
    //!
    //! <b>Effects</b>: First empties target tree calling
- //! <tt>void disposer::operator()(node_ptr)</tt> for every node of the tree
+ //! <tt>void disposer::operator()(const node_ptr &)</tt> for every node of the tree
    //! except the header.
    //!
    //! Then, duplicates the entire tree pointed by "source_header" cloning each
- //! source node with <tt>node_ptr Cloner::operator()(node_ptr)</tt> to obtain
+ //! source node with <tt>node_ptr Cloner::operator()(const node_ptr &)</tt> to obtain
    //! the nodes of the target tree. If "cloner" throws, the cloned target nodes
- //! are disposed using <tt>void disposer(node_ptr)</tt>.
+ //! are disposed using <tt>void disposer(const node_ptr &)</tt>.
    //!
    //! <b>Complexity</b>: Linear to the number of element of the source tree plus the.
    //! number of elements of tree target tree when calling this function.
@@ -412,7 +412,7 @@
    //! <b>Throws</b>: If cloner functor throws. If this happens target nodes are disposed.
    template <class Cloner, class Disposer>
    static void clone
- (const_node_ptr source_header, node_ptr target_header, Cloner cloner, Disposer disposer)
+ (const const_node_ptr & source_header, const node_ptr & target_header, Cloner cloner, Disposer disposer)
    {
       tree_algorithms::clone(source_header, target_header, cloner, disposer);
    }
@@ -421,7 +421,7 @@
    //! taking a node_ptr parameter and shouldn't throw.
    //!
    //! <b>Effects</b>: Empties the target tree calling
- //! <tt>void disposer::operator()(node_ptr)</tt> for every node of the tree
+ //! <tt>void disposer::operator()(const node_ptr &)</tt> for every node of the tree
    //! except the header.
    //!
    //! <b>Complexity</b>: Linear to the number of element of the source tree plus the.
@@ -429,7 +429,7 @@
    //!
    //! <b>Throws</b>: If cloner functor throws. If this happens target nodes are disposed.
    template<class Disposer>
- static void clear_and_dispose(node_ptr header, Disposer disposer)
+ static void clear_and_dispose(const node_ptr & header, Disposer disposer)
    { tree_algorithms::clear_and_dispose(header, disposer); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -446,7 +446,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static node_ptr lower_bound
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    { return tree_algorithms::lower_bound(header, key, comp); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -462,7 +462,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static node_ptr upper_bound
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    { return tree_algorithms::upper_bound(header, key, comp); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -478,7 +478,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static node_ptr find
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    { return tree_algorithms::find(header, key, comp); }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -496,7 +496,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class KeyType, class KeyNodePtrCompare>
    static std::pair<node_ptr, node_ptr> equal_range
- (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+ (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp)
    { return tree_algorithms::equal_range(header, key, comp); }
 
    //! <b>Requires</b>: "h" must be the header node of a tree.
@@ -516,7 +516,7 @@
    //! <b>Throws</b>: If "comp" throw or "pcomp" throw.
    template<class NodePtrCompare, class NodePtrPriorityCompare>
    static node_ptr insert_equal_upper_bound
- (node_ptr h, node_ptr new_node, NodePtrCompare comp, NodePtrPriorityCompare pcomp)
+ (const node_ptr & h, const node_ptr & new_node, NodePtrCompare comp, NodePtrPriorityCompare pcomp)
    {
       insert_commit_data commit_data;
       tree_algorithms::insert_equal_upper_bound_check(h, new_node, comp, commit_data);
@@ -541,7 +541,7 @@
    //! <b>Throws</b>: If "comp" throws.
    template<class NodePtrCompare, class NodePtrPriorityCompare>
    static node_ptr insert_equal_lower_bound
- (node_ptr h, node_ptr new_node, NodePtrCompare comp, NodePtrPriorityCompare pcomp)
+ (const node_ptr & h, const node_ptr & new_node, NodePtrCompare comp, NodePtrPriorityCompare pcomp)
    {
       insert_commit_data commit_data;
       tree_algorithms::insert_equal_lower_bound_check(h, new_node, comp, commit_data);
@@ -569,7 +569,7 @@
    //! <b>Throws</b>: If "comp" throw or "pcomp" throw.
    template<class NodePtrCompare, class NodePtrPriorityCompare>
    static node_ptr insert_equal
- (node_ptr h, node_ptr hint, node_ptr new_node, NodePtrCompare comp, NodePtrPriorityCompare pcomp)
+ (const node_ptr & h, const node_ptr & hint, const node_ptr & new_node, NodePtrCompare comp, NodePtrPriorityCompare pcomp)
    {
       insert_commit_data commit_data;
       tree_algorithms::insert_equal_check(h, hint, new_node, comp, commit_data);
@@ -597,7 +597,7 @@
    //! tree invariants might be broken.
    template<class NodePtrPriorityCompare>
    static node_ptr insert_before
- (node_ptr header, node_ptr pos, node_ptr new_node, NodePtrPriorityCompare pcomp)
+ (const node_ptr & header, const node_ptr & pos, const node_ptr & new_node, NodePtrPriorityCompare pcomp)
    {
       insert_commit_data commit_data;
       tree_algorithms::insert_before_check(header, pos, commit_data);
@@ -623,7 +623,7 @@
    //! tree invariants are broken. This function is slightly faster than
    //! using "insert_before".
    template<class NodePtrPriorityCompare>
- static void push_back(node_ptr header, node_ptr new_node, NodePtrPriorityCompare pcomp)
+ static void push_back(const node_ptr & header, const node_ptr & new_node, NodePtrPriorityCompare pcomp)
    {
       insert_commit_data commit_data;
       tree_algorithms::push_back_check(header, commit_data);
@@ -648,7 +648,7 @@
    //! tree invariants are broken. This function is slightly faster than
    //! using "insert_before".
    template<class NodePtrPriorityCompare>
- static void push_front(node_ptr header, node_ptr new_node, NodePtrPriorityCompare pcomp)
+ static void push_front(const node_ptr & header, const node_ptr & new_node, NodePtrPriorityCompare pcomp)
    {
       insert_commit_data commit_data;
       tree_algorithms::push_front_check(header, commit_data);
@@ -691,7 +691,7 @@
    //! if no more objects are inserted or erased from the set.
    template<class KeyType, class KeyNodePtrCompare, class KeyNodePtrPrioCompare>
    static std::pair<node_ptr, bool> insert_unique_check
- (const_node_ptr header, const KeyType &key
+ (const const_node_ptr & header, const KeyType &key
       ,KeyNodePtrCompare comp, KeyNodePtrPrioCompare pcomp
       ,insert_commit_data &commit_data)
    {
@@ -743,7 +743,7 @@
    //! if no more objects are inserted or erased from the set.
    template<class KeyType, class KeyNodePtrCompare, class KeyNodePtrPrioCompare>
    static std::pair<node_ptr, bool> insert_unique_check
- (const_node_ptr header, node_ptr hint, const KeyType &key
+ (const const_node_ptr & header, const node_ptr & hint, const KeyType &key
       ,KeyNodePtrCompare comp, KeyNodePtrPrioCompare pcomp, insert_commit_data &commit_data)
    {
       std::pair<node_ptr, bool> ret =
@@ -771,7 +771,7 @@
    //! previously executed to fill "commit_data". No value should be inserted or
    //! erased between the "insert_check" and "insert_commit" calls.
    static void insert_unique_commit
- (node_ptr header, node_ptr new_node, const insert_commit_data &commit_data)
+ (const node_ptr & header, const node_ptr & new_node, const insert_commit_data &commit_data)
    {
       tree_algorithms::insert_unique_commit(header, new_node, commit_data);
       rebalance_after_insertion_commit(header, new_node, commit_data.rotations);
@@ -784,7 +784,7 @@
    //! <b>Complexity</b>: Logarithmic.
    //!
    //! <b>Throws</b>: Nothing.
- static node_ptr get_header(node_ptr n)
+ static node_ptr get_header(const node_ptr & n)
    { return tree_algorithms::get_header(n); }
 
    /// @cond
@@ -797,13 +797,13 @@
    //! <b>Complexity</b>: Constant.
    //!
    //! <b>Throws</b>: Nothing.
- static bool is_header(const_node_ptr p)
+ static bool is_header(const const_node_ptr & p)
    {
       return tree_algorithms::is_header(p);
    }
 
    template<class NodePtrPriorityCompare>
- static void rebalance_for_erasure(node_ptr header, node_ptr z, NodePtrPriorityCompare pcomp)
+ static void rebalance_for_erasure(const node_ptr & header, const node_ptr & z, NodePtrPriorityCompare pcomp)
    {
       std::size_t n = 0;
       rerotate_on_destroy rb(header, z, n);
@@ -826,7 +826,7 @@
 
    template<class NodePtrPriorityCompare>
    static void rebalance_check_and_commit
- (node_ptr h, node_ptr new_node, NodePtrPriorityCompare pcomp, insert_commit_data &commit_data)
+ (const node_ptr & h, const node_ptr & new_node, NodePtrPriorityCompare pcomp, insert_commit_data &commit_data)
    {
       rebalance_after_insertion_check(h, commit_data.node, new_node, pcomp, commit_data.rotations);
       //No-throw
@@ -837,9 +837,10 @@
 
    template<class Key, class KeyNodePriorityCompare>
    static void rebalance_after_insertion_check
- ( const_node_ptr header, const_node_ptr upnode, const Key &k
+ (const const_node_ptr &header, const const_node_ptr & up, const Key &k
       , KeyNodePriorityCompare pcomp, std::size_t &num_rotations)
    {
+ const_node_ptr upnode(up);
       //First check rotations since pcomp can throw
       num_rotations = 0;
       std::size_t n = 0;
@@ -850,7 +851,7 @@
       num_rotations = n;
    }
 
- static void rebalance_after_insertion_commit(node_ptr header, node_ptr p, std::size_t n)
+ static void rebalance_after_insertion_commit(const node_ptr & header, const node_ptr & p, std::size_t n)
    {
       // Now execute n rotations
       for( node_ptr p_parent = NodeTraits::get_parent(p)
@@ -867,7 +868,7 @@
    }
 
    template<class NodePtrPriorityCompare>
- static bool check_invariant(const_node_ptr header, NodePtrPriorityCompare pcomp)
+ static bool check_invariant(const const_node_ptr & header, NodePtrPriorityCompare pcomp)
    {
       node_ptr beg = begin_node(header);
       node_ptr end = end_node(header);

Modified: branches/release/boost/intrusive/trivial_value_traits.hpp
==============================================================================
--- branches/release/boost/intrusive/trivial_value_traits.hpp (original)
+++ branches/release/boost/intrusive/trivial_value_traits.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -14,6 +14,7 @@
 #define BOOST_INTRUSIVE_TRIVIAL_VALUE_TRAITS_HPP
 
 #include <boost/intrusive/link_mode.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 
 namespace boost {
 namespace intrusive {
@@ -31,10 +32,12 @@
    typedef node_ptr pointer;
    typedef const_node_ptr const_pointer;
    static const link_mode_type link_mode = LinkMode;
- static node_ptr to_node_ptr (value_type &value) { return node_ptr(&value); }
- static const_node_ptr to_node_ptr (const value_type &value) { return const_node_ptr(&value); }
- static pointer to_value_ptr(node_ptr n) { return pointer(n); }
- static const_pointer to_value_ptr(const_node_ptr n) { return const_pointer(n); }
+ static node_ptr to_node_ptr (value_type &value)
+ { return pointer_traits<node_ptr>::pointer_to(value); }
+ static const_node_ptr to_node_ptr (const value_type &value)
+ { return pointer_traits<const_node_ptr>::pointer_to(value); }
+ static const pointer & to_value_ptr(const node_ptr &n) { return n; }
+ static const const_pointer &to_value_ptr(const const_node_ptr &n) { return n; }
 };
 
 } //namespace intrusive

Modified: branches/release/boost/intrusive/unordered_set_hook.hpp
==============================================================================
--- branches/release/boost/intrusive/unordered_set_hook.hpp (original)
+++ branches/release/boost/intrusive/unordered_set_hook.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -18,9 +18,10 @@
 #include <boost/intrusive/intrusive_fwd.hpp>
 #include <boost/pointer_cast.hpp>
 #include <boost/intrusive/detail/utilities.hpp>
-#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/slist_hook.hpp>
 #include <boost/intrusive/options.hpp>
+#include <boost/intrusive/pointer_traits.hpp>
 #include <boost/intrusive/detail/generic_hook.hpp>
 
 namespace boost {
@@ -32,10 +33,10 @@
 struct unordered_node
    : public slist_node<VoidPointer>
 {
- typedef typename boost::pointer_to_other
- < VoidPointer
- , unordered_node<VoidPointer, StoreHash, OptimizeMultiKey>
- >::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer
+ < unordered_node<VoidPointer, StoreHash, OptimizeMultiKey> >::type
+ node_ptr;
    node_ptr prev_in_group_;
    std::size_t hash_;
 };
@@ -44,10 +45,10 @@
 struct unordered_node<VoidPointer, false, true>
    : public slist_node<VoidPointer>
 {
- typedef typename boost::pointer_to_other
- < VoidPointer
- , unordered_node<VoidPointer, false, true>
- >::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer
+ < unordered_node<VoidPointer, false, true> >::type
+ node_ptr;
    node_ptr prev_in_group_;
 };
 
@@ -55,10 +56,10 @@
 struct unordered_node<VoidPointer, true, false>
    : public slist_node<VoidPointer>
 {
- typedef typename boost::pointer_to_other
- < VoidPointer
- , unordered_node<VoidPointer, true, false>
- >::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer
+ < unordered_node<VoidPointer, true, false> >::type
+ node_ptr;
    std::size_t hash_;
 };
 
@@ -68,35 +69,35 @@
 {
    typedef slist_node_traits<VoidPointer> reduced_slist_node_traits;
    typedef unordered_node<VoidPointer, StoreHash, OptimizeMultiKey> node;
- typedef typename boost::pointer_to_other
- <VoidPointer, node>::type node_ptr;
- typedef typename boost::pointer_to_other
- <VoidPointer, const node>::type const_node_ptr;
+
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer
+ < node >::type node_ptr;
+ typedef typename pointer_traits
+ <VoidPointer>::template rebind_pointer
+ < const node >::type const_node_ptr;
 
    static const bool store_hash = StoreHash;
    static const bool optimize_multikey = OptimizeMultiKey;
 
- static node_ptr get_next(const_node_ptr n)
+ static node_ptr get_next(const const_node_ptr & n)
    {
-// This still fails in gcc < 4.4 so forget about it
-// using ::boost::static_pointer_cast;
-// return static_pointer_cast<node>(n->next_);
- return node_ptr(&static_cast<node&>(*n->next_));
+ return pointer_traits<node_ptr>::pointer_to(static_cast<node&>(*n->next_));
    }
 
- static void set_next(node_ptr n, node_ptr next)
+ static void set_next(const node_ptr & n, const node_ptr & next)
    { n->next_ = next; }
 
- static node_ptr get_prev_in_group(const_node_ptr n)
+ static node_ptr get_prev_in_group(const const_node_ptr & n)
    { return n->prev_in_group_; }
 
- static void set_prev_in_group(node_ptr n, node_ptr prev)
+ static void set_prev_in_group(const node_ptr & n, const node_ptr & prev)
    { n->prev_in_group_ = prev; }
 
- static std::size_t get_hash(const_node_ptr n)
+ static std::size_t get_hash(const const_node_ptr & n)
    { return n->hash_; }
 
- static void set_hash(node_ptr n, std::size_t h)
+ static void set_hash(const node_ptr & n, std::size_t h)
    { n->hash_ = h; }
 };
 
@@ -107,10 +108,10 @@
    typedef typename NodeTraits::node_ptr node_ptr;
    typedef typename NodeTraits::const_node_ptr const_node_ptr;
 
- static node_ptr get_next(const_node_ptr n)
+ static node_ptr get_next(const const_node_ptr & n)
    { return NodeTraits::get_prev_in_group(n); }
 
- static void set_next(node_ptr n, node_ptr next)
+ static void set_next(const node_ptr & n, const node_ptr & next)
    { NodeTraits::set_prev_in_group(n, next); }
 };
 

Modified: branches/release/boost/move/move.hpp
==============================================================================
--- branches/release/boost/move/move.hpp (original)
+++ branches/release/boost/move/move.hpp 2011-12-26 12:10:27 EST (Mon, 26 Dec 2011)
@@ -23,9 +23,12 @@
 
 #ifdef BOOST_MSVC
    #ifndef _CRT_SECURE_NO_DEPRECATE
- #define BOOST_INTERPROCESS_CRT_SECURE_NO_DEPRECATE
- #define _CRT_SECURE_NO_DEPRECATE
- #define _SCL_SECURE_NO_WARNINGS
+ #define BOOST_INTERPROCESS_CRT_SECURE_NO_DEPRECATE
+ #define _CRT_SECURE_NO_DEPRECATE
+ #endif
+ #ifndef _SCL_SECURE_NO_WARNINGS
+ #define BOOST_INTERPROCESS_SCL_SECURE_NO_WARNINGS
+ #define _SCL_SECURE_NO_WARNINGS
    #endif
    #pragma warning (push)
    #pragma warning(disable:4996)
@@ -1080,14 +1083,112 @@
    : BOOST_MOVE_BOOST_NS::has_trivial_destructor<T>
 {};
 
+
+
+namespace move_detail {
+
+// Code from Jeffrey Lee Hellrung, many thanks
+
+#ifndef BOOST_NO_RVALUE_REFERENCES
+ template< class T> struct forward_type { typedef T type; };
+#else // #ifndef BOOST_NO_RVALUE_REFERENCES
+ template< class T>
+ struct forward_type
+ { typedef const T &type; };
+
+ template< class T>
+ struct forward_type< boost::rv<T> >
+ { typedef T type; };
+#endif // #ifndef BOOST_NO_RVALUE_REFERENCES
+
+
+
+// Code from Jeffrey Lee Hellrung, many thanks
+
+template< class T > struct is_rvalue_reference : BOOST_MOVE_BOOST_NS::integral_constant<bool, false> { };
+#ifndef BOOST_NO_RVALUE_REFERENCES
+ template< class T > struct is_rvalue_reference< T&& > : BOOST_MOVE_BOOST_NS::integral_constant<bool, true> { };
+#else // #ifndef BOOST_NO_RVALUE_REFERENCES
+ template< class T > struct is_rvalue_reference< boost::rv<T>& >
+ : BOOST_MOVE_BOOST_NS::integral_constant<bool, true>
+ {};
+
+ template< class T > struct is_rvalue_reference< const boost::rv<T>& >
+ : BOOST_MOVE_BOOST_NS::integral_constant<bool, true>
+ {};
+#endif // #ifndef BOOST_NO_RVALUE_REFERENCES
+
+#ifndef BOOST_NO_RVALUE_REFERENCES
+ template< class T > struct add_rvalue_reference { typedef T&& type; };
+#else // #ifndef BOOST_NO_RVALUE_REFERENCES
+ namespace detail_add_rvalue_reference
+ {
+ template< class T
+ , bool emulation = ::boost::has_move_emulation_enabled<T>::value
+ , bool rv = ::boost::move_detail::is_rv<T>::value >
+ struct add_rvalue_reference_impl { typedef T type; };
+
+ template< class T, bool emulation>
+ struct add_rvalue_reference_impl< T, emulation, true > { typedef T & type; };
+
+ template< class T, bool rv >
+ struct add_rvalue_reference_impl< T, true, rv > { typedef ::boost::rv<T>& type; };
+ } // namespace detail_add_rvalue_reference
+
+ template< class T >
+ struct add_rvalue_reference
+ : detail_add_rvalue_reference::add_rvalue_reference_impl<T>
+ { };
+
+ template< class T >
+ struct add_rvalue_reference<T &>
+ { typedef T & type; };
+
+#endif // #ifndef BOOST_NO_RVALUE_REFERENCES
+
+template< class T > struct remove_rvalue_reference { typedef T type; };
+
+#ifndef BOOST_NO_RVALUE_REFERENCES
+ template< class T > struct remove_rvalue_reference< T&& > { typedef T type; };
+#else // #ifndef BOOST_NO_RVALUE_REFERENCES
+ template< class T > struct remove_rvalue_reference< rv<T> > { typedef T type; };
+ template< class T > struct remove_rvalue_reference< const rv<T> > { typedef T type; };
+ template< class T > struct remove_rvalue_reference< volatile rv<T> > { typedef T type; };
+ template< class T > struct remove_rvalue_reference< const volatile rv<T> > { typedef T type; };
+ template< class T > struct remove_rvalue_reference< rv<T>& > { typedef T type; };
+ template< class T > struct remove_rvalue_reference< const rv<T>& > { typedef T type; };
+ template< class T > struct remove_rvalue_reference< volatile rv<T>& > { typedef T type; };
+ template< class T > struct remove_rvalue_reference< const volatile rv<T>& >{ typedef T type; };
+#endif // #ifndef BOOST_NO_RVALUE_REFERENCES
+
+template <typename T>
+typename boost::move_detail::add_rvalue_reference<T>::type declval();
+
+}
+// Ideas from Boost.Move review, Jeffrey Lee Hellrung:
+//
+//- TypeTraits metafunctions is_lvalue_reference, add_lvalue_reference, and remove_lvalue_reference ?
+// Perhaps add_reference and remove_reference can be modified so that they behave wrt emulated rvalue
+// references the same as wrt real rvalue references, i.e., add_reference< rv<T>& > -> T& rather than
+// rv<T>& (since T&& & -> T&).
+//
+//- Add'l TypeTraits has_[trivial_]move_{constructor,assign}...?
+//
+//- An as_lvalue(T& x) function, which amounts to an identity operation in C++0x, but strips emulated
+// rvalue references in C++03. This may be necessary to prevent "accidental moves".
+
 } //namespace boost {
 
 #if defined BOOST_MSVC
    #pragma warning (pop)
    #ifdef BOOST_INTERPROCESS_CRT_SECURE_NO_DEPRECATE
- #undef BOOST_INTERPROCESS_CRT_SECURE_NO_DEPRECATE
- #undef _CRT_SECURE_NO_DEPRECATE
- #undef _SCL_SECURE_NO_WARNINGS
+ #undef BOOST_INTERPROCESS_CRT_SECURE_NO_DEPRECATE
+ #undef _CRT_SECURE_NO_DEPRECATE
+ #endif
+
+ #ifdef BOOST_INTERPROCESS_SCL_SECURE_NO_WARNINGS
+ #undef BOOST_INTERPROCESS_SCL_SECURE_NO_WARNINGS
+ #undef _SCL_SECURE_NO_WARNINGS
    #endif
 #endif
 


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