29#ifndef _EXT_ALLOC_TRAITS_H 
   30#define _EXT_ALLOC_TRAITS_H 1 
   32#pragma GCC system_header 
   35#if __cplusplus < 201103L 
   39namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
 
   41_GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   47template<
typename _Alloc, 
typename = 
typename _Alloc::value_type>
 
   49#if __cplusplus >= 201103L
 
   53    typedef _Alloc allocator_type;
 
   54#if __cplusplus >= 201103L 
   62    typedef value_type&                             reference;
 
   63    typedef const value_type&                       const_reference;
 
   64    using _Base_type::allocate;
 
   65    using _Base_type::deallocate;
 
   66    using _Base_type::construct;
 
   67    using _Base_type::destroy;
 
   68    using _Base_type::max_size;
 
   71    template<
typename _Ptr>
 
   72      using __is_custom_pointer
 
   73        = std::__and_<std::is_same<pointer, _Ptr>,
 
   74                      std::__not_<std::is_pointer<_Ptr>>>;
 
   78    template<
typename _Ptr, 
typename... _Args>
 
   79      static _GLIBCXX14_CONSTEXPR
 
   80      std::__enable_if_t<__is_custom_pointer<_Ptr>::value>
 
   81      construct(_Alloc& __a, _Ptr __p, _Args&&... __args)
 
   82      noexcept(
noexcept(_Base_type::construct(__a, std::__to_address(__p),
 
   83                                              std::forward<_Args>(__args)...)))
 
   85        _Base_type::construct(__a, std::__to_address(__p),
 
   86                              std::forward<_Args>(__args)...);
 
   90    template<
typename _Ptr>
 
   91      static _GLIBCXX14_CONSTEXPR
 
   92      std::__enable_if_t<__is_custom_pointer<_Ptr>::value>
 
   93      destroy(_Alloc& __a, _Ptr __p)
 
   94      noexcept(
noexcept(_Base_type::destroy(__a, std::__to_address(__p))))
 
   95      { _Base_type::destroy(__a, std::__to_address(__p)); }
 
   97    static constexpr _Alloc _S_select_on_copy(
const _Alloc& __a)
 
   98    { 
return _Base_type::select_on_container_copy_construction(__a); }
 
  100    static _GLIBCXX14_CONSTEXPR 
void _S_on_swap(_Alloc& __a, _Alloc& __b)
 
  101    { std::__alloc_on_swap(__a, __b); }
 
  103    static constexpr bool _S_propagate_on_copy_assign()
 
  104    { 
return _Base_type::propagate_on_container_copy_assignment::value; }
 
  106    static constexpr bool _S_propagate_on_move_assign()
 
  107    { 
return _Base_type::propagate_on_container_move_assignment::value; }
 
  109    static constexpr bool _S_propagate_on_swap()
 
  110    { 
return _Base_type::propagate_on_container_swap::value; }
 
  112    static constexpr bool _S_always_equal()
 
  113    { 
return _Base_type::is_always_equal::value; }
 
  115    static constexpr bool _S_nothrow_move()
 
  116    { 
return _S_propagate_on_move_assign() || _S_always_equal(); }
 
  118    template<
typename _Tp>
 
  120      { 
typedef typename _Base_type::template rebind_alloc<_Tp> other; };
 
  123    typedef typename _Alloc::pointer                pointer;
 
  124    typedef typename _Alloc::const_pointer          const_pointer;
 
  125    typedef typename _Alloc::value_type             value_type;
 
  126    typedef typename _Alloc::reference              reference;
 
  127    typedef typename _Alloc::const_reference        const_reference;
 
  128    typedef typename _Alloc::size_type              size_type;
 
  129    typedef typename _Alloc::difference_type        difference_type;
 
  131    _GLIBCXX_NODISCARD 
static pointer
 
  132    allocate(_Alloc& __a, size_type __n)
 
  133    { 
return __a.allocate(__n); }
 
  135    template<
typename _H
int>
 
  136      _GLIBCXX_NODISCARD 
static pointer
 
  137      allocate(_Alloc& __a, size_type __n, _Hint __hint)
 
  138      { 
return __a.allocate(__n, __hint); }
 
  140    static void deallocate(_Alloc& __a, pointer __p, size_type __n)
 
  141    { __a.deallocate(__p, __n); }
 
  143    template<
typename _Tp>
 
  144      static void construct(_Alloc& __a, pointer __p, 
const _Tp& __arg)
 
  145      { __a.construct(__p, __arg); }
 
  147    static void destroy(_Alloc& __a, pointer __p)
 
  148    { __a.destroy(__p); }
 
  150    static size_type max_size(
const _Alloc& __a)
 
  151    { 
return __a.max_size(); }
 
  153    static const _Alloc& _S_select_on_copy(
const _Alloc& __a) { 
return __a; }
 
  155    static void _S_on_swap(_Alloc& __a, _Alloc& __b)
 
  159      std::__alloc_swap<_Alloc>::_S_do_it(__a, __b);
 
  162    template<
typename _Tp>
 
  164      { 
typedef typename _Alloc::template rebind<_Tp>::other other; };
 
  168_GLIBCXX_END_NAMESPACE_VERSION
 
GNU extensions for public use.
 
Uniform interface to all allocator types.
 
__detected_or_t< value_type *, __pointer, _Alloc > pointer
The allocator's pointer type.
 
typename _Size< _Alloc, difference_type >::type size_type
The allocator's size type.
 
typename _Diff< _Alloc, pointer >::type difference_type
The allocator's difference type.
 
typename _Ptr< __c_pointer, const value_type >::type const_pointer
The allocator's const pointer type.
 
_Alloc::value_type value_type
The allocated type.
 
Uniform interface to C++98 and C++11 allocators.