29 #ifndef _SCOPED_ALLOCATOR 
   30 #define _SCOPED_ALLOCATOR 1 
   32 #pragma GCC system_header 
   34 #if __cplusplus < 201103L 
   42 namespace std _GLIBCXX_VISIBILITY(default)
 
   44 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   46   template<
template<
typename> 
class _Pred, 
typename... _Allocs>
 
   49   template<
template<
typename> 
class _Pred, 
typename _Alloc, 
typename... _Allocs>
 
   50     struct __any_of<_Pred, _Alloc, _Allocs...>
 
   51     : __or_<_Pred<_Alloc>, __any_of<_Pred, _Allocs...>>
 
   54   template<
template<
typename> 
class _Pred, 
typename _Alloc>
 
   55     struct __any_of<_Pred, _Alloc>
 
   64   template<
typename _Alloc>
 
   65     struct __propagate_on_copy
 
   66     : allocator_traits<_Alloc>::propagate_on_container_copy_assignment
 
   68   template<
typename _Alloc>
 
   69     struct __propagate_on_move
 
   70     : allocator_traits<_Alloc>::propagate_on_container_move_assignment
 
   72   template<
typename _Alloc>
 
   73     struct __propagate_on_swap
 
   74     : allocator_traits<_Alloc>::propagate_on_container_swap
 
   78   template<
typename _Alloc>
 
   80     __do_outermost(_Alloc& __a, _Alloc*) -> decltype(__a.outer_allocator())
 
   81     { 
return __a.outer_allocator(); }
 
   83   template<
typename _Alloc>
 
   85     __do_outermost(_Alloc& __a, ...)
 
   89   template<
typename _Alloc>
 
   91     __outermost(_Alloc& __a) -> decltype(__do_outermost(__a, &__a))
 
   92     { 
return __do_outermost(__a, &__a); }
 
   94   template<
typename _OuterAlloc, 
typename... _InnerAllocs>
 
   98     struct __inner_type_impl;
 
  100   template<
typename _Outer>
 
  101     struct __inner_type_impl<_Outer>
 
  105       __inner_type_impl() = 
default;
 
  106       __inner_type_impl(
const __inner_type_impl&) = 
default;
 
  107       __inner_type_impl(__inner_type_impl&&) = 
default;
 
  109       template<
typename _Alloc>
 
  110       __inner_type_impl(
const __inner_type_impl<_Alloc>& __other)
 
  113       template<
typename _Alloc>
 
  114       __inner_type_impl(__inner_type_impl<_Alloc>&& __other)
 
  118       _M_get(__type* __p) noexcept { 
return *__p; }
 
  121       _M_get(
const __type* __p) 
const noexcept { 
return *__p; }
 
  124       _M_tie() const noexcept { 
return tuple<>(); }
 
  127       operator==(
const __inner_type_impl&) const noexcept
 
  131   template<
typename _Outer, 
typename _InnerHead, 
typename... _InnerTail>
 
  132     struct __inner_type_impl<_Outer, _InnerHead, _InnerTail...>
 
  134       typedef scoped_allocator_adaptor<_InnerHead, _InnerTail...> __type;
 
  136       __inner_type_impl() = 
default;
 
  137       __inner_type_impl(
const __inner_type_impl&) = 
default;
 
  138       __inner_type_impl(__inner_type_impl&&) = 
default;
 
  140       template<
typename... _Allocs>
 
  141       __inner_type_impl(
const __inner_type_impl<_Allocs...>& __other)
 
  142       : _M_inner(__other._M_inner) { }
 
  144       template<
typename... _Allocs>
 
  145       __inner_type_impl(__inner_type_impl<_Allocs...>&& __other)
 
  146       : _M_inner(std::move(__other._M_inner)) { }
 
  148     template<
typename... _Args>
 
  150       __inner_type_impl(_Args&&... __args)
 
  151       : _M_inner(std::
forward<_Args>(__args)...) { }
 
  154       _M_get(
void*) noexcept { 
return _M_inner; }
 
  157       _M_get(
const void*) const noexcept { 
return _M_inner; }
 
  159       tuple<
const _InnerHead&, 
const _InnerTail&...> 
 
  160       _M_tie() const noexcept
 
  161       { 
return _M_inner._M_tie(); }
 
  164       operator==(
const __inner_type_impl& __other) 
const noexcept
 
  165       { 
return _M_inner == __other._M_inner; }
 
  168       template<
typename...> 
friend class __inner_type_impl;
 
  169       template<
typename, 
typename...> 
friend class scoped_allocator_adaptor;
 
  175   template<
typename _OuterAlloc, 
typename... _InnerAllocs>
 
  176     class scoped_allocator_adaptor
 
  179       typedef allocator_traits<_OuterAlloc> __traits;
 
  181       typedef __inner_type_impl<_OuterAlloc, _InnerAllocs...> __inner_type;
 
  182       __inner_type _M_inner;
 
  184       template<
typename _Outer, 
typename... _Inner>
 
  185         friend class scoped_allocator_adaptor;
 
  187       template<
typename...>
 
  188         friend class __inner_type_impl;
 
  190       tuple<
const _OuterAlloc&, 
const _InnerAllocs&...>
 
  191       _M_tie() const noexcept
 
  192       { 
return std::tuple_cat(
std::tie(outer_allocator()), _M_inner._M_tie()); }
 
  194       template<
typename _Alloc>
 
  195     using __outermost_type = 
typename 
  196       std::decay<decltype(__outermost(std::declval<_Alloc&>()))>::type;
 
  198       template<
typename _Alloc>
 
  199     using __outermost_alloc_traits
 
  200       = allocator_traits<__outermost_type<_Alloc>>;
 
  202       template<
typename _Tp, 
typename... _Args>
 
  204         _M_construct(__uses_alloc0, _Tp* __p, _Args&&... __args)
 
  206       typedef __outermost_alloc_traits<scoped_allocator_adaptor> _O_traits;
 
  207       _O_traits::construct(__outermost(*
this), __p,
 
  208                    std::forward<_Args>(__args)...);
 
  211       typedef __uses_alloc1<typename __inner_type::__type> __uses_alloc1_;
 
  212       typedef __uses_alloc2<typename __inner_type::__type> __uses_alloc2_;
 
  214       template<
typename _Tp, 
typename... _Args>
 
  216         _M_construct(__uses_alloc1_, _Tp* __p, _Args&&... __args)
 
  218       typedef __outermost_alloc_traits<scoped_allocator_adaptor> _O_traits;
 
  219       _O_traits::construct(__outermost(*
this), __p,
 
  220                    allocator_arg, inner_allocator(),
 
  221                    std::forward<_Args>(__args)...);
 
  224       template<
typename _Tp, 
typename... _Args>
 
  226         _M_construct(__uses_alloc2_, _Tp* __p, _Args&&... __args)
 
  228       typedef __outermost_alloc_traits<scoped_allocator_adaptor> _O_traits;
 
  229       _O_traits::construct(__outermost(*
this), __p,
 
  230                    std::forward<_Args>(__args)...,
 
  234       template<
typename _Alloc>
 
  236         _S_select_on_copy(
const _Alloc& __a)
 
  238           typedef allocator_traits<_Alloc> __a_traits;
 
  239           return __a_traits::select_on_container_copy_construction(__a);
 
  242       template<std::size_t... _Indices>
 
  243         scoped_allocator_adaptor(tuple<
const _OuterAlloc&,
 
  244                                        const _InnerAllocs&...> __refs,
 
  245                                  _Index_tuple<_Indices...>)
 
  246         : _OuterAlloc(_S_select_on_copy(std::get<0>(__refs))),
 
  247           _M_inner(_S_select_on_copy(std::get<_Indices+1>(__refs))...)
 
  251       typedef _OuterAlloc                       outer_allocator_type;
 
  252       typedef typename __inner_type::__type     inner_allocator_type;
 
  262       typedef typename conditional<
 
  263         __any_of<__propagate_on_copy, _OuterAlloc, _InnerAllocs...>::value,
 
  265       typedef typename conditional<
 
  266         __any_of<__propagate_on_move, _OuterAlloc, _InnerAllocs...>::value,
 
  268       typedef typename conditional<
 
  269         __any_of<__propagate_on_swap, _OuterAlloc, _InnerAllocs...>::value,
 
  275           typedef scoped_allocator_adaptor<
 
  276             typename __traits::template rebind_alloc<_Tp>,
 
  277             _InnerAllocs...> other;
 
  280       scoped_allocator_adaptor() : _OuterAlloc(), _M_inner() { }
 
  282       template<
typename _Outer2>
 
  283         scoped_allocator_adaptor(_Outer2&& __outer,
 
  284                                  const _InnerAllocs&... __inner)
 
  285         : _OuterAlloc(std::
forward<_Outer2>(__outer)),
 
  289       scoped_allocator_adaptor(
const scoped_allocator_adaptor& __other)
 
  290       : _OuterAlloc(__other.outer_allocator()),
 
  291     _M_inner(__other._M_inner)
 
  294       scoped_allocator_adaptor(scoped_allocator_adaptor&& __other)
 
  295       : _OuterAlloc(std::move(__other.outer_allocator())),
 
  296     _M_inner(std::move(__other._M_inner))
 
  299       template<
typename _Outer2>
 
  300         scoped_allocator_adaptor(
 
  301             const scoped_allocator_adaptor<_Outer2, _InnerAllocs...>& __other)
 
  302         : _OuterAlloc(__other.outer_allocator()),
 
  303           _M_inner(__other._M_inner)
 
  306       template<
typename _Outer2>
 
  307         scoped_allocator_adaptor(
 
  308             scoped_allocator_adaptor<_Outer2, _InnerAllocs...>&& __other)
 
  309         : _OuterAlloc(std::move(__other.outer_allocator())),
 
  310           _M_inner(std::move(__other._M_inner))
 
  313       inner_allocator_type& inner_allocator() noexcept
 
  314       { 
return _M_inner._M_get(
this); }
 
  316       const inner_allocator_type& inner_allocator() const noexcept
 
  317       { 
return _M_inner._M_get(
this); }
 
  319       outer_allocator_type& outer_allocator() noexcept
 
  320       { 
return static_cast<_OuterAlloc&
>(*this); }
 
  322       const outer_allocator_type& outer_allocator() const noexcept
 
  323       { 
return static_cast<const _OuterAlloc&
>(*this); }
 
  325       pointer allocate(size_type __n)
 
  328       pointer allocate(size_type __n, const_void_pointer __hint)
 
  331       void deallocate(pointer __p, size_type __n)
 
  334       size_type max_size()
 const 
  337       template<
typename _Tp, 
typename... _Args>
 
  338         void construct(_Tp* __p, _Args&&... __args)
 
  340           auto& __inner = inner_allocator();
 
  342             = __use_alloc<_Tp, inner_allocator_type, _Args...>(__inner);
 
  343           _M_construct(__use_tag, __p, std::forward<_Args>(__args)...);
 
  346       template<
typename _T1, 
typename _T2, 
typename... _Args1,
 
  349     construct(pair<_T1, _T2>* __p, piecewise_construct_t,
 
  350           tuple<_Args1...> __x, tuple<_Args2...> __y)
 
  354       auto& __inner = inner_allocator();
 
  356         = __use_alloc<_T1, inner_allocator_type, _Args1...>(__inner);
 
  358         = __use_alloc<_T2, inner_allocator_type, _Args2...>(__inner);
 
  359       typedef __outermost_alloc_traits<scoped_allocator_adaptor> _O_traits;
 
  361                    _M_construct_p(__x_use_tag, __x),
 
  362                    _M_construct_p(__y_use_tag, __y));
 
  365       template<
typename _T1, 
typename _T2>
 
  367     construct(pair<_T1, _T2>* __p)
 
  370       template<
typename _T1, 
typename _T2, 
typename _Up, 
typename _Vp>
 
  372     construct(pair<_T1, _T2>* __p, _Up&& __u, _Vp&& __v)
 
  375             std::forward_as_tuple(std::forward<_Up>(__u)),
 
  376             std::forward_as_tuple(std::forward<_Vp>(__v)));
 
  379       template<
typename _T1, 
typename _T2, 
typename _Up, 
typename _Vp>
 
  381     construct(pair<_T1, _T2>* __p, 
const pair<_Up, _Vp>& __x)
 
  384             std::forward_as_tuple(__x.first),
 
  385             std::forward_as_tuple(__x.second));
 
  388       template<
typename _T1, 
typename _T2, 
typename _Up, 
typename _Vp>
 
  390     construct(pair<_T1, _T2>* __p, pair<_Up, _Vp>&& __x)
 
  393             std::forward_as_tuple(std::forward<_Up>(__x.first)),
 
  394             std::forward_as_tuple(std::forward<_Vp>(__x.second)));
 
  397       template<
typename _Tp>
 
  398         void destroy(_Tp* __p)
 
  400       typedef __outermost_alloc_traits<scoped_allocator_adaptor> _O_traits;
 
  401       _O_traits::destroy(__outermost(*
this), __p);
 
  404       scoped_allocator_adaptor
 
  405       select_on_container_copy_construction()
 const 
  407         typedef typename _Build_index_tuple<
sizeof...(_InnerAllocs)>::__type
 
  409         return scoped_allocator_adaptor(_M_tie(), _Indices());
 
  412       template <
typename _OutA1, 
typename _OutA2, 
typename... _InA>
 
  414       operator==(
const scoped_allocator_adaptor<_OutA1, _InA...>& __a,
 
  415                  const scoped_allocator_adaptor<_OutA2, _InA...>& __b) noexcept;
 
  418       template<
typename _Tuple>
 
  420     _M_construct_p(__uses_alloc0, _Tuple& __t)
 
  421     { 
return std::move(__t); }
 
  423       template<
typename... _Args>
 
  424     std::tuple<allocator_arg_t, inner_allocator_type&, _Args...>
 
  428       return std::tuple_cat(_Tuple(allocator_arg, inner_allocator()),
 
  432       template<
typename... _Args>
 
  437       return std::tuple_cat(std::move(__t), _Tuple(inner_allocator()));
 
  441   template <
typename _OutA1, 
typename _OutA2, 
typename... _InA>
 
  443     operator==(
const scoped_allocator_adaptor<_OutA1, _InA...>& __a,
 
  444                const scoped_allocator_adaptor<_OutA2, _InA...>& __b) noexcept
 
  446       return __a.outer_allocator() == __b.outer_allocator()
 
  447           && __a._M_inner == __b._M_inner;
 
  450   template <
typename _OutA1, 
typename _OutA2, 
typename... _InA>
 
  452     operator!=(
const scoped_allocator_adaptor<_OutA1, _InA...>& __a,
 
  453                const scoped_allocator_adaptor<_OutA2, _InA...>& __b) noexcept
 
  454     { 
return !(__a == __b); }
 
  458 _GLIBCXX_END_NAMESPACE_VERSION
 
  463 #endif // _SCOPED_ALLOCATOR 
__pointer pointer
The allocator's pointer type. 
 
Primary class template, tuple. 
 
constexpr piecewise_construct_t piecewise_construct
piecewise_construct 
 
__const_void_pointer const_void_pointer
The allocator's const void pointer type. 
 
__void_pointer void_pointer
The allocator's void pointer type. 
 
static void deallocate(_Alloc &__a, pointer __p, size_type __n)
Deallocate memory. 
 
static size_type max_size(const _Alloc &__a) noexcept
The maximum supported allocation size. 
 
constexpr _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue. 
 
__const_pointer const_pointer
The allocator's const pointer type. 
 
integral_constant< bool, true > true_type
The type used as a compile-time boolean with true value. 
 
tuple< _Elements &...> tie(_Elements &...__args) noexcept
tie 
 
static pointer allocate(_Alloc &__a, size_type __n)
Allocate memory. 
 
integral_constant< bool, false > false_type
The type used as a compile-time boolean with false value. 
 
__difference_type difference_type
The allocator's difference type. 
 
_Alloc::value_type value_type
The allocated type. 
 
__size_type size_type
The allocator's size type.