From 7be8c2521b49745149e9bab34540605ed1d6c761 Mon Sep 17 00:00:00 2001 From: Matei David Date: Thu, 15 May 2014 18:55:56 -0400 Subject: [PATCH] lib: core implementation of header_holder in list_impl --- include/boost/intrusive/list.hpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/include/boost/intrusive/list.hpp b/include/boost/intrusive/list.hpp index b2dfa4e..a32f53a 100644 --- a/include/boost/intrusive/list.hpp +++ b/include/boost/intrusive/list.hpp @@ -83,9 +83,12 @@ class list_impl typedef typename node_traits::node_ptr node_ptr; typedef typename node_traits::const_node_ptr const_node_ptr; typedef circular_list_algorithms node_algorithms; + typedef Header_Holder header_holder_type; static const bool constant_time_size = ConstantTimeSize; static const bool stateful_value_traits = detail::is_stateful_value_traits::value; + static const bool has_container_from_iterator = + boost::is_same< header_holder_type, detail::default_header_holder< node_traits > >::value; /// @cond @@ -103,15 +106,13 @@ class list_impl )); node_ptr get_root_node() - { return pointer_traits::pointer_to(data_.root_plus_size_.root_); } + { return data_.root_plus_size_.get_node(); } const_node_ptr get_root_node() const - { return pointer_traits::pointer_to(data_.root_plus_size_.root_); } + { return data_.root_plus_size_.get_node(); } - struct root_plus_size : public size_traits - { - node root_; - }; + struct root_plus_size : public header_holder_type, public size_traits + { }; struct data_t : public value_traits { @@ -1255,8 +1256,10 @@ class list_impl private: static list_impl &priv_container_from_end_iterator(const const_iterator &end_iterator) { - root_plus_size *r = detail::parent_from_member - ( boost::intrusive::detail::to_raw_pointer(end_iterator.pointed_node()), &root_plus_size::root_); + BOOST_STATIC_ASSERT((has_container_from_iterator)); + node_ptr p = end_iterator.pointed_node(); + header_holder_type* h = header_holder_type::get_holder(p); + root_plus_size* r = static_cast< root_plus_size* >(h); data_t *d = detail::parent_from_member ( r, &data_t::root_plus_size_); list_impl *s = detail::parent_from_member(d, &list_impl::data_);