From 22973145aaa535356598a2838c9b089d215f828b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Fri, 14 Feb 2014 23:16:48 +0100 Subject: [PATCH] Fixed stateful value traits and iterator_to. --- example/doc_stateful_value_traits.cpp | 4 ++-- include/boost/intrusive/bstree.hpp | 4 ++-- include/boost/intrusive/list.hpp | 8 ++++---- include/boost/intrusive/slist.hpp | 12 +++++------- test/generic_set_test.hpp | 6 ++++++ test/list_test.cpp | 7 +++++++ test/slist_test.cpp | 7 +++++++ test/stateful_value_traits_test.cpp | 17 +++++++++++++---- 8 files changed, 46 insertions(+), 19 deletions(-) diff --git a/example/doc_stateful_value_traits.cpp b/example/doc_stateful_value_traits.cpp index d26e8b7..2906220 100644 --- a/example/doc_stateful_value_traits.cpp +++ b/example/doc_stateful_value_traits.cpp @@ -36,11 +36,11 @@ struct stateful_value_traits {} ///Note: non static functions! - node_ptr to_node_ptr (value_type &value) + node_ptr to_node_ptr (value_type &value) const { return this->nodes_ + (&value - this->ids_); } const_node_ptr to_node_ptr (const value_type &value) const { return this->nodes_ + (&value - this->ids_); } - pointer to_value_ptr(node_ptr n) + pointer to_value_ptr(node_ptr n) const { return this->ids_ + (n - this->nodes_); } const_pointer to_value_ptr(const_node_ptr n) const { return this->ids_ + (n - this->nodes_); } diff --git a/include/boost/intrusive/bstree.hpp b/include/boost/intrusive/bstree.hpp index c0cf6b3..ecd3999 100644 --- a/include/boost/intrusive/bstree.hpp +++ b/include/boost/intrusive/bstree.hpp @@ -188,10 +188,10 @@ struct bstbase3 } iterator iterator_to(reference value) - { return iterator (value_traits::to_node_ptr(value), this->value_traits_ptr()); } + { return iterator (this->get_value_traits().to_node_ptr(value), this->value_traits_ptr()); } const_iterator iterator_to(const_reference value) const - { return const_iterator (value_traits::to_node_ptr(const_cast (value)), this->value_traits_ptr()); } + { return const_iterator (this->get_value_traits().to_node_ptr(const_cast (value)), this->value_traits_ptr()); } static void init_node(reference value) { node_algorithms::init(value_traits::to_node_ptr(value)); } diff --git a/include/boost/intrusive/list.hpp b/include/boost/intrusive/list.hpp index 0048a91..01e0b49 100644 --- a/include/boost/intrusive/list.hpp +++ b/include/boost/intrusive/list.hpp @@ -1228,8 +1228,8 @@ class list_impl //! Note: Iterators and references are not invalidated. iterator iterator_to(reference value) { - BOOST_INTRUSIVE_INVARIANT_ASSERT(!node_algorithms::inited(value_traits::to_node_ptr(value))); - return iterator(value_traits::to_node_ptr(value), value_traits_ptr()); + BOOST_INTRUSIVE_INVARIANT_ASSERT(!node_algorithms::inited(this->priv_value_traits().to_node_ptr(value))); + return iterator(this->priv_value_traits().to_node_ptr(value), value_traits_ptr()); } //! Requires: value must be a const reference to a value inserted in a list. @@ -1243,8 +1243,8 @@ class list_impl //! Note: Iterators and references are not invalidated. const_iterator iterator_to(const_reference value) const { - BOOST_INTRUSIVE_INVARIANT_ASSERT(!node_algorithms::inited(value_traits::to_node_ptr(const_cast (value)))); - return const_iterator(value_traits::to_node_ptr(const_cast (value)), value_traits_ptr()); + BOOST_INTRUSIVE_INVARIANT_ASSERT(!node_algorithms::inited(this->priv_value_traits().to_node_ptr(const_cast (value)))); + return const_iterator(this->priv_value_traits().to_node_ptr(const_cast (value)), value_traits_ptr()); } /// @cond diff --git a/include/boost/intrusive/slist.hpp b/include/boost/intrusive/slist.hpp index 1f192af..51ab1bd 100644 --- a/include/boost/intrusive/slist.hpp +++ b/include/boost/intrusive/slist.hpp @@ -1669,7 +1669,6 @@ class slist_impl static iterator s_iterator_to(reference value) { BOOST_STATIC_ASSERT((!stateful_value_traits)); - //BOOST_INTRUSIVE_INVARIANT_ASSERT (!node_algorithms::inited(value_traits::to_node_ptr(value))); return iterator (value_traits::to_node_ptr(value), const_value_traits_ptr()); } @@ -1687,8 +1686,7 @@ class slist_impl static const_iterator s_iterator_to(const_reference value) { BOOST_STATIC_ASSERT((!stateful_value_traits)); - //BOOST_INTRUSIVE_INVARIANT_ASSERT (!node_algorithms::inited(value_traits::to_node_ptr(const_cast (value)))); - return const_iterator (value_traits::to_node_ptr(const_cast (value)), const_value_traits_ptr()); + return const_iterator(value_traits::to_node_ptr(const_cast (value)), const_value_traits_ptr()); } //! Requires: value must be a reference to a value inserted in a list. @@ -1702,8 +1700,8 @@ class slist_impl //! Note: Iterators and references are not invalidated. iterator iterator_to(reference value) { - //BOOST_INTRUSIVE_INVARIANT_ASSERT (!node_algorithms::inited(value_traits::to_node_ptr(value))); - return iterator (value_traits::to_node_ptr(value), this->value_traits_ptr()); + BOOST_INTRUSIVE_INVARIANT_ASSERT(!node_algorithms::inited(this->priv_value_traits().to_node_ptr(value))); + return iterator (this->priv_value_traits().to_node_ptr(value), this->value_traits_ptr()); } //! Requires: value must be a const reference to a value inserted in a list. @@ -1717,8 +1715,8 @@ class slist_impl //! Note: Iterators and references are not invalidated. const_iterator iterator_to(const_reference value) const { - //BOOST_INTRUSIVE_INVARIANT_ASSERT (!node_algorithms::inited(value_traits::to_node_ptr(const_cast (value)))); - return const_iterator (value_traits::to_node_ptr(const_cast (value)), this->value_traits_ptr()); + BOOST_INTRUSIVE_INVARIANT_ASSERT (!node_algorithms::inited(this->priv_value_traits().to_node_ptr(const_cast (value)))); + return const_iterator(this->priv_value_traits().to_node_ptr(const_cast (value)), this->value_traits_ptr()); } //! Returns: The iterator to the element before i in the list. diff --git a/test/generic_set_test.hpp b/test/generic_set_test.hpp index 050d001..2a46ba9 100644 --- a/test/generic_set_test.hpp +++ b/test/generic_set_test.hpp @@ -172,6 +172,12 @@ void test_generic_set::test_insert(std::vector(values[2])); + BOOST_TEST (&*ic == &values[2]); + ic = set_type::s_iterator_to (const_cast(values[2])); + BOOST_TEST (&*ic == &values[2]); + testset.erase (i); { int init_values [] = { 1, 3, 5 }; TEST_INTRUSIVE_SEQUENCE( init_values, testset.begin() ); } diff --git a/test/list_test.cpp b/test/list_test.cpp index 94521c5..54d3061 100644 --- a/test/list_test.cpp +++ b/test/list_test.cpp @@ -234,6 +234,13 @@ void test_list i = list_type::s_iterator_to (values[4]); BOOST_TEST (&*i == &values[4]); + typename list_type::const_iterator ic; + ic = testlist.iterator_to (const_cast(values[4])); + BOOST_TEST (&*ic == &values[4]); + + ic = list_type::s_iterator_to (const_cast(values[4])); + BOOST_TEST (&*ic == &values[4]); + i = testlist.erase (i); BOOST_TEST (i == testlist.end()); diff --git a/test/slist_test.cpp b/test/slist_test.cpp index ac9a635..0ea0c2b 100644 --- a/test/slist_test.cpp +++ b/test/slist_test.cpp @@ -275,6 +275,13 @@ void test_slist BOOST_TEST (&*i == &values[4]); i = list_type::s_iterator_to (values[4]); BOOST_TEST (&*i == &values[4]); + + typename list_type::const_iterator ic; + ic = testlist.iterator_to (const_cast(values[4])); + BOOST_TEST (&*ic == &values[4]); + ic = list_type::s_iterator_to (const_cast(values[4])); + BOOST_TEST (&*ic == &values[4]); + i = testlist.previous (i); BOOST_TEST (&*i == &values[0]); diff --git a/test/stateful_value_traits_test.cpp b/test/stateful_value_traits_test.cpp index c5b43ba..3386c7c 100644 --- a/test/stateful_value_traits_test.cpp +++ b/test/stateful_value_traits_test.cpp @@ -57,16 +57,16 @@ struct stateful_value_traits : values_(vals), node_array_(node_array) {} - node_ptr to_node_ptr (value_type &value) + node_ptr to_node_ptr (value_type &value) const { return node_array_ + (&value - values_); } const_node_ptr to_node_ptr (const value_type &value) const { return node_array_ + (&value - values_); } - pointer to_value_ptr(node_ptr n) + pointer to_value_ptr(const node_ptr &n) const { return values_ + (n - node_array_); } - const_pointer to_value_ptr(const_node_ptr n) const + const_pointer to_value_ptr(const const_node_ptr &n) const { return values_ + (n - node_array_); } pointer values_; @@ -123,9 +123,18 @@ int main() ; it != itend ; ++it){ my_list.push_front(*it); + if(&*my_list.iterator_to(*it) != &my_list.front()) + return 1; my_slist.push_front(*it); - my_set.insert(*it); + if(&*my_slist.iterator_to(*it) != &my_slist.front()) + return 1; + Set::iterator sit = my_set.insert(*it).first; + if(&*my_set.iterator_to(*it) != &*sit) + return 1; + Uset::iterator uit = my_uset.insert(*it).first; my_uset.insert(*it); + if(&*my_uset.iterator_to(*it) != &*uit) + return 1; } //Now test lists