29 #ifndef _ARRAY_ALLOCATOR_H 
   30 #define _ARRAY_ALLOCATOR_H 1 
   37 #if __cplusplus >= 201103L 
   38 #include <type_traits> 
   41 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
 
   43 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   49  template<
typename _Tp>
 
   53       typedef size_t        size_type;
 
   54       typedef ptrdiff_t     difference_type;
 
   56       typedef const _Tp*    const_pointer;
 
   57       typedef _Tp&          reference;
 
   58       typedef const _Tp&    const_reference;
 
   59       typedef _Tp           value_type;
 
   62       address(reference __x) 
const _GLIBCXX_NOEXCEPT
 
   66       address(const_reference __x) 
const _GLIBCXX_NOEXCEPT
 
   70       deallocate(pointer, size_type)
 
   76       max_size() 
const _GLIBCXX_USE_NOEXCEPT 
 
   77       { 
return size_t(-1) / 
sizeof(_Tp); }
 
   79 #if __cplusplus >= 201103L 
   80       template<
typename _Up, 
typename... _Args>
 
   82         construct(_Up* __p, _Args&&... __args)
 
   83     { ::new((
void *)__p) _Up(std::forward<_Args>(__args)...); }
 
   85       template<
typename _Up>
 
   87         destroy(_Up* __p) { __p->~_Up(); }
 
   92       construct(pointer __p, 
const _Tp& __val) 
 
   93       { ::new((
void *)__p) value_type(__val); }
 
   96       destroy(pointer __p) { __p->~_Tp(); }
 
   98     } _GLIBCXX_DEPRECATED;
 
  105   template<
typename _Tp, 
typename _Array = std::tr1::array<_Tp, 1> >
 
  109       typedef size_t        size_type;
 
  110       typedef ptrdiff_t     difference_type;
 
  111       typedef _Tp*          pointer;
 
  112       typedef const _Tp*    const_pointer;
 
  113       typedef _Tp&          reference;
 
  114       typedef const _Tp&    const_reference;
 
  115       typedef _Tp           value_type;
 
  116       typedef _Array        array_type;
 
  118 #if __cplusplus >= 201103L 
  121       typedef std::true_type propagate_on_container_move_assignment;
 
  125       array_type*   _M_array;
 
  129      template<
typename _Tp1, 
typename _Array1 = _Array>
 
  133     } _GLIBCXX_DEPRECATED;
 
  135       array_allocator(array_type* __array = 0) _GLIBCXX_USE_NOEXCEPT 
 
  136       : _M_array(__array), _M_used(size_type()) { }
 
  138       array_allocator(
const array_allocator& __o) _GLIBCXX_USE_NOEXCEPT 
 
  139       : _M_array(__o._M_array), _M_used(__o._M_used) { }
 
  141       template<
typename _Tp1, 
typename _Array1>
 
  142         array_allocator(
const array_allocator<_Tp1, _Array1>&)
 
  143     _GLIBCXX_USE_NOEXCEPT
 
  144     : _M_array(0), _M_used(size_type()) { }
 
  146       ~array_allocator() _GLIBCXX_USE_NOEXCEPT { }
 
  149       allocate(size_type __n, 
const void* = 0)
 
  151     if (_M_array == 0 || _M_used + __n > _M_array->size())
 
  152       std::__throw_bad_alloc();
 
  153     pointer __ret = _M_array->begin() + _M_used;
 
  157     } _GLIBCXX_DEPRECATED;
 
  159   template<
typename _Tp, 
typename _Array>
 
  161     operator==(
const array_allocator<_Tp, _Array>&,
 
  162            const array_allocator<_Tp, _Array>&)
 
  165   template<
typename _Tp, 
typename _Array>
 
  167     operator!=(
const array_allocator<_Tp, _Array>&, 
 
  168            const array_allocator<_Tp, _Array>&)
 
  171 _GLIBCXX_END_NAMESPACE_VERSION
 
GNU extensions for public use. 
_Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof. 
An allocator that uses previously allocated memory. This memory can be externally, globally, or otherwise allocated.