From 819b365f5e8dc389449d3f1561ee0d9e6b24bfea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Mon, 16 Jun 2014 00:23:19 +0200 Subject: [PATCH] Fixed unqualified iterator_to_pointer & to_raw_pointer calls that were causing compilation problems due to ADL. --- include/boost/container/detail/utilities.hpp | 10 ++-- include/boost/container/stable_vector.hpp | 55 ++++++-------------- include/boost/container/vector.hpp | 7 +-- 3 files changed, 23 insertions(+), 49 deletions(-) diff --git a/include/boost/container/detail/utilities.hpp b/include/boost/container/detail/utilities.hpp index 1baf0ce..d9ebacd 100644 --- a/include/boost/container/detail/utilities.hpp +++ b/include/boost/container/detail/utilities.hpp @@ -182,7 +182,7 @@ inline typename boost::intrusive::pointer_traits ::pointer>::element_type* iterator_to_raw_pointer(const Iterator &i) -{ return to_raw_pointer(iterator_to_pointer(i)); } +{ return (to_raw_pointer)((iterator_to_pointer)(i)); } template @@ -352,7 +352,7 @@ inline F memmove(I f, I l, F r) BOOST_CONTAINER_NOEXCEPT { typedef typename std::iterator_traits::value_type value_type; typename std::iterator_traits::difference_type n = std::distance(f, l); - ::memmove(iterator_to_raw_pointer(r), iterator_to_raw_pointer(f), sizeof(value_type)*n); + ::memmove((iterator_to_raw_pointer)(r), (iterator_to_raw_pointer)(f), sizeof(value_type)*n); std::advance(r, n); return r; } @@ -363,7 +363,7 @@ template F memmove_n(I f, typename std::iterator_traits::difference_type n, F r) BOOST_CONTAINER_NOEXCEPT { typedef typename std::iterator_traits::value_type value_type; - ::memmove(iterator_to_raw_pointer(r), iterator_to_raw_pointer(f), sizeof(value_type)*n); + ::memmove((iterator_to_raw_pointer)(r), (iterator_to_raw_pointer)(f), sizeof(value_type)*n); std::advance(r, n); return r; } @@ -374,7 +374,7 @@ template I memmove_n_source(I f, typename std::iterator_traits::difference_type n, F r) BOOST_CONTAINER_NOEXCEPT { typedef typename std::iterator_traits::value_type value_type; - ::memmove(iterator_to_raw_pointer(r), iterator_to_raw_pointer(f), sizeof(value_type)*n); + ::memmove((iterator_to_raw_pointer)(r), (iterator_to_raw_pointer)(f), sizeof(value_type)*n); std::advance(f, n); return f; } @@ -385,7 +385,7 @@ template I memmove_n_source_dest(I f, typename std::iterator_traits::difference_type n, F &r) BOOST_CONTAINER_NOEXCEPT { typedef typename std::iterator_traits::value_type value_type; - ::memmove(iterator_to_raw_pointer(r), iterator_to_raw_pointer(f), sizeof(value_type)*n); + ::memmove((iterator_to_raw_pointer)(r), (iterator_to_raw_pointer)(f), sizeof(value_type)*n); std::advance(f, n); std::advance(r, n); return f; diff --git a/include/boost/container/stable_vector.hpp b/include/boost/container/stable_vector.hpp index 75b4538..5348b93 100644 --- a/include/boost/container/stable_vector.hpp +++ b/include/boost/container/stable_vector.hpp @@ -235,11 +235,8 @@ class stable_vector_iterator rebind_pointer::type , Pointer >::type pointer; - typedef typename ::boost::container::container_detail::if_c - < IsConst - , const value_type& - , value_type& - >::type reference; + typedef boost::intrusive::pointer_traits ptr_traits; + typedef typename ptr_traits::reference reference; private: typedef typename non_const_ptr_traits::template @@ -255,11 +252,11 @@ class stable_vector_iterator typedef typename non_const_ptr_traits::template rebind_pointer::type node_base_ptr_ptr; - node_ptr m_pn; + node_base_ptr m_pn; public: - explicit stable_vector_iterator(node_ptr p) BOOST_CONTAINER_NOEXCEPT + explicit stable_vector_iterator(node_base_ptr p) BOOST_CONTAINER_NOEXCEPT : m_pn(p) {} @@ -270,30 +267,22 @@ class stable_vector_iterator : m_pn(other.node_pointer()) {} - node_ptr &node_pointer() BOOST_CONTAINER_NOEXCEPT - { return m_pn; } - - const node_ptr &node_pointer() const BOOST_CONTAINER_NOEXCEPT - { return m_pn; } + node_ptr node_pointer() const BOOST_CONTAINER_NOEXCEPT + { return node_ptr_traits::static_cast_from(m_pn); } public: //Pointer like operators reference operator*() const BOOST_CONTAINER_NOEXCEPT - { return m_pn->value; } + { return node_pointer()->value; } pointer operator->() const BOOST_CONTAINER_NOEXCEPT - { - typedef boost::intrusive::pointer_traits ptr_traits; - return ptr_traits::pointer_to(this->operator*()); - } + { return ptr_traits::pointer_to(this->operator*()); } //Increment / Decrement stable_vector_iterator& operator++() BOOST_CONTAINER_NOEXCEPT { - if(node_base_ptr_ptr p = this->m_pn->up){ - ++p; - this->m_pn = node_ptr_traits::static_cast_from(*p); - } + node_base_ptr_ptr p(this->m_pn->up); + this->m_pn = *(++p); return *this; } @@ -302,10 +291,8 @@ class stable_vector_iterator stable_vector_iterator& operator--() BOOST_CONTAINER_NOEXCEPT { - if(node_base_ptr_ptr p = this->m_pn->up){ - --p; - this->m_pn = node_ptr_traits::static_cast_from(*p); - } + node_base_ptr_ptr p(this->m_pn->up); + this->m_pn = *(--p); return *this; } @@ -313,18 +300,11 @@ class stable_vector_iterator { stable_vector_iterator tmp(*this); --*this; return stable_vector_iterator(tmp); } reference operator[](difference_type off) const BOOST_CONTAINER_NOEXCEPT - { - stable_vector_iterator tmp(*this); - tmp += off; - return *tmp; - } + { return node_ptr_traits::static_cast_from(this->m_pn->up[off])->value; } stable_vector_iterator& operator+=(difference_type off) BOOST_CONTAINER_NOEXCEPT { - if(node_base_ptr_ptr p = this->m_pn->up){ - p += off; - this->m_pn = node_ptr_traits::static_cast_from(*p); - } + if(off) this->m_pn = this->m_pn->up[off]; return *this; } @@ -1757,11 +1737,8 @@ class stable_vector return ret; } - node_ptr priv_get_end_node() const - { - return node_ptr_traits::pointer_to - (static_cast(const_cast(this->internal_data.end_node))); - } + node_base_ptr priv_get_end_node() const + { return node_base_ptr_traits::pointer_to(const_cast(this->internal_data.end_node)); } void priv_destroy_node(const node_type &n) { diff --git a/include/boost/container/vector.hpp b/include/boost/container/vector.hpp index ed198d8..16f52d3 100644 --- a/include/boost/container/vector.hpp +++ b/include/boost/container/vector.hpp @@ -74,11 +74,8 @@ class vec_iterator rebind_pointer::type , Pointer >::type pointer; - typedef typename if_c - < IsConst - , const value_type& - , value_type& - >::type reference; + typedef typename boost::intrusive::pointer_traits ptr_traits; + typedef typename ptr_traits::reference reference; #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED private: