diff --git a/include/boost/container/deque.hpp b/include/boost/container/deque.hpp index 1fd2bbe..675dae6 100644 --- a/include/boost/container/deque.hpp +++ b/include/boost/container/deque.hpp @@ -1683,7 +1683,7 @@ class deque : protected deque_base for(;p != p2; ++p){ allocator_traits_type::destroy ( this->alloc() - , container_detail::to_raw_pointer(&*p) + , container_detail::to_raw_pointer(container_detail::iterator_to_pointer(p)) ); } } @@ -1693,7 +1693,7 @@ class deque : protected deque_base for(;p != p2; ++p){ allocator_traits_type::destroy ( this->alloc() - , container_detail::to_raw_pointer(&*p) + , container_detail::to_raw_pointer(container_detail::iterator_to_pointer(p)) ); } } diff --git a/include/boost/container/detail/adaptive_node_pool_impl.hpp b/include/boost/container/detail/adaptive_node_pool_impl.hpp index a289ef5..b7261bf 100644 --- a/include/boost/container/detail/adaptive_node_pool_impl.hpp +++ b/include/boost/container/detail/adaptive_node_pool_impl.hpp @@ -482,7 +482,7 @@ class private_adaptive_node_pool_impl free_nodes_iterator itf(nodes.begin()), itbf(itbb); size_type splice_node_count = size_type(-1); while(itf != ite){ - void *pElem = container_detail::to_raw_pointer(&*itf); + void *pElem = container_detail::to_raw_pointer(container_detail::iterator_to_pointer(itf)); block_info_t &block_info = *this->priv_block_from_node(pElem); BOOST_ASSERT(block_info.free_nodes.size() < m_real_num_node); ++splice_node_count; diff --git a/include/boost/container/detail/advanced_insert_int.hpp b/include/boost/container/detail/advanced_insert_int.hpp index 9bdf2ad..b9eb074 100644 --- a/include/boost/container/detail/advanced_insert_int.hpp +++ b/include/boost/container/detail/advanced_insert_int.hpp @@ -138,7 +138,7 @@ struct insert_copy_proxy void uninitialized_copy_n_and_update(A &a, Iterator p, size_type n) const { BOOST_ASSERT(n == 1); (void)n; - alloc_traits::construct( a, container_detail::to_raw_pointer(&*p), v_); + alloc_traits::construct( a, iterator_to_raw_pointer(p), v_); } void copy_n_and_update(A &, Iterator p, size_type n) const @@ -165,10 +165,7 @@ struct insert_move_proxy void uninitialized_copy_n_and_update(A &a, Iterator p, size_type n) const { BOOST_ASSERT(n == 1); (void)n; - alloc_traits::construct( a - , container_detail::to_raw_pointer(&*p) - , ::boost::move(v_) - ); + alloc_traits::construct( a, iterator_to_raw_pointer(p), ::boost::move(v_) ); } void copy_n_and_update(A &, Iterator p, size_type n) const @@ -226,10 +223,7 @@ struct insert_non_movable_emplace_proxy void priv_uninitialized_copy_some_and_update(A &a, const index_tuple&, Iterator p, size_type n) { BOOST_ASSERT(n == 1); (void)n; - alloc_traits::construct( a - , container_detail::to_raw_pointer(&*p) - , ::boost::forward(get(this->args_))... - ); + alloc_traits::construct( a, iterator_to_raw_pointer(p), ::boost::forward(get(this->args_))... ); } protected: @@ -303,8 +297,7 @@ struct BOOST_PP_CAT(insert_non_movable_emplace_proxy_arg, N) { \ BOOST_ASSERT(n == 1); (void)n; \ alloc_traits::construct \ - ( a \ - , container_detail::to_raw_pointer(&*p) \ + ( a, iterator_to_raw_pointer(p) \ BOOST_PP_ENUM_TRAILING(N, BOOST_CONTAINER_PP_MEMBER_FORWARD, _) \ ); \ } \ diff --git a/include/boost/container/detail/node_alloc_holder.hpp b/include/boost/container/detail/node_alloc_holder.hpp index a32811d..6483e96 100644 --- a/include/boost/container/detail/node_alloc_holder.hpp +++ b/include/boost/container/detail/node_alloc_holder.hpp @@ -261,7 +261,7 @@ struct node_alloc_holder Deallocator node_deallocator(NodePtr(), nalloc); container_detail::scoped_destructor sdestructor(nalloc, 0); while(n--){ - p = container_detail::to_raw_pointer(&*itbeg); + p = container_detail::to_raw_pointer(iterator_to_pointer(itbeg)); node_deallocator.set(p); ++itbeg; //This can throw diff --git a/include/boost/container/detail/utilities.hpp b/include/boost/container/detail/utilities.hpp index 2aaa855..077b298 100644 --- a/include/boost/container/detail/utilities.hpp +++ b/include/boost/container/detail/utilities.hpp @@ -164,6 +164,22 @@ inline typename boost::intrusive::pointer_traits::element_type* to_raw_pointer(const Pointer &p) { return boost::container::container_detail::to_raw_pointer(p.operator->()); } +template +inline T* iterator_to_pointer(T* i) +{ return i; } + +template +inline typename std::iterator_traits::pointer + iterator_to_pointer(const Iterator &i) +{ return i.operator->(); } + +template +inline + typename boost::intrusive::pointer_traits + ::pointer>::element_type* + iterator_to_raw_pointer(const Iterator &i) +{ return to_raw_pointer(iterator_to_pointer(i)); } + template inline void swap_alloc(AllocatorType &, AllocatorType &, container_detail::false_type) @@ -399,13 +415,13 @@ inline typename container_detail::disable_if_memtransfer_copy_constructible::construct(a, container_detail::to_raw_pointer(&*r), boost::move(*f)); + allocator_traits::construct(a, container_detail::iterator_to_raw_pointer(r), boost::move(*f)); ++f; ++r; } } BOOST_CATCH(...){ for (; back != r; ++back){ - allocator_traits::destroy(a, container_detail::to_raw_pointer(&*back)); + allocator_traits::destroy(a, container_detail::iterator_to_raw_pointer(back)); } BOOST_RETHROW; } @@ -444,13 +460,13 @@ inline typename container_detail::disable_if_memtransfer_copy_constructible::construct(a, container_detail::to_raw_pointer(&*r), boost::move(*f)); + allocator_traits::construct(a, container_detail::iterator_to_raw_pointer(r), boost::move(*f)); ++f; ++r; } } BOOST_CATCH(...){ for (; back != r; ++back){ - allocator_traits::destroy(a, container_detail::to_raw_pointer(&*back)); + allocator_traits::destroy(a, container_detail::iterator_to_raw_pointer(back)); } BOOST_RETHROW; } @@ -489,13 +505,13 @@ inline typename container_detail::disable_if_memtransfer_copy_constructible::construct(a, container_detail::to_raw_pointer(&*r), boost::move(*f)); + allocator_traits::construct(a, container_detail::iterator_to_raw_pointer(r), boost::move(*f)); ++f; ++r; } } BOOST_CATCH(...){ for (; back != r; ++back){ - allocator_traits::destroy(a, container_detail::to_raw_pointer(&*back)); + allocator_traits::destroy(a, container_detail::iterator_to_raw_pointer(back)); } BOOST_RETHROW; } @@ -534,13 +550,13 @@ inline typename container_detail::disable_if_memtransfer_copy_constructible::construct(a, container_detail::to_raw_pointer(&*r), *f); + allocator_traits::construct(a, container_detail::iterator_to_raw_pointer(r), *f); ++f; ++r; } } BOOST_CATCH(...){ for (; back != r; ++back){ - allocator_traits::destroy(a, container_detail::to_raw_pointer(&*back)); + allocator_traits::destroy(a, container_detail::iterator_to_raw_pointer(back)); } BOOST_RETHROW; } @@ -579,13 +595,13 @@ inline typename container_detail::disable_if_memtransfer_copy_constructible::construct(a, container_detail::to_raw_pointer(&*r), *f); + allocator_traits::construct(a, container_detail::iterator_to_raw_pointer(r), *f); ++f; ++r; } } BOOST_CATCH(...){ for (; back != r; ++back){ - allocator_traits::destroy(a, container_detail::to_raw_pointer(&*back)); + allocator_traits::destroy(a, container_detail::iterator_to_raw_pointer(back)); } BOOST_RETHROW; } @@ -624,13 +640,13 @@ inline typename container_detail::disable_if_memtransfer_copy_constructible::construct(a, container_detail::to_raw_pointer(&*r), *f); + allocator_traits::construct(a, container_detail::iterator_to_raw_pointer(r), *f); ++f; ++r; } } BOOST_CATCH(...){ for (; back != r; ++back){ - allocator_traits::destroy(a, container_detail::to_raw_pointer(&*back)); + allocator_traits::destroy(a, container_detail::iterator_to_raw_pointer(back)); } BOOST_RETHROW; } @@ -667,13 +683,13 @@ inline F uninitialized_value_init_alloc_n(A &a, typename allocator_traits::di F back = r; BOOST_TRY{ while (n--) { - allocator_traits::construct(a, container_detail::to_raw_pointer(&*r)); + allocator_traits::construct(a, container_detail::iterator_to_raw_pointer(r)); ++r; } } BOOST_CATCH(...){ for (; back != r; ++back){ - allocator_traits::destroy(a, container_detail::to_raw_pointer(&*back)); + allocator_traits::destroy(a, container_detail::iterator_to_raw_pointer(back)); } BOOST_RETHROW; } @@ -702,13 +718,13 @@ inline F uninitialized_default_init_alloc_n(A &a, typename allocator_traits:: F back = r; BOOST_TRY{ while (n--) { - allocator_traits::construct(a, container_detail::to_raw_pointer(&*r), default_init); + allocator_traits::construct(a, container_detail::iterator_to_raw_pointer(r), default_init); ++r; } } BOOST_CATCH(...){ for (; back != r; ++back){ - allocator_traits::destroy(a, container_detail::to_raw_pointer(&*back)); + allocator_traits::destroy(a, container_detail::iterator_to_raw_pointer(back)); } BOOST_RETHROW; } @@ -738,13 +754,13 @@ inline void uninitialized_fill_alloc(A &a, F f, F l, const T &t) F back = f; BOOST_TRY{ while (f != l) { - allocator_traits::construct(a, container_detail::to_raw_pointer(&*f), t); + allocator_traits::construct(a, container_detail::iterator_to_raw_pointer(f), t); ++f; } } BOOST_CATCH(...){ for (; back != l; ++back){ - allocator_traits::destroy(a, container_detail::to_raw_pointer(&*back)); + allocator_traits::destroy(a, container_detail::iterator_to_raw_pointer(back)); } BOOST_RETHROW; } @@ -774,13 +790,13 @@ inline F uninitialized_fill_alloc_n(A &a, const T &v, typename allocator_traits< F back = r; BOOST_TRY{ while (n--) { - allocator_traits::construct(a, container_detail::to_raw_pointer(&*r), v); + allocator_traits::construct(a, container_detail::iterator_to_raw_pointer(r), v); ++r; } } BOOST_CATCH(...){ for (; back != r; ++back){ - allocator_traits::destroy(a, container_detail::to_raw_pointer(&*back)); + allocator_traits::destroy(a, container_detail::iterator_to_raw_pointer(back)); } BOOST_RETHROW; }