diff --git a/include/boost/intrusive/bstree.hpp b/include/boost/intrusive/bstree.hpp index 172598a..8720b05 100644 --- a/include/boost/intrusive/bstree.hpp +++ b/include/boost/intrusive/bstree.hpp @@ -61,18 +61,38 @@ struct bstbase3 typedef typename get_algo::type node_algorithms; typedef typename node_traits::node_ptr node_ptr; typedef typename node_traits::const_node_ptr const_node_ptr; + typedef tree_iterator iterator; + typedef tree_iterator const_iterator; + typedef boost::intrusive::detail::reverse_iterator reverse_iterator; + typedef boost::intrusive::detail::reverse_iterator const_reverse_iterator; + typedef BOOST_INTRUSIVE_IMPDEF(typename value_traits::pointer) pointer; + typedef BOOST_INTRUSIVE_IMPDEF(typename value_traits::const_pointer) const_pointer; + typedef BOOST_INTRUSIVE_IMPDEF(typename pointer_traits::element_type) value_type; + typedef BOOST_INTRUSIVE_IMPDEF(value_type) key_type; + typedef BOOST_INTRUSIVE_IMPDEF(typename pointer_traits::reference) reference; + typedef BOOST_INTRUSIVE_IMPDEF(typename pointer_traits::reference) const_reference; + typedef BOOST_INTRUSIVE_IMPDEF(typename pointer_traits::difference_type) difference_type; + typedef Header_Holder header_holder_type; + + static const bool safemode_or_autounlink = is_safe_autounlink::value; + 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; struct holder_t : public ValueTraits { explicit holder_t(const ValueTraits &vtraits) : ValueTraits(vtraits) {} - node_type root; + header_holder_type root; } holder; - static bstbase3 &get_tree_base_from_root(node_type &root) + static bstbase3 &get_tree_base_from_end_iterator(const const_iterator &end_iterator) { - holder_t *holder = get_parent_from_member(&root, &holder_t::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); + holder_t *holder = get_parent_from_member(h, &holder_t::root); bstbase3 *base = get_parent_from_member (holder, &bstbase3::holder); return *base; } @@ -84,10 +104,10 @@ struct bstbase3 } node_ptr header_ptr() - { return pointer_traits::pointer_to(this->holder.root); } + { return holder.root.get_node(); } const_node_ptr header_ptr() const - { return pointer_traits::pointer_to(this->holder.root); } + { return holder.root.get_node(); } const value_traits &get_value_traits() const { return this->holder; } @@ -101,20 +121,6 @@ struct bstbase3 const_value_traits_ptr value_traits_ptr() const { return pointer_traits::pointer_to(this->get_value_traits()); } - typedef tree_iterator iterator; - typedef tree_iterator const_iterator; - typedef boost::intrusive::detail::reverse_iterator reverse_iterator; - typedef boost::intrusive::detail::reverse_iterator const_reverse_iterator; - typedef BOOST_INTRUSIVE_IMPDEF(typename value_traits::pointer) pointer; - typedef BOOST_INTRUSIVE_IMPDEF(typename value_traits::const_pointer) const_pointer; - typedef BOOST_INTRUSIVE_IMPDEF(typename pointer_traits::element_type) value_type; - typedef BOOST_INTRUSIVE_IMPDEF(value_type) key_type; - typedef BOOST_INTRUSIVE_IMPDEF(typename pointer_traits::reference) reference; - typedef BOOST_INTRUSIVE_IMPDEF(typename pointer_traits::reference) const_reference; - typedef BOOST_INTRUSIVE_IMPDEF(typename pointer_traits::difference_type) difference_type; - static const bool safemode_or_autounlink = is_safe_autounlink::value; - static const bool stateful_value_traits = detail::is_stateful_value_traits::value; - iterator begin() { return iterator(node_algorithms::begin_node(this->header_ptr()), this->value_traits_ptr()); } @@ -776,7 +782,7 @@ class bstree_impl static bstree_impl &container_from_end_iterator(iterator end_iterator) { return static_cast - (data_type::get_tree_base_from_root(*boost::intrusive::detail::to_raw_pointer(end_iterator.pointed_node()))); + (data_type::get_tree_base_from_end_iterator(end_iterator)); } //! Precondition: end_iterator must be a valid end const_iterator @@ -790,7 +796,7 @@ class bstree_impl static const bstree_impl &container_from_end_iterator(const_iterator end_iterator) { return static_cast - (data_type::get_tree_base_from_root(*boost::intrusive::detail::to_raw_pointer(end_iterator.pointed_node()))); + (data_type::get_tree_base_from_end_iterator(end_iterator)); } //! Precondition: it must be a valid iterator