mirror of
https://github.com/boostorg/container.git
synced 2025-08-01 13:34:30 +02:00
Add BOOST_CONTAINER_FORCEINLINE to trivial functions and add is_single_value_proxy attribute to single value proxies. This trait can be used by insertion functions to optimize operations at compile time.
This commit is contained in:
@@ -49,17 +49,17 @@ struct move_insert_range_proxy
|
|||||||
typedef typename allocator_traits<Allocator>::size_type size_type;
|
typedef typename allocator_traits<Allocator>::size_type size_type;
|
||||||
typedef typename allocator_traits<Allocator>::value_type value_type;
|
typedef typename allocator_traits<Allocator>::value_type value_type;
|
||||||
|
|
||||||
explicit move_insert_range_proxy(FwdIt first)
|
BOOST_CONTAINER_FORCEINLINE explicit move_insert_range_proxy(FwdIt first)
|
||||||
: first_(first)
|
: first_(first)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n)
|
BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n)
|
||||||
{
|
{
|
||||||
this->first_ = ::boost::container::uninitialized_move_alloc_n_source
|
this->first_ = ::boost::container::uninitialized_move_alloc_n_source
|
||||||
(a, this->first_, n, p);
|
(a, this->first_, n, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
void copy_n_and_update(Allocator &, Iterator p, size_type n)
|
BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, size_type n)
|
||||||
{
|
{
|
||||||
this->first_ = ::boost::container::move_n_source(this->first_, n, p);
|
this->first_ = ::boost::container::move_n_source(this->first_, n, p);
|
||||||
}
|
}
|
||||||
@@ -74,16 +74,16 @@ struct insert_range_proxy
|
|||||||
typedef typename allocator_traits<Allocator>::size_type size_type;
|
typedef typename allocator_traits<Allocator>::size_type size_type;
|
||||||
typedef typename allocator_traits<Allocator>::value_type value_type;
|
typedef typename allocator_traits<Allocator>::value_type value_type;
|
||||||
|
|
||||||
explicit insert_range_proxy(FwdIt first)
|
BOOST_CONTAINER_FORCEINLINE explicit insert_range_proxy(FwdIt first)
|
||||||
: first_(first)
|
: first_(first)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n)
|
BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n)
|
||||||
{
|
{
|
||||||
this->first_ = ::boost::container::uninitialized_copy_alloc_n_source(a, this->first_, n, p);
|
this->first_ = ::boost::container::uninitialized_copy_alloc_n_source(a, this->first_, n, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
void copy_n_and_update(Allocator &, Iterator p, size_type n)
|
BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, size_type n)
|
||||||
{
|
{
|
||||||
this->first_ = ::boost::container::copy_n_source(this->first_, n, p);
|
this->first_ = ::boost::container::copy_n_source(this->first_, n, p);
|
||||||
}
|
}
|
||||||
@@ -98,14 +98,14 @@ struct insert_n_copies_proxy
|
|||||||
typedef typename allocator_traits<Allocator>::size_type size_type;
|
typedef typename allocator_traits<Allocator>::size_type size_type;
|
||||||
typedef typename allocator_traits<Allocator>::value_type value_type;
|
typedef typename allocator_traits<Allocator>::value_type value_type;
|
||||||
|
|
||||||
explicit insert_n_copies_proxy(const value_type &v)
|
BOOST_CONTAINER_FORCEINLINE explicit insert_n_copies_proxy(const value_type &v)
|
||||||
: v_(v)
|
: v_(v)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const
|
BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const
|
||||||
{ boost::container::uninitialized_fill_alloc_n(a, v_, n, p); }
|
{ boost::container::uninitialized_fill_alloc_n(a, v_, n, p); }
|
||||||
|
|
||||||
void copy_n_and_update(Allocator &, Iterator p, size_type n) const
|
BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, size_type n) const
|
||||||
{
|
{
|
||||||
for (; 0 < n; --n, ++p){
|
for (; 0 < n; --n, ++p){
|
||||||
*p = v_;
|
*p = v_;
|
||||||
@@ -122,7 +122,7 @@ struct insert_value_initialized_n_proxy
|
|||||||
typedef typename allocator_traits<Allocator>::size_type size_type;
|
typedef typename allocator_traits<Allocator>::size_type size_type;
|
||||||
typedef typename allocator_traits<Allocator>::value_type value_type;
|
typedef typename allocator_traits<Allocator>::value_type value_type;
|
||||||
|
|
||||||
void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const
|
BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const
|
||||||
{ boost::container::uninitialized_value_init_alloc_n(a, n, p); }
|
{ boost::container::uninitialized_value_init_alloc_n(a, n, p); }
|
||||||
|
|
||||||
void copy_n_and_update(Allocator &a, Iterator p, size_type n) const
|
void copy_n_and_update(Allocator &a, Iterator p, size_type n) const
|
||||||
@@ -144,7 +144,7 @@ struct insert_default_initialized_n_proxy
|
|||||||
typedef typename allocator_traits<Allocator>::size_type size_type;
|
typedef typename allocator_traits<Allocator>::size_type size_type;
|
||||||
typedef typename allocator_traits<Allocator>::value_type value_type;
|
typedef typename allocator_traits<Allocator>::value_type value_type;
|
||||||
|
|
||||||
void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const
|
BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const
|
||||||
{ boost::container::uninitialized_default_init_alloc_n(a, n, p); }
|
{ boost::container::uninitialized_default_init_alloc_n(a, n, p); }
|
||||||
|
|
||||||
void copy_n_and_update(Allocator &a, Iterator p, size_type n) const
|
void copy_n_and_update(Allocator &a, Iterator p, size_type n) const
|
||||||
@@ -168,17 +168,19 @@ struct insert_copy_proxy
|
|||||||
typedef typename alloc_traits::size_type size_type;
|
typedef typename alloc_traits::size_type size_type;
|
||||||
typedef typename alloc_traits::value_type value_type;
|
typedef typename alloc_traits::value_type value_type;
|
||||||
|
|
||||||
explicit insert_copy_proxy(const value_type &v)
|
static const bool single_value = true;
|
||||||
|
|
||||||
|
BOOST_CONTAINER_FORCEINLINE explicit insert_copy_proxy(const value_type &v)
|
||||||
: v_(v)
|
: v_(v)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const
|
BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n) const
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(n == 1); (void)n;
|
BOOST_ASSERT(n == 1); (void)n;
|
||||||
alloc_traits::construct( a, boost::movelib::iterator_to_raw_pointer(p), v_);
|
alloc_traits::construct( a, boost::movelib::iterator_to_raw_pointer(p), v_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void copy_n_and_update(Allocator &, Iterator p, size_type n) const
|
BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator p, size_type n) const
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(n == 1); (void)n;
|
BOOST_ASSERT(n == 1); (void)n;
|
||||||
*p = v_;
|
*p = v_;
|
||||||
@@ -195,6 +197,8 @@ struct insert_move_proxy
|
|||||||
typedef typename alloc_traits::size_type size_type;
|
typedef typename alloc_traits::size_type size_type;
|
||||||
typedef typename alloc_traits::value_type value_type;
|
typedef typename alloc_traits::value_type value_type;
|
||||||
|
|
||||||
|
static const bool single_value = true;
|
||||||
|
|
||||||
BOOST_CONTAINER_FORCEINLINE explicit insert_move_proxy(value_type &v)
|
BOOST_CONTAINER_FORCEINLINE explicit insert_move_proxy(value_type &v)
|
||||||
: v_(v)
|
: v_(v)
|
||||||
{}
|
{}
|
||||||
@@ -215,13 +219,13 @@ struct insert_move_proxy
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<class It, class Allocator>
|
template<class It, class Allocator>
|
||||||
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, It> 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, It>(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class It, class Allocator>
|
template<class It, class Allocator>
|
||||||
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, It> 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, It>(v);
|
||||||
}
|
}
|
||||||
@@ -243,19 +247,20 @@ struct insert_nonmovable_emplace_proxy
|
|||||||
typedef boost::container::allocator_traits<Allocator> alloc_traits;
|
typedef boost::container::allocator_traits<Allocator> alloc_traits;
|
||||||
typedef typename alloc_traits::size_type size_type;
|
typedef typename alloc_traits::size_type size_type;
|
||||||
typedef typename alloc_traits::value_type value_type;
|
typedef typename alloc_traits::value_type value_type;
|
||||||
|
|
||||||
typedef typename build_number_seq<sizeof...(Args)>::type index_tuple_t;
|
typedef typename build_number_seq<sizeof...(Args)>::type index_tuple_t;
|
||||||
|
|
||||||
explicit insert_nonmovable_emplace_proxy(BOOST_FWD_REF(Args)... args)
|
static const bool single_value = true;
|
||||||
|
|
||||||
|
BOOST_CONTAINER_FORCEINLINE explicit insert_nonmovable_emplace_proxy(BOOST_FWD_REF(Args)... args)
|
||||||
: args_(args...)
|
: args_(args...)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n)
|
BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n)
|
||||||
{ this->priv_uninitialized_copy_some_and_update(a, index_tuple_t(), p, n); }
|
{ this->priv_uninitialized_copy_some_and_update(a, index_tuple_t(), p, n); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template<std::size_t ...IdxPack>
|
template<std::size_t ...IdxPack>
|
||||||
void priv_uninitialized_copy_some_and_update(Allocator &a, const index_tuple<IdxPack...>&, Iterator p, size_type n)
|
BOOST_CONTAINER_FORCEINLINE void priv_uninitialized_copy_some_and_update(Allocator &a, const index_tuple<IdxPack...>&, Iterator p, size_type n)
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(n == 1); (void)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_))... );
|
alloc_traits::construct( a, boost::movelib::iterator_to_raw_pointer(p), ::boost::forward<Args>(get<IdxPack>(this->args_))... );
|
||||||
@@ -275,23 +280,24 @@ struct insert_emplace_proxy
|
|||||||
typedef typename base_t::size_type size_type;
|
typedef typename base_t::size_type size_type;
|
||||||
typedef typename base_t::index_tuple_t index_tuple_t;
|
typedef typename base_t::index_tuple_t index_tuple_t;
|
||||||
|
|
||||||
explicit insert_emplace_proxy(BOOST_FWD_REF(Args)... args)
|
static const bool single_value = true;
|
||||||
|
|
||||||
|
BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy(BOOST_FWD_REF(Args)... args)
|
||||||
: base_t(::boost::forward<Args>(args)...)
|
: base_t(::boost::forward<Args>(args)...)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void copy_n_and_update(Allocator &a, Iterator p, size_type n)
|
BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &a, Iterator p, size_type n)
|
||||||
{ this->priv_copy_some_and_update(a, index_tuple_t(), p, n); }
|
{ this->priv_copy_some_and_update(a, index_tuple_t(), p, n); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
template<std::size_t ...IdxPack>
|
template<std::size_t ...IdxPack>
|
||||||
void priv_copy_some_and_update(Allocator &a, const index_tuple<IdxPack...>&, Iterator p, size_type n)
|
BOOST_CONTAINER_FORCEINLINE void priv_copy_some_and_update(Allocator &a, const index_tuple<IdxPack...>&, Iterator p, size_type n)
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(n ==1); (void)n;
|
BOOST_ASSERT(n ==1); (void)n;
|
||||||
typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v;
|
typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v;
|
||||||
value_type *vp = reinterpret_cast<value_type *>(v.data);
|
value_type *vp = reinterpret_cast<value_type *>(v.data);
|
||||||
alloc_traits::construct(a, vp,
|
alloc_traits::construct(a, vp, ::boost::forward<Args>(get<IdxPack>(this->args_))...);
|
||||||
::boost::forward<Args>(get<IdxPack>(this->args_))...);
|
|
||||||
BOOST_TRY{
|
BOOST_TRY{
|
||||||
*p = ::boost::move(*vp);
|
*p = ::boost::move(*vp);
|
||||||
}
|
}
|
||||||
@@ -309,7 +315,9 @@ template<class Allocator, class Iterator>
|
|||||||
struct insert_emplace_proxy<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type>
|
struct insert_emplace_proxy<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type>
|
||||||
: public insert_move_proxy<Allocator, Iterator>
|
: public insert_move_proxy<Allocator, Iterator>
|
||||||
{
|
{
|
||||||
explicit insert_emplace_proxy(typename boost::container::allocator_traits<Allocator>::value_type &&v)
|
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, Iterator>(v)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
@@ -323,7 +331,10 @@ struct insert_emplace_proxy<Allocator, Iterator
|
|||||||
>
|
>
|
||||||
: public insert_copy_proxy<Allocator, Iterator>
|
: public insert_copy_proxy<Allocator, Iterator>
|
||||||
{
|
{
|
||||||
explicit insert_emplace_proxy(const typename boost::container::allocator_traits<Allocator>::value_type &v)
|
|
||||||
|
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, Iterator>(v)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
@@ -332,7 +343,9 @@ template<class Allocator, class Iterator>
|
|||||||
struct insert_emplace_proxy<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type &>
|
struct insert_emplace_proxy<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type &>
|
||||||
: public insert_copy_proxy<Allocator, Iterator>
|
: public insert_copy_proxy<Allocator, Iterator>
|
||||||
{
|
{
|
||||||
explicit insert_emplace_proxy(const typename boost::container::allocator_traits<Allocator>::value_type &v)
|
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, Iterator>(v)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
@@ -343,7 +356,9 @@ struct insert_emplace_proxy<Allocator, Iterator
|
|||||||
>
|
>
|
||||||
: public insert_copy_proxy<Allocator, Iterator>
|
: public insert_copy_proxy<Allocator, Iterator>
|
||||||
{
|
{
|
||||||
explicit insert_emplace_proxy(const typename boost::container::allocator_traits<Allocator>::value_type &v)
|
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, Iterator>(v)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
@@ -366,16 +381,18 @@ struct insert_nonmovable_emplace_proxy##N\
|
|||||||
typedef typename alloc_traits::size_type size_type;\
|
typedef typename alloc_traits::size_type size_type;\
|
||||||
typedef typename alloc_traits::value_type value_type;\
|
typedef typename alloc_traits::value_type value_type;\
|
||||||
\
|
\
|
||||||
explicit insert_nonmovable_emplace_proxy##N(BOOST_MOVE_UREF##N)\
|
static const bool single_value = true;\
|
||||||
|
\
|
||||||
|
BOOST_CONTAINER_FORCEINLINE explicit insert_nonmovable_emplace_proxy##N(BOOST_MOVE_UREF##N)\
|
||||||
BOOST_MOVE_COLON##N BOOST_MOVE_FWD_INIT##N {}\
|
BOOST_MOVE_COLON##N BOOST_MOVE_FWD_INIT##N {}\
|
||||||
\
|
\
|
||||||
void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n)\
|
BOOST_CONTAINER_FORCEINLINE void uninitialized_copy_n_and_update(Allocator &a, Iterator p, size_type n)\
|
||||||
{\
|
{\
|
||||||
BOOST_ASSERT(n == 1); (void)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);\
|
alloc_traits::construct(a, boost::movelib::iterator_to_raw_pointer(p) BOOST_MOVE_I##N BOOST_MOVE_MFWD##N);\
|
||||||
}\
|
}\
|
||||||
\
|
\
|
||||||
void copy_n_and_update(Allocator &, Iterator, size_type)\
|
BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &, Iterator, size_type)\
|
||||||
{ BOOST_ASSERT(false); }\
|
{ BOOST_ASSERT(false); }\
|
||||||
\
|
\
|
||||||
protected:\
|
protected:\
|
||||||
@@ -392,10 +409,12 @@ struct insert_emplace_proxy_arg##N\
|
|||||||
typedef typename base_t::size_type size_type;\
|
typedef typename base_t::size_type size_type;\
|
||||||
typedef boost::container::allocator_traits<Allocator> alloc_traits;\
|
typedef boost::container::allocator_traits<Allocator> alloc_traits;\
|
||||||
\
|
\
|
||||||
explicit insert_emplace_proxy_arg##N(BOOST_MOVE_UREF##N)\
|
static const bool single_value = true;\
|
||||||
|
\
|
||||||
|
BOOST_CONTAINER_FORCEINLINE explicit insert_emplace_proxy_arg##N(BOOST_MOVE_UREF##N)\
|
||||||
: base_t(BOOST_MOVE_FWD##N){}\
|
: base_t(BOOST_MOVE_FWD##N){}\
|
||||||
\
|
\
|
||||||
void copy_n_and_update(Allocator &a, Iterator p, size_type n)\
|
BOOST_CONTAINER_FORCEINLINE void copy_n_and_update(Allocator &a, Iterator p, size_type n)\
|
||||||
{\
|
{\
|
||||||
BOOST_ASSERT(n == 1); (void)n;\
|
BOOST_ASSERT(n == 1); (void)n;\
|
||||||
typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v;\
|
typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v;\
|
||||||
@@ -424,7 +443,9 @@ template<class Allocator, class Iterator>
|
|||||||
struct insert_emplace_proxy_arg1<Allocator, Iterator, ::boost::rv<typename boost::container::allocator_traits<Allocator>::value_type> >
|
struct insert_emplace_proxy_arg1<Allocator, Iterator, ::boost::rv<typename boost::container::allocator_traits<Allocator>::value_type> >
|
||||||
: public insert_move_proxy<Allocator, Iterator>
|
: public insert_move_proxy<Allocator, Iterator>
|
||||||
{
|
{
|
||||||
explicit insert_emplace_proxy_arg1(typename boost::container::allocator_traits<Allocator>::value_type &v)
|
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, Iterator>(v)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
@@ -433,7 +454,9 @@ template<class Allocator, class Iterator>
|
|||||||
struct insert_emplace_proxy_arg1<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type>
|
struct insert_emplace_proxy_arg1<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type>
|
||||||
: public insert_copy_proxy<Allocator, Iterator>
|
: public insert_copy_proxy<Allocator, Iterator>
|
||||||
{
|
{
|
||||||
explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v)
|
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, Iterator>(v)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
@@ -445,7 +468,9 @@ template<class Allocator, class Iterator>
|
|||||||
struct insert_emplace_proxy_arg1<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type>
|
struct insert_emplace_proxy_arg1<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type>
|
||||||
: public insert_move_proxy<Allocator, Iterator>
|
: public insert_move_proxy<Allocator, Iterator>
|
||||||
{
|
{
|
||||||
explicit insert_emplace_proxy_arg1(typename boost::container::allocator_traits<Allocator>::value_type &&v)
|
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, Iterator>(v)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
@@ -459,7 +484,9 @@ struct insert_emplace_proxy_arg1<Allocator, Iterator
|
|||||||
>
|
>
|
||||||
: public insert_copy_proxy<Allocator, Iterator>
|
: public insert_copy_proxy<Allocator, Iterator>
|
||||||
{
|
{
|
||||||
explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v)
|
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, Iterator>(v)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
@@ -468,7 +495,9 @@ template<class Allocator, class Iterator>
|
|||||||
struct insert_emplace_proxy_arg1<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type &>
|
struct insert_emplace_proxy_arg1<Allocator, Iterator, typename boost::container::allocator_traits<Allocator>::value_type &>
|
||||||
: public insert_copy_proxy<Allocator, Iterator>
|
: public insert_copy_proxy<Allocator, Iterator>
|
||||||
{
|
{
|
||||||
explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v)
|
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, Iterator>(v)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
@@ -479,7 +508,9 @@ struct insert_emplace_proxy_arg1<Allocator, Iterator
|
|||||||
>
|
>
|
||||||
: public insert_copy_proxy<Allocator, Iterator>
|
: public insert_copy_proxy<Allocator, Iterator>
|
||||||
{
|
{
|
||||||
explicit insert_emplace_proxy_arg1(const typename boost::container::allocator_traits<Allocator>::value_type &v)
|
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, Iterator>(v)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
@@ -490,6 +521,40 @@ struct insert_emplace_proxy_arg1<Allocator, Iterator
|
|||||||
|
|
||||||
#endif // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
#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>
|
#include <boost/container/detail/config_end.hpp>
|
||||||
|
|
||||||
#endif //#ifndef BOOST_CONTAINER_ADVANCED_INSERT_INT_HPP
|
#endif //#ifndef BOOST_CONTAINER_ADVANCED_INSERT_INT_HPP
|
||||||
|
Reference in New Issue
Block a user