diff options
Diffstat (limited to 'boost/container/detail/advanced_insert_int.hpp')
-rw-r--r-- | boost/container/detail/advanced_insert_int.hpp | 263 |
1 files changed, 119 insertions, 144 deletions
diff --git a/boost/container/detail/advanced_insert_int.hpp b/boost/container/detail/advanced_insert_int.hpp index 585b8ce0ef..0238805db2 100644 --- a/boost/container/detail/advanced_insert_int.hpp +++ b/boost/container/detail/advanced_insert_int.hpp @@ -36,30 +36,32 @@ #include <boost/move/detail/fwd_macros.hpp> #endif // move + #include <boost/move/utility_core.hpp> +#include <boost/move/detail/force_ptr.hpp> // other #include <boost/assert.hpp> -#include <boost/core/no_exceptions_support.hpp> namespace boost { namespace container { namespace dtl { -template<class Allocator, class FwdIt, class Iterator> +template<class Allocator, class FwdIt> struct move_insert_range_proxy { - typedef typename allocator_traits<Allocator>::size_type size_type; typedef typename allocator_traits<Allocator>::value_type value_type; BOOST_CONTAINER_FORCEINLINE explicit move_insert_range_proxy(FwdIt first) : first_(first) {} - BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) + template<class Iterator> + BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, std::size_t n) { this->first_ = ::boost::container::uninitialized_move_alloc_n_source (a, this->first_, n, p); } - BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, size_type n) + template<class Iterator> + BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, std::size_t n) { this->first_ = ::boost::container::move_n_source(this->first_, n, p); } @@ -68,22 +70,23 @@ struct move_insert_range_proxy }; -template<class Allocator, class FwdIt, class Iterator> +template<class Allocator, class FwdIt> struct insert_range_proxy { - typedef typename allocator_traits<Allocator>::size_type size_type; typedef typename allocator_traits<Allocator>::value_type value_type; BOOST_CONTAINER_FORCEINLINE explicit insert_range_proxy(FwdIt first) : first_(first) {} - BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) + template<class Iterator> + BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, std::size_t n) { this->first_ = ::boost::container::uninitialized_copy_alloc_n_source(a, this->first_, n, p); } - BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, size_type n) + template<class Iterator> + BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, std::size_t n) { this->first_ = ::boost::container::copy_n_source(this->first_, n, p); } @@ -92,20 +95,21 @@ struct insert_range_proxy }; -template<class Allocator, class Iterator> +template<class Allocator> struct insert_n_copies_proxy { - typedef typename allocator_traits<Allocator>::size_type size_type; typedef typename allocator_traits<Allocator>::value_type value_type; BOOST_CONTAINER_FORCEINLINE explicit insert_n_copies_proxy(const value_type &v) : v_(v) {} - BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const + template<class Iterator> + BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, std::size_t n) const { boost::container::uninitialized_fill_alloc_n(a, v_, n, p); } - BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, size_type n) const + template<class Iterator> + BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, std::size_t n) const { while (n){ --n; @@ -117,24 +121,25 @@ struct insert_n_copies_proxy const value_type &v_; }; -template<class Allocator, class Iterator> +template<class Allocator> struct insert_value_initialized_n_proxy { typedef ::boost::container::allocator_traits<Allocator> alloc_traits; - typedef typename allocator_traits<Allocator>::size_type size_type; typedef typename allocator_traits<Allocator>::value_type value_type; typedef typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type storage_t; - BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const + template<class Iterator> + BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, std::size_t n) const { boost::container::uninitialized_value_init_alloc_n(a, n, p); } - void copy_n_and_update(Allocator &a, Iterator p, size_type n) const + template<class Iterator> + void copy_n_and_update(Allocator &a, Iterator p, std::size_t n) const { while (n){ --n; storage_t v; - value_type *vp = reinterpret_cast<value_type *>(v.data); - alloc_traits::construct(a, vp); + alloc_traits::construct(a, move_detail::force_ptr<value_type *>(&v)); + value_type *vp = move_detail::force_ptr<value_type *>(&v); value_destructor<Allocator> on_exit(a, *vp); (void)on_exit; *p = ::boost::move(*vp); ++p; @@ -142,25 +147,26 @@ struct insert_value_initialized_n_proxy } }; -template<class Allocator, class Iterator> +template<class Allocator> struct insert_default_initialized_n_proxy { typedef ::boost::container::allocator_traits<Allocator> alloc_traits; - typedef typename allocator_traits<Allocator>::size_type size_type; typedef typename allocator_traits<Allocator>::value_type value_type; typedef typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type storage_t; - BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const + template<class Iterator> + BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, std::size_t n) const { boost::container::uninitialized_default_init_alloc_n(a, n, p); } - void copy_n_and_update(Allocator &a, Iterator p, size_type n) const + template<class Iterator> + void copy_n_and_update(Allocator &a, Iterator p, std::size_t n) const { if(!is_pod<value_type>::value){ while (n){ --n; typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v; - value_type *vp = reinterpret_cast<value_type *>(v.data); - alloc_traits::construct(a, vp, default_init); + alloc_traits::construct(a, move_detail::force_ptr<value_type *>(&v), default_init); + value_type *vp = move_detail::force_ptr<value_type *>(&v); value_destructor<Allocator> on_exit(a, *vp); (void)on_exit; *p = ::boost::move(*vp); ++p; @@ -169,11 +175,10 @@ struct insert_default_initialized_n_proxy } }; -template<class Allocator, class Iterator> +template<class Allocator> struct insert_copy_proxy { typedef boost::container::allocator_traits<Allocator> alloc_traits; - typedef typename alloc_traits::size_type size_type; typedef typename alloc_traits::value_type value_type; static const bool single_value = true; @@ -182,13 +187,15 @@ struct insert_copy_proxy : v_(v) {} - BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const + template<class Iterator> + BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, std::size_t n) const { BOOST_ASSERT(n == 1); (void)n; alloc_traits::construct( a, boost::movelib::iterator_to_raw_pointer(p), v_); } - BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, size_type n) const + template<class Iterator> + BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, std::size_t n) const { BOOST_ASSERT(n == 1); (void)n; *p = v_; @@ -198,11 +205,10 @@ struct insert_copy_proxy }; -template<class Allocator, class Iterator> +template<class Allocator> struct insert_move_proxy { typedef boost::container::allocator_traits<Allocator> alloc_traits; - typedef typename alloc_traits::size_type size_type; typedef typename alloc_traits::value_type value_type; static const bool single_value = true; @@ -211,13 +217,15 @@ struct insert_move_proxy : v_(v) {} - BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const + template<class Iterator> + BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, std::size_t n) const { BOOST_ASSERT(n == 1); (void)n; alloc_traits::construct( a, boost::movelib::iterator_to_raw_pointer(p), ::boost::move(v_) ); } - BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, size_type n) const + template<class Iterator> + BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, std::size_t n) const { BOOST_ASSERT(n == 1); (void)n; *p = ::boost::move(v_); @@ -227,15 +235,15 @@ struct insert_move_proxy }; template<class It, class Allocator> -BOOST_CONTAINER_FORCEINLINE insert_move_proxy<Allocator, It> get_insert_value_proxy(BOOST_RV_REF(typename boost::container::iterator_traits<It>::value_type) v) +BOOST_CONTAINER_FORCEINLINE insert_move_proxy<Allocator> get_insert_value_proxy(BOOST_RV_REF(typename boost::container::iterator_traits<It>::value_type) v) { - return insert_move_proxy<Allocator, It>(v); + return insert_move_proxy<Allocator>(v); } template<class It, class Allocator> -BOOST_CONTAINER_FORCEINLINE insert_copy_proxy<Allocator, It> get_insert_value_proxy(const typename boost::container::iterator_traits<It>::value_type &v) +BOOST_CONTAINER_FORCEINLINE insert_copy_proxy<Allocator> get_insert_value_proxy(const typename boost::container::iterator_traits<It>::value_type &v) { - return insert_copy_proxy<Allocator, It>(v); + return insert_copy_proxy<Allocator>(v); } }}} //namespace boost { namespace container { namespace dtl { @@ -249,11 +257,10 @@ namespace boost { namespace container { namespace dtl { -template<class Allocator, class Iterator, class ...Args> +template<class Allocator, class ...Args> struct insert_nonmovable_emplace_proxy { typedef boost::container::allocator_traits<Allocator> alloc_traits; - typedef typename alloc_traits::size_type size_type; typedef typename alloc_traits::value_type value_type; typedef typename build_number_seq<sizeof...(Args)>::type index_tuple_t; @@ -263,12 +270,13 @@ struct insert_nonmovable_emplace_proxy : args_(args...) {} - BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) + template<class Iterator> + BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, std::size_t n) { this->priv_uninitialized_copy_some_and_update(a, index_tuple_t(), p, n); } private: - template<std::size_t ...IdxPack> - BOOST_CONTAINER_FORCEINLINE void priv_uninitialized_copy_some_and_update(Allocator &a, const index_tuple<IdxPack...>&, Iterator p, size_type n) + template<std::size_t ...IdxPack, class Iterator> + BOOST_CONTAINER_FORCEINLINE void priv_uninitialized_copy_some_and_update(Allocator &a, const index_tuple<IdxPack...>&, Iterator p, std::size_t n) { BOOST_ASSERT(n == 1); (void)n; alloc_traits::construct( a, boost::movelib::iterator_to_raw_pointer(p), ::boost::forward<Args>(get<IdxPack>(this->args_))... ); @@ -278,14 +286,13 @@ struct insert_nonmovable_emplace_proxy tuple<Args&...> args_; }; -template<class Allocator, class Iterator, class ...Args> +template<class Allocator, class ...Args> struct insert_emplace_proxy - : public insert_nonmovable_emplace_proxy<Allocator, Iterator, Args...> + : public insert_nonmovable_emplace_proxy<Allocator, Args...> { - typedef insert_nonmovable_emplace_proxy<Allocator, Iterator, Args...> base_t; + typedef insert_nonmovable_emplace_proxy<Allocator, Args...> base_t; typedef boost::container::allocator_traits<Allocator> 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; static const bool single_value = true; @@ -294,80 +301,81 @@ struct insert_emplace_proxy : base_t(::boost::forward<Args>(args)...) {} - BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &a, Iterator p, size_type n) + template<class Iterator> + BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &a, Iterator p, std::size_t n) { this->priv_copy_some_and_update(a, index_tuple_t(), p, n); } private: - template<std::size_t ...IdxPack> - BOOST_CONTAINER_FORCEINLINE void priv_copy_some_and_update(Allocator &a, const index_tuple<IdxPack...>&, Iterator p, size_type n) + template<std::size_t ...IdxPack, class Iterator> + BOOST_CONTAINER_FORCEINLINE void priv_copy_some_and_update(Allocator &a, const index_tuple<IdxPack...>&, Iterator p, std::size_t n) { BOOST_ASSERT(n ==1); (void)n; typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v; - value_type *vp = reinterpret_cast<value_type *>(v.data); - alloc_traits::construct(a, vp, ::boost::forward<Args>(get<IdxPack>(this->args_))...); - BOOST_TRY{ + alloc_traits::construct(a, move_detail::force_ptr<value_type *>(&v), ::boost::forward<Args>(get<IdxPack>(this->args_))...); + value_type *vp = move_detail::force_ptr<value_type *>(&v); + BOOST_CONTAINER_TRY{ *p = ::boost::move(*vp); } - BOOST_CATCH(...){ + BOOST_CONTAINER_CATCH(...){ alloc_traits::destroy(a, vp); - BOOST_RETHROW + BOOST_CONTAINER_RETHROW } - BOOST_CATCH_END + BOOST_CONTAINER_CATCH_END alloc_traits::destroy(a, vp); } }; //Specializations to avoid an unneeded temporary when emplacing from a single argument o type value_type -template<class Allocator, class Iterator> -struct insert_emplace_proxy<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type> - : public insert_move_proxy<Allocator, Iterator> +template<class Allocator> +struct insert_emplace_proxy<Allocator, typename boost::container::allocator_traits<Allocator>::value_type> + : public insert_move_proxy<Allocator> { static const bool single_value = true; BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy(typename boost::container::allocator_traits<Allocator>::value_type &&v) - : insert_move_proxy<Allocator, Iterator>(v) + : insert_move_proxy<Allocator>(v) {} }; //We use "add_const" here as adding "const" only confuses MSVC12(and maybe later) provoking //compiler error C2752 ("more than one partial specialization matches"). //Any problem is solvable with an extra layer of indirection? ;-) -template<class Allocator, class Iterator> -struct insert_emplace_proxy<Allocator, Iterator +template<class Allocator> +struct insert_emplace_proxy<Allocator , typename boost::container::dtl::add_const<typename boost::container::allocator_traits<Allocator>::value_type>::type > - : public insert_copy_proxy<Allocator, Iterator> + : public insert_copy_proxy<Allocator> { static const bool single_value = true; BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy(const typename boost::container::allocator_traits<Allocator>::value_type &v) - : insert_copy_proxy<Allocator, Iterator>(v) + : insert_copy_proxy<Allocator>(v) {} }; -template<class Allocator, class Iterator> -struct insert_emplace_proxy<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type &> - : public insert_copy_proxy<Allocator, Iterator> +template<class Allocator> +struct insert_emplace_proxy<Allocator, typename boost::container::allocator_traits<Allocator>::value_type &> + : public insert_copy_proxy<Allocator> { static const bool single_value = true; BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy(const typename boost::container::allocator_traits<Allocator>::value_type &v) - : insert_copy_proxy<Allocator, Iterator>(v) + : insert_copy_proxy<Allocator>(v) {} }; -template<class Allocator, class Iterator> -struct insert_emplace_proxy<Allocator, Iterator +template<class Allocator> +struct insert_emplace_proxy<Allocator , typename boost::container::dtl::add_const<typename boost::container::allocator_traits<Allocator>::value_type>::type & > - : public insert_copy_proxy<Allocator, Iterator> + : public insert_copy_proxy<Allocator> { static const bool single_value = true; BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy(const typename boost::container::allocator_traits<Allocator>::value_type &v) - : insert_copy_proxy<Allocator, Iterator>(v) + : insert_copy_proxy<Allocator>(v) {} }; @@ -382,11 +390,10 @@ namespace container { namespace dtl { #define BOOST_CONTAINER_ADVANCED_INSERT_INT_CODE(N) \ -template< class Allocator, class Iterator BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\ +template< class Allocator BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\ struct insert_nonmovable_emplace_proxy##N\ {\ typedef boost::container::allocator_traits<Allocator> alloc_traits;\ - typedef typename alloc_traits::size_type size_type;\ typedef typename alloc_traits::value_type value_type;\ \ static const bool single_value = true;\ @@ -394,27 +401,28 @@ struct insert_nonmovable_emplace_proxy##N\ BOOST_CONTAINER_FORCEINLINE explicit insert_nonmovable_emplace_proxy##N(BOOST_MOVE_UREF##N)\ BOOST_MOVE_COLON##N BOOST_MOVE_FWD_INIT##N {}\ \ - BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n)\ + template<class Iterator>\ + BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, std::size_t n)\ {\ BOOST_ASSERT(n == 1); (void)n;\ alloc_traits::construct(a, boost::movelib::iterator_to_raw_pointer(p) BOOST_MOVE_I##N BOOST_MOVE_MFWD##N);\ }\ \ - BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator, size_type)\ + template<class Iterator>\ + BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator, std::size_t)\ { BOOST_ASSERT(false); }\ \ protected:\ BOOST_MOVE_MREF##N\ };\ \ -template< class Allocator, class Iterator BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\ +template< class Allocator BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\ struct insert_emplace_proxy_arg##N\ - : insert_nonmovable_emplace_proxy##N< Allocator, Iterator BOOST_MOVE_I##N BOOST_MOVE_TARG##N >\ + : insert_nonmovable_emplace_proxy##N< Allocator BOOST_MOVE_I##N BOOST_MOVE_TARG##N >\ {\ typedef insert_nonmovable_emplace_proxy##N\ - < Allocator, Iterator BOOST_MOVE_I##N BOOST_MOVE_TARG##N > base_t;\ + < Allocator BOOST_MOVE_I##N BOOST_MOVE_TARG##N > base_t;\ typedef typename base_t::value_type value_type;\ - typedef typename base_t::size_type size_type;\ typedef boost::container::allocator_traits<Allocator> alloc_traits;\ \ static const bool single_value = true;\ @@ -422,20 +430,21 @@ struct insert_emplace_proxy_arg##N\ BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg##N(BOOST_MOVE_UREF##N)\ : base_t(BOOST_MOVE_FWD##N){}\ \ - BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &a, Iterator p, size_type n)\ + template<class Iterator>\ + BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &a, Iterator p, std::size_t n)\ {\ BOOST_ASSERT(n == 1); (void)n;\ typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v;\ - value_type *vp = reinterpret_cast<value_type *>(v.data);\ - alloc_traits::construct(a, vp BOOST_MOVE_I##N BOOST_MOVE_MFWD##N);\ - BOOST_TRY{\ + alloc_traits::construct(a, move_detail::force_ptr<value_type *>(&v) BOOST_MOVE_I##N BOOST_MOVE_MFWD##N);\ + value_type *vp = move_detail::force_ptr<value_type *>(&v);\ + BOOST_CONTAINER_TRY{\ *p = ::boost::move(*vp);\ }\ - BOOST_CATCH(...){\ + BOOST_CONTAINER_CATCH(...){\ alloc_traits::destroy(a, vp);\ - BOOST_RETHROW\ + BOOST_CONTAINER_RETHROW\ }\ - BOOST_CATCH_END\ + BOOST_CONTAINER_CATCH_END\ alloc_traits::destroy(a, vp);\ }\ };\ @@ -446,79 +455,79 @@ BOOST_MOVE_ITERATE_0TO9(BOOST_CONTAINER_ADVANCED_INSERT_INT_CODE) #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) //Specializations to avoid an unneeded temporary when emplacing from a single argument o type value_type -template<class Allocator, class Iterator> -struct insert_emplace_proxy_arg1<Allocator, Iterator, ::boost::rv<typename boost::container::allocator_traits<Allocator>::value_type> > - : public insert_move_proxy<Allocator, Iterator> +template<class Allocator> +struct insert_emplace_proxy_arg1<Allocator, ::boost::rv<typename boost::container::allocator_traits<Allocator>::value_type> > + : public insert_move_proxy<Allocator> { static const bool single_value = true; BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg1(typename boost::container::allocator_traits<Allocator>::value_type &v) - : insert_move_proxy<Allocator, Iterator>(v) + : insert_move_proxy<Allocator>(v) {} }; -template<class Allocator, class Iterator> -struct insert_emplace_proxy_arg1<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type> - : public insert_copy_proxy<Allocator, Iterator> +template<class Allocator> +struct insert_emplace_proxy_arg1<Allocator, typename boost::container::allocator_traits<Allocator>::value_type> + : public insert_copy_proxy<Allocator> { static const bool single_value = true; BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v) - : insert_copy_proxy<Allocator, Iterator>(v) + : insert_copy_proxy<Allocator>(v) {} }; #else //e.g. MSVC10 & MSVC11 //Specializations to avoid an unneeded temporary when emplacing from a single argument o type value_type -template<class Allocator, class Iterator> -struct insert_emplace_proxy_arg1<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type> - : public insert_move_proxy<Allocator, Iterator> +template<class Allocator> +struct insert_emplace_proxy_arg1<Allocator, typename boost::container::allocator_traits<Allocator>::value_type> + : public insert_move_proxy<Allocator> { static const bool single_value = true; BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg1(typename boost::container::allocator_traits<Allocator>::value_type &&v) - : insert_move_proxy<Allocator, Iterator>(v) + : insert_move_proxy<Allocator>(v) {} }; //We use "add_const" here as adding "const" only confuses MSVC10&11 provoking //compiler error C2752 ("more than one partial specialization matches"). //Any problem is solvable with an extra layer of indirection? ;-) -template<class Allocator, class Iterator> -struct insert_emplace_proxy_arg1<Allocator, Iterator +template<class Allocator> +struct insert_emplace_proxy_arg1<Allocator , typename boost::container::dtl::add_const<typename boost::container::allocator_traits<Allocator>::value_type>::type > - : public insert_copy_proxy<Allocator, Iterator> + : public insert_copy_proxy<Allocator> { static const bool single_value = true; BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v) - : insert_copy_proxy<Allocator, Iterator>(v) + : insert_copy_proxy<Allocator>(v) {} }; -template<class Allocator, class Iterator> -struct insert_emplace_proxy_arg1<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type &> - : public insert_copy_proxy<Allocator, Iterator> +template<class Allocator> +struct insert_emplace_proxy_arg1<Allocator, typename boost::container::allocator_traits<Allocator>::value_type &> + : public insert_copy_proxy<Allocator> { static const bool single_value = true; BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v) - : insert_copy_proxy<Allocator, Iterator>(v) + : insert_copy_proxy<Allocator>(v) {} }; -template<class Allocator, class Iterator> -struct insert_emplace_proxy_arg1<Allocator, Iterator +template<class Allocator> +struct insert_emplace_proxy_arg1<Allocator , typename boost::container::dtl::add_const<typename boost::container::allocator_traits<Allocator>::value_type>::type & > - : public insert_copy_proxy<Allocator, Iterator> + : public insert_copy_proxy<Allocator> { static const bool single_value = true; BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v) - : insert_copy_proxy<Allocator, Iterator>(v) + : insert_copy_proxy<Allocator>(v) {} }; @@ -528,40 +537,6 @@ struct insert_emplace_proxy_arg1<Allocator, Iterator #endif // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) -namespace boost { namespace container { namespace dtl { - -template <class T> -struct has_single_value -{ - private: - struct two {char array_[2];}; - template<bool Arg> struct wrapper; - template <class U> static two test(int, ...); - template <class U> static char test(int, const wrapper<U::single_value>*); - public: - static const bool value = sizeof(test<T>(0, 0)) == 1; - void dummy(){} -}; - -template<class InsertionProxy, bool = has_single_value<InsertionProxy>::value> -struct is_single_value_proxy_impl -{ - static const bool value = InsertionProxy::single_value; -}; - -template<class InsertionProxy> -struct is_single_value_proxy_impl<InsertionProxy, false> -{ - static const bool value = false; -}; - -template<class InsertionProxy> -struct is_single_value_proxy - : is_single_value_proxy_impl<InsertionProxy> -{}; - -}}} //namespace boost { namespace container { namespace dtl { - #include <boost/container/detail/config_end.hpp> #endif //#ifndef BOOST_CONTAINER_ADVANCED_INSERT_INT_HPP |