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 a3bbc23..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, _) \ ); \ } \ @@ -361,399 +354,3 @@ struct BOOST_PP_CAT(insert_emplace_proxy_arg, N) #include #endif //#ifndef BOOST_CONTAINER_ADVANCED_INSERT_INT_HPP -/* -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Ion Gaztanaga 2008-2013. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/container for documentation. -// -////////////////////////////////////////////////////////////////////////////// - -#ifndef BOOST_CONTAINER_ADVANCED_INSERT_INT_HPP -#define BOOST_CONTAINER_ADVANCED_INSERT_INT_HPP - -#if defined(_MSC_VER) -# pragma once -#endif - -#include -#include - -#include -#include -#include -#include -#include //std::iterator_traits -#include -#include - -namespace boost { namespace container { namespace container_detail { - -template -struct move_insert_range_proxy -{ - typedef typename allocator_traits::size_type size_type; - typedef typename allocator_traits::value_type value_type; - - move_insert_range_proxy(A& a, FwdIt first) - : a_(a), first_(first) - {} - - void uninitialized_copy_n_and_update(Iterator p, size_type n) - { - this->first_ = ::boost::container::uninitialized_move_alloc_n_source - (this->a_, this->first_, n, p); - } - - void copy_n_and_update(Iterator p, size_type n) - { - this->first_ = ::boost::container::move_n_source(this->first_, n, p); - } - - A &a_; - FwdIt first_; -}; - - -template -struct insert_range_proxy -{ - typedef typename allocator_traits::size_type size_type; - typedef typename allocator_traits::value_type value_type; - - insert_range_proxy(A& a, FwdIt first) - : a_(a), first_(first) - {} - - void uninitialized_copy_n_and_update(Iterator p, size_type n) - { - this->first_ = ::boost::container::uninitialized_copy_alloc_n_source(this->a_, this->first_, n, p); - } - - void copy_n_and_update(Iterator p, size_type n) - { - this->first_ = ::boost::container::copy_n_source(this->first_, n, p); - } - - A &a_; - FwdIt first_; -}; - - -template -struct insert_n_copies_proxy -{ - typedef typename allocator_traits::size_type size_type; - typedef typename allocator_traits::value_type value_type; - - insert_n_copies_proxy(A& a, const value_type &v) - : a_(a), v_(v) - {} - - void uninitialized_copy_n_and_update(Iterator p, size_type n) const - { boost::container::uninitialized_fill_alloc_n(this->a_, v_, n, p); } - - void copy_n_and_update(Iterator p, size_type n) const - { std::fill_n(p, n, v_); } - - A &a_; - const value_type &v_; -}; - -template -struct insert_value_initialized_n_proxy -{ - typedef ::boost::container::allocator_traits alloc_traits; - typedef typename allocator_traits::size_type size_type; - typedef typename allocator_traits::value_type value_type; - - - explicit insert_value_initialized_n_proxy(A &a) - : a_(a) - {} - - void uninitialized_copy_n_and_update(Iterator p, size_type n) const - { boost::container::uninitialized_value_init_alloc_n(this->a_, n, p); } - - void copy_n_and_update(Iterator, size_type) const - { - BOOST_ASSERT(false); - } - - private: - A &a_; -}; - -template -struct insert_default_initialized_n_proxy -{ - typedef ::boost::container::allocator_traits alloc_traits; - typedef typename allocator_traits::size_type size_type; - typedef typename allocator_traits::value_type value_type; - - - explicit insert_default_initialized_n_proxy(A &a) - : a_(a) - {} - - void uninitialized_copy_n_and_update(Iterator p, size_type n) const - { boost::container::uninitialized_default_init_alloc_n(this->a_, n, p); } - - void copy_n_and_update(Iterator, size_type) const - { - BOOST_ASSERT(false); - } - - private: - A &a_; -}; - -template -struct insert_copy_proxy -{ - typedef boost::container::allocator_traits alloc_traits; - typedef typename alloc_traits::size_type size_type; - typedef typename alloc_traits::value_type value_type; - - insert_copy_proxy(A& a, const value_type &v) - : a_(a), v_(v) - {} - - void uninitialized_copy_n_and_update(Iterator p, size_type n) const - { - BOOST_ASSERT(n == 1); (void)n; - alloc_traits::construct( this->a_ - , container_detail::to_raw_pointer(&*p) - , v_ - ); - } - - void copy_n_and_update(Iterator p, size_type n) const - { - BOOST_ASSERT(n == 1); (void)n; - *p =v_; - } - - A &a_; - const value_type &v_; -}; - - -template -struct insert_move_proxy -{ - typedef boost::container::allocator_traits alloc_traits; - typedef typename alloc_traits::size_type size_type; - typedef typename alloc_traits::value_type value_type; - - insert_move_proxy(A& a, value_type &v) - : a_(a), v_(v) - {} - - void uninitialized_copy_n_and_update(Iterator p, size_type n) const - { - BOOST_ASSERT(n == 1); (void)n; - alloc_traits::construct( this->a_ - , container_detail::to_raw_pointer(&*p) - , ::boost::move(v_) - ); - } - - void copy_n_and_update(Iterator p, size_type n) const - { - BOOST_ASSERT(n == 1); (void)n; - *p = ::boost::move(v_); - } - - A &a_; - value_type &v_; -}; - -template -insert_move_proxy get_insert_value_proxy(A& a, BOOST_RV_REF(typename std::iterator_traits::value_type) v) -{ - return insert_move_proxy(a, v); -} - -template -insert_copy_proxy get_insert_value_proxy(A& a, const typename std::iterator_traits::value_type &v) -{ - return insert_copy_proxy(a, v); -} - -}}} //namespace boost { namespace container { namespace container_detail { - -#ifdef BOOST_CONTAINER_PERFECT_FORWARDING - -#include -#include -#include -//#include //For debugging purposes - -namespace boost { -namespace container { -namespace container_detail { - -template -struct insert_non_movable_emplace_proxy -{ - typedef boost::container::allocator_traits alloc_traits; - typedef typename alloc_traits::size_type size_type; - typedef typename alloc_traits::value_type value_type; - - typedef typename build_number_seq::type index_tuple_t; - - explicit insert_non_movable_emplace_proxy(A &a, Args&&... args) - : a_(a), args_(args...) - {} - - void uninitialized_copy_n_and_update(Iterator p, size_type n) - { this->priv_uninitialized_copy_some_and_update(index_tuple_t(), p, n); } - - private: - template - void priv_uninitialized_copy_some_and_update(const index_tuple&, Iterator p, size_type n) - { - BOOST_ASSERT(n == 1); (void)n; - alloc_traits::construct( this->a_ - , container_detail::to_raw_pointer(&*p) - , ::boost::forward(get(this->args_))... - ); - } - - protected: - A &a_; - tuple args_; -}; - -template -struct insert_emplace_proxy - : public insert_non_movable_emplace_proxy -{ - typedef insert_non_movable_emplace_proxy base_t; - typedef boost::container::allocator_traits alloc_traits; - typedef typename base_t::value_type value_type; - typedef typename base_t::size_type size_type; - typedef typename base_t::index_tuple_t index_tuple_t; - - explicit insert_emplace_proxy(A &a, Args&&... args) - : base_t(a, ::boost::forward(args)...) - {} - - void copy_n_and_update(Iterator p, size_type n) - { this->priv_copy_some_and_update(index_tuple_t(), p, n); } - - private: - - template - void priv_copy_some_and_update(const index_tuple&, Iterator p, size_type n) - { - BOOST_ASSERT(n ==1); (void)n; - aligned_storage::value> v; - value_type *vp = static_cast(static_cast(&v)); - alloc_traits::construct(this->a_, vp, - ::boost::forward(get(this->args_))...); - BOOST_TRY{ - *p = ::boost::move(*vp); - } - BOOST_CATCH(...){ - alloc_traits::destroy(this->a_, vp); - BOOST_RETHROW - } - BOOST_CATCH_END - alloc_traits::destroy(this->a_, vp); - } -}; - -}}} //namespace boost { namespace container { namespace container_detail { - -#else //#ifdef BOOST_CONTAINER_PERFECT_FORWARDING - -#include -#include - -namespace boost { -namespace container { -namespace container_detail { - -#define BOOST_PP_LOCAL_MACRO(N) \ -template \ -struct BOOST_PP_CAT(insert_non_movable_emplace_proxy_arg, N) \ -{ \ - typedef boost::container::allocator_traits alloc_traits; \ - typedef typename alloc_traits::size_type size_type; \ - typedef typename alloc_traits::value_type value_type; \ - \ - BOOST_PP_CAT(insert_non_movable_emplace_proxy_arg, N) \ - ( A &a BOOST_PP_ENUM_TRAILING(N, BOOST_CONTAINER_PP_PARAM_LIST, _) ) \ - : a_(a) \ - BOOST_PP_ENUM_TRAILING(N, BOOST_CONTAINER_PP_PARAM_INIT, _) \ - {} \ - \ - void uninitialized_copy_n_and_update(Iterator p, size_type n) \ - { \ - BOOST_ASSERT(n == 1); (void)n; \ - alloc_traits::construct \ - ( this->a_ \ - , container_detail::to_raw_pointer(&*p) \ - BOOST_PP_ENUM_TRAILING(N, BOOST_CONTAINER_PP_MEMBER_FORWARD, _) \ - ); \ - } \ - \ - void copy_n_and_update(Iterator, size_type) \ - { BOOST_ASSERT(false); } \ - \ - protected: \ - A &a_; \ - BOOST_PP_REPEAT(N, BOOST_CONTAINER_PP_PARAM_DEFINE, _) \ -}; \ - \ -template \ -struct BOOST_PP_CAT(insert_emplace_proxy_arg, N) \ - : BOOST_PP_CAT(insert_non_movable_emplace_proxy_arg, N) \ - < A, Iterator BOOST_PP_ENUM_TRAILING_PARAMS(N, P) > \ -{ \ - typedef BOOST_PP_CAT(insert_non_movable_emplace_proxy_arg, N) \ - base_t; \ - typedef typename base_t::value_type value_type; \ - typedef typename base_t::size_type size_type; \ - typedef boost::container::allocator_traits alloc_traits; \ - \ - BOOST_PP_CAT(insert_emplace_proxy_arg, N) \ - ( A &a BOOST_PP_ENUM_TRAILING(N, BOOST_CONTAINER_PP_PARAM_LIST, _) ) \ - : base_t(a BOOST_PP_ENUM_TRAILING(N, BOOST_CONTAINER_PP_PARAM_FORWARD, _) ) \ - {} \ - \ - void copy_n_and_update(Iterator p, size_type n) \ - { \ - BOOST_ASSERT(n == 1); (void)n; \ - aligned_storage::value> v; \ - value_type *vp = static_cast(static_cast(&v)); \ - alloc_traits::construct(this->a_, vp \ - BOOST_PP_ENUM_TRAILING(N, BOOST_CONTAINER_PP_MEMBER_FORWARD, _)); \ - BOOST_TRY{ \ - *p = ::boost::move(*vp); \ - } \ - BOOST_CATCH(...){ \ - alloc_traits::destroy(this->a_, vp); \ - BOOST_RETHROW \ - } \ - BOOST_CATCH_END \ - alloc_traits::destroy(this->a_, vp); \ - } \ -}; \ -//! -#define BOOST_PP_LOCAL_LIMITS (0, BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS) -#include BOOST_PP_LOCAL_ITERATE() - -}}} //namespace boost { namespace container { namespace container_detail { - -#endif //#ifdef BOOST_CONTAINER_PERFECT_FORWARDING - -#include - -#endif //#ifndef BOOST_CONTAINER_ADVANCED_INSERT_INT_HPP -*/ \ No newline at end of file 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/transform_iterator.hpp b/include/boost/container/detail/transform_iterator.hpp index f10f3fe..c4e746c 100644 --- a/include/boost/container/detail/transform_iterator.hpp +++ b/include/boost/container/detail/transform_iterator.hpp @@ -34,10 +34,10 @@ struct operator_arrow_proxy : m_value(px) {} + typedef PseudoReference element_type; + PseudoReference* operator->() const { return &m_value; } - // This function is needed for MWCW and BCC, which won't call operator-> - // again automatically per 13.3.1.2 para 8 -// operator T*() const { return &m_value; } + mutable PseudoReference m_value; }; @@ -48,10 +48,10 @@ struct operator_arrow_proxy : m_value(px) {} + typedef T element_type; + T* operator->() const { return const_cast(&m_value); } - // This function is needed for MWCW and BCC, which won't call operator-> - // again automatically per 13.3.1.2 para 8 -// operator T*() const { return &m_value; } + T &m_value; }; diff --git a/include/boost/container/detail/utilities.hpp b/include/boost/container/detail/utilities.hpp index 9558963..077b298 100644 --- a/include/boost/container/detail/utilities.hpp +++ b/include/boost/container/detail/utilities.hpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -159,10 +160,26 @@ inline T* to_raw_pointer(T* p) { return p; } template -inline typename Pointer::element_type* +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) @@ -398,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; } @@ -443,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; } @@ -488,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; } @@ -533,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; } @@ -578,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; } @@ -623,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; } @@ -666,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; } @@ -701,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; } @@ -737,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; } @@ -773,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; }