1*e4b17023SJohn Marino // array allocator -*- C++ -*- 2*e4b17023SJohn Marino 3*e4b17023SJohn Marino // Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 4*e4b17023SJohn Marino // Free Software Foundation, Inc. 5*e4b17023SJohn Marino // 6*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library. This library is free 7*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the 8*e4b17023SJohn Marino // terms of the GNU General Public License as published by the 9*e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option) 10*e4b17023SJohn Marino // any later version. 11*e4b17023SJohn Marino 12*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful, 13*e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of 14*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*e4b17023SJohn Marino // GNU General Public License for more details. 16*e4b17023SJohn Marino 17*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional 18*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version 19*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation. 20*e4b17023SJohn Marino 21*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and 22*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program; 23*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>. 25*e4b17023SJohn Marino 26*e4b17023SJohn Marino /** @file ext/array_allocator.h 27*e4b17023SJohn Marino * This file is a GNU extension to the Standard C++ Library. 28*e4b17023SJohn Marino */ 29*e4b17023SJohn Marino 30*e4b17023SJohn Marino #ifndef _ARRAY_ALLOCATOR_H 31*e4b17023SJohn Marino #define _ARRAY_ALLOCATOR_H 1 32*e4b17023SJohn Marino 33*e4b17023SJohn Marino #include <bits/c++config.h> 34*e4b17023SJohn Marino #include <new> 35*e4b17023SJohn Marino #include <bits/functexcept.h> 36*e4b17023SJohn Marino #include <tr1/array> 37*e4b17023SJohn Marino #include <bits/move.h> 38*e4b17023SJohn Marino 39*e4b17023SJohn Marino namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) 40*e4b17023SJohn Marino { 41*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_VERSION 42*e4b17023SJohn Marino 43*e4b17023SJohn Marino using std::size_t; 44*e4b17023SJohn Marino using std::ptrdiff_t; 45*e4b17023SJohn Marino 46*e4b17023SJohn Marino /// Base class. 47*e4b17023SJohn Marino template<typename _Tp> 48*e4b17023SJohn Marino class array_allocator_base 49*e4b17023SJohn Marino { 50*e4b17023SJohn Marino public: 51*e4b17023SJohn Marino typedef size_t size_type; 52*e4b17023SJohn Marino typedef ptrdiff_t difference_type; 53*e4b17023SJohn Marino typedef _Tp* pointer; 54*e4b17023SJohn Marino typedef const _Tp* const_pointer; 55*e4b17023SJohn Marino typedef _Tp& reference; 56*e4b17023SJohn Marino typedef const _Tp& const_reference; 57*e4b17023SJohn Marino typedef _Tp value_type; 58*e4b17023SJohn Marino 59*e4b17023SJohn Marino pointer 60*e4b17023SJohn Marino address(reference __x) const _GLIBCXX_NOEXCEPT 61*e4b17023SJohn Marino { return std::__addressof(__x); } 62*e4b17023SJohn Marino 63*e4b17023SJohn Marino const_pointer 64*e4b17023SJohn Marino address(const_reference __x) const _GLIBCXX_NOEXCEPT 65*e4b17023SJohn Marino { return std::__addressof(__x); } 66*e4b17023SJohn Marino 67*e4b17023SJohn Marino void 68*e4b17023SJohn Marino deallocate(pointer, size_type) 69*e4b17023SJohn Marino { 70*e4b17023SJohn Marino // Does nothing. 71*e4b17023SJohn Marino } 72*e4b17023SJohn Marino 73*e4b17023SJohn Marino size_type 74*e4b17023SJohn Marino max_size() const _GLIBCXX_USE_NOEXCEPT 75*e4b17023SJohn Marino { return size_t(-1) / sizeof(_Tp); } 76*e4b17023SJohn Marino 77*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__ 78*e4b17023SJohn Marino template<typename _Up, typename... _Args> 79*e4b17023SJohn Marino void 80*e4b17023SJohn Marino construct(_Up* __p, _Args&&... __args) 81*e4b17023SJohn Marino { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); } 82*e4b17023SJohn Marino 83*e4b17023SJohn Marino template<typename _Up> 84*e4b17023SJohn Marino void 85*e4b17023SJohn Marino destroy(_Up* __p) { __p->~_Up(); } 86*e4b17023SJohn Marino #else 87*e4b17023SJohn Marino // _GLIBCXX_RESOLVE_LIB_DEFECTS 88*e4b17023SJohn Marino // 402. wrong new expression in [some_] allocator::construct 89*e4b17023SJohn Marino void 90*e4b17023SJohn Marino construct(pointer __p, const _Tp& __val) 91*e4b17023SJohn Marino { ::new((void *)__p) value_type(__val); } 92*e4b17023SJohn Marino 93*e4b17023SJohn Marino void 94*e4b17023SJohn Marino destroy(pointer __p) { __p->~_Tp(); } 95*e4b17023SJohn Marino #endif 96*e4b17023SJohn Marino }; 97*e4b17023SJohn Marino 98*e4b17023SJohn Marino /** 99*e4b17023SJohn Marino * @brief An allocator that uses previously allocated memory. 100*e4b17023SJohn Marino * This memory can be externally, globally, or otherwise allocated. 101*e4b17023SJohn Marino * @ingroup allocators 102*e4b17023SJohn Marino */ 103*e4b17023SJohn Marino template<typename _Tp, typename _Array = std::tr1::array<_Tp, 1> > 104*e4b17023SJohn Marino class array_allocator : public array_allocator_base<_Tp> 105*e4b17023SJohn Marino { 106*e4b17023SJohn Marino public: 107*e4b17023SJohn Marino typedef size_t size_type; 108*e4b17023SJohn Marino typedef ptrdiff_t difference_type; 109*e4b17023SJohn Marino typedef _Tp* pointer; 110*e4b17023SJohn Marino typedef const _Tp* const_pointer; 111*e4b17023SJohn Marino typedef _Tp& reference; 112*e4b17023SJohn Marino typedef const _Tp& const_reference; 113*e4b17023SJohn Marino typedef _Tp value_type; 114*e4b17023SJohn Marino typedef _Array array_type; 115*e4b17023SJohn Marino 116*e4b17023SJohn Marino private: 117*e4b17023SJohn Marino array_type* _M_array; 118*e4b17023SJohn Marino size_type _M_used; 119*e4b17023SJohn Marino 120*e4b17023SJohn Marino public: 121*e4b17023SJohn Marino template<typename _Tp1, typename _Array1 = _Array> 122*e4b17023SJohn Marino struct rebind 123*e4b17023SJohn Marino { typedef array_allocator<_Tp1, _Array1> other; }; 124*e4b17023SJohn Marino 125*e4b17023SJohn Marino array_allocator(array_type* __array = 0) _GLIBCXX_USE_NOEXCEPT 126*e4b17023SJohn Marino : _M_array(__array), _M_used(size_type()) { } 127*e4b17023SJohn Marino 128*e4b17023SJohn Marino array_allocator(const array_allocator& __o) _GLIBCXX_USE_NOEXCEPT 129*e4b17023SJohn Marino : _M_array(__o._M_array), _M_used(__o._M_used) { } 130*e4b17023SJohn Marino 131*e4b17023SJohn Marino template<typename _Tp1, typename _Array1> 132*e4b17023SJohn Marino array_allocator(const array_allocator<_Tp1, _Array1>&) 133*e4b17023SJohn Marino _GLIBCXX_USE_NOEXCEPT 134*e4b17023SJohn Marino : _M_array(0), _M_used(size_type()) { } 135*e4b17023SJohn Marino 136*e4b17023SJohn Marino ~array_allocator() _GLIBCXX_USE_NOEXCEPT { } 137*e4b17023SJohn Marino 138*e4b17023SJohn Marino pointer 139*e4b17023SJohn Marino allocate(size_type __n, const void* = 0) 140*e4b17023SJohn Marino { 141*e4b17023SJohn Marino if (_M_array == 0 || _M_used + __n > _M_array->size()) 142*e4b17023SJohn Marino std::__throw_bad_alloc(); 143*e4b17023SJohn Marino pointer __ret = _M_array->begin() + _M_used; 144*e4b17023SJohn Marino _M_used += __n; 145*e4b17023SJohn Marino return __ret; 146*e4b17023SJohn Marino } 147*e4b17023SJohn Marino }; 148*e4b17023SJohn Marino 149*e4b17023SJohn Marino template<typename _Tp, typename _Array> 150*e4b17023SJohn Marino inline bool 151*e4b17023SJohn Marino operator==(const array_allocator<_Tp, _Array>&, 152*e4b17023SJohn Marino const array_allocator<_Tp, _Array>&) 153*e4b17023SJohn Marino { return true; } 154*e4b17023SJohn Marino 155*e4b17023SJohn Marino template<typename _Tp, typename _Array> 156*e4b17023SJohn Marino inline bool 157*e4b17023SJohn Marino operator!=(const array_allocator<_Tp, _Array>&, 158*e4b17023SJohn Marino const array_allocator<_Tp, _Array>&) 159*e4b17023SJohn Marino { return false; } 160*e4b17023SJohn Marino 161*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_VERSION 162*e4b17023SJohn Marino } // namespace 163*e4b17023SJohn Marino 164*e4b17023SJohn Marino #endif 165