using inner_allocator_type = see below;
Type: scoped_allocator_adaptor<OuterAlloc> if
sizeof...(InnerAllocs) is
zero; otherwise,
scoped_allocator_adaptor<InnerAllocs...>. using propagate_on_container_copy_assignment = see below;
Type: true_type if
allocator_traits<A>::propagate_on_container_copy_assignment::value is
true for any
A in the set of
OuterAlloc and
InnerAllocs...; otherwise,
false_type. using propagate_on_container_move_assignment = see below;
Type: true_type if
allocator_traits<A>::propagate_on_container_move_assignment::value is
true for any
A in the set of
OuterAlloc and
InnerAllocs...; otherwise,
false_type. using propagate_on_container_swap = see below;
Type: true_type if
allocator_traits<A>::propagate_on_container_swap::value is
true for any
A in the set of
OuterAlloc and
InnerAllocs...; otherwise,
false_type. using is_always_equal = see below;
Type: true_type if
allocator_traits<A>::is_always_equal::value is
true for every
A in the set of
OuterAlloc and
InnerAllocs...; otherwise,
false_type. scoped_allocator_adaptor();
Effects: Value-initializes the
OuterAlloc base class and the
inner allocator
object
. template <class OuterA2>
scoped_allocator_adaptor(OuterA2&& outerAlloc,
const InnerAllocs&... innerAllocs) noexcept;
Effects: Initializes the
OuterAlloc base class with
std::forward<OuterA2>(outerAlloc) and
inner with
innerAllocs...
(hence recursively initializing each allocator within the adaptor with the corresponding
allocator from the argument list)
. Remarks: This constructor shall not participate in overload resolution unless
is_constructible_v<OuterAlloc, OuterA2> is
true. scoped_allocator_adaptor(const scoped_allocator_adaptor& other) noexcept;
Effects: Initializes each allocator within the adaptor with the corresponding allocator
from
other. scoped_allocator_adaptor(scoped_allocator_adaptor&& other) noexcept;
Effects: Move constructs each allocator within the adaptor with the corresponding allocator
from
other. template <class OuterA2>
scoped_allocator_adaptor(const scoped_allocator_adaptor<OuterA2,
InnerAllocs...>& other) noexcept;
Effects: Initializes each allocator within the adaptor with the corresponding allocator
from
other. Remarks: This constructor shall not participate in overload resolution unless
is_constructible_v<OuterAlloc, const OuterA2&> is
true. template <class OuterA2>
scoped_allocator_adaptor(scoped_allocator_adaptor<OuterA2,
InnerAllocs...>&& other) noexcept;
Effects: Initializes each allocator within the adaptor with the corresponding allocator rvalue
from
other. Remarks: This constructor shall not participate in overload resolution unless
is_constructible_v<OuterAlloc, OuterA2> is
true. In the
construct member functions,
OUTERMOST(x) is
x if
x does not have an
outer_allocator() member function and
OUTERMOST(x.outer_allocator())
otherwise;
OUTERMOST_ALLOC_TRAITS(x) is
allocator_traits<decltype(OUTERMOST(x))>. [
Note: OUTERMOST(x) and
OUTERMOST_ALLOC_TRAITS(x) are recursive operations
. It
is incumbent upon the definition of
outer_allocator() to ensure that the
recursion terminates
. It will terminate for all instantiations of
scoped_allocator_adaptor. —
end note ]
inner_allocator_type& inner_allocator() noexcept;
const inner_allocator_type& inner_allocator() const noexcept;
Returns: *this if
sizeof...(InnerAllocs) is zero; otherwise,
inner. outer_allocator_type& outer_allocator() noexcept;
Returns: static_cast<OuterAlloc&>(*this). const outer_allocator_type& outer_allocator() const noexcept;
Returns: static_cast<const OuterAlloc&>(*this). pointer allocate(size_type n);
Returns: allocator_traits<OuterAlloc>::allocate(outer_allocator(), n). pointer allocate(size_type n, const_void_pointer hint);
Returns: allocator_traits<OuterAlloc>::allocate(outer_allocator(), n, hint). void deallocate(pointer p, size_type n) noexcept;
Effects: As if by:
allocator_traits<OuterAlloc>::deallocate(outer_allocator(), p, n);
size_type max_size() const;
Returns: allocator_traits<OuterAlloc>::max_size(outer_allocator()). template <class T, class... Args>
void construct(T* p, Args&&... args);
Effects:
If
uses_allocator_v<T, inner_allocator_type> is
false and
is_constructible_v<T,
Args...> is
true, calls:
OUTERMOST_ALLOC_TRAITS(*this)::construct(
OUTERMOST(*this), p, std::forward<Args>(args)...)
Otherwise, if
uses_allocator_v<T, inner_allocator_type> is
true and
is_constructible_v<T, allocator_arg_t, inner_allocator_type&, Args...> is
true, calls:
OUTERMOST_ALLOC_TRAITS(*this)::construct(
OUTERMOST(*this), p, allocator_arg, inner_allocator(), std::forward<Args>(args)...)
Otherwise, if
uses_allocator_v<T, inner_allocator_type> is
true and
is_constructible_v<T, Args..., inner_allocator_type&> is
true, calls:
OUTERMOST_ALLOC_TRAITS(*this)::construct(
OUTERMOST(*this), p, std::forward<Args>(args)..., inner_allocator())
Otherwise, the program is ill-formed
. [
Note: An error will result if
uses_allocator evaluates to
true but the specific constructor does not take an
allocator
. This definition prevents a silent failure to pass an inner allocator to a
contained element
. —
end note ]
template <class T1, class T2, class... Args1, class... Args2>
void construct(pair<T1, T2>* p, piecewise_construct_t,
tuple<Args1...> x, tuple<Args2...> y);
Requires: all of the types in
Args1 and
Args2 shall be
CopyConstructible (Table
24)
. Effects: Constructs a
tuple object
xprime from
x by the
following rules:
If
uses_allocator_v<T1, inner_allocator_type> is
false and
is_constructible_v<T1,
Args1...> is
true,
then
xprime is
x.Otherwise, if
uses_allocator_v<T1, inner_allocator_type> is
true
and
is_constructible_v<T1, allocator_arg_t, inner_allocator_type&, Args1...>
is
true, then
xprime is:
tuple_cat(
tuple<allocator_arg_t, inner_allocator_type&>(allocator_arg, inner_allocator()),
std::move(x))
Otherwise, if
uses_allocator_v<T1, inner_allocator_type> is
true and
is_constructible_v<T1, Args1..., inner_allocator_type&> is
true,
then
xprime is:
tuple_cat(std::move(x), tuple<inner_allocator_type&>(inner_allocator()))
Otherwise, the program is ill-formed
.
and constructs a
tuple object
yprime from
y by the following rules:
If
uses_allocator_v<T2, inner_allocator_type> is
false and
is_constructible_v<T2,
Args2...> is
true, then
yprime is
y.Otherwise, if
uses_allocator_v<T2, inner_allocator_type> is
true
and
is_constructible_v<T2, allocator_arg_t, inner_allocator_type&, Args2...>
is
true, then
yprime is:
tuple_cat(
tuple<allocator_arg_t, inner_allocator_type&>(allocator_arg, inner_allocator()),
std::move(y))
Otherwise, if
uses_allocator_v<T2, inner_allocator_type> is
true and
is_constructible_v<T2, Args2..., inner_allocator_type&> is
true,
then
yprime is:
tuple_cat(std::move(y), tuple<inner_allocator_type&>(inner_allocator()))
Otherwise, the program is ill-formed
.
then calls:
OUTERMOST_ALLOC_TRAITS(*this)::construct(
OUTERMOST(*this), p, piecewise_construct, std::move(xprime), std::move(yprime))
template <class T1, class T2>
void construct(pair<T1, T2>* p);
Effects: Equivalent to:
construct(p, piecewise_construct, tuple<>(), tuple<>());
template <class T1, class T2, class U, class V>
void construct(pair<T1, T2>* p, U&& x, V&& y);
Effects: Equivalent to:
construct(p, piecewise_construct,
forward_as_tuple(std::forward<U>(x)),
forward_as_tuple(std::forward<V>(y)));
template <class T1, class T2, class U, class V>
void construct(pair<T1, T2>* p, const pair<U, V>& x);
Effects: Equivalent to:
construct(p, piecewise_construct,
forward_as_tuple(x.first),
forward_as_tuple(x.second));
template <class T1, class T2, class U, class V>
void construct(pair<T1, T2>* p, pair<U, V>&& x);
Effects: Equivalent to:
construct(p, piecewise_construct,
forward_as_tuple(std::forward<U>(x.first)),
forward_as_tuple(std::forward<V>(x.second)));
template <class T>
void destroy(T* p);
Effects: Calls
OUTERMOST_ALLOC_TRAITS(*this)::destroy(OUTERMOST(*this), p). scoped_allocator_adaptor select_on_container_copy_construction() const;
Returns: A new
scoped_allocator_adaptor object where each allocator
A in the
adaptor is initialized from the result of calling
allocator_traits<A>::select_on_container_copy_construction() on the
corresponding allocator in
*this. template <class OuterA1, class OuterA2, class... InnerAllocs>
bool operator==(const scoped_allocator_adaptor<OuterA1, InnerAllocs...>& a,
const scoped_allocator_adaptor<OuterA2, InnerAllocs...>& b) noexcept;
Returns: If
sizeof...(InnerAllocs) is zero,
a.outer_allocator() == b.outer_allocator()
otherwise
a.outer_allocator() == b.outer_allocator() && a.inner_allocator() == b.inner_allocator()
template <class OuterA1, class OuterA2, class... InnerAllocs>
bool operator!=(const scoped_allocator_adaptor<OuterA1, InnerAllocs...>& a,
const scoped_allocator_adaptor<OuterA2, InnerAllocs...>& b) noexcept;