1ffeaf689SAlexander Kabaev // Allocator that wraps operator new -*- C++ -*- 2ffeaf689SAlexander Kabaev 3*f8a1b7d9SAlexander Kabaev // Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. 4ffeaf689SAlexander Kabaev // 5ffeaf689SAlexander Kabaev // This file is part of the GNU ISO C++ Library. This library is free 6ffeaf689SAlexander Kabaev // software; you can redistribute it and/or modify it under the 7ffeaf689SAlexander Kabaev // terms of the GNU General Public License as published by the 8ffeaf689SAlexander Kabaev // Free Software Foundation; either version 2, or (at your option) 9ffeaf689SAlexander Kabaev // any later version. 10ffeaf689SAlexander Kabaev 11ffeaf689SAlexander Kabaev // This library is distributed in the hope that it will be useful, 12ffeaf689SAlexander Kabaev // but WITHOUT ANY WARRANTY; without even the implied warranty of 13ffeaf689SAlexander Kabaev // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14ffeaf689SAlexander Kabaev // GNU General Public License for more details. 15ffeaf689SAlexander Kabaev 16ffeaf689SAlexander Kabaev // You should have received a copy of the GNU General Public License along 17ffeaf689SAlexander Kabaev // with this library; see the file COPYING. If not, write to the Free 18*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 19ffeaf689SAlexander Kabaev // USA. 20ffeaf689SAlexander Kabaev 21ffeaf689SAlexander Kabaev // As a special exception, you may use this file as part of a free software 22ffeaf689SAlexander Kabaev // library without restriction. Specifically, if other files instantiate 23ffeaf689SAlexander Kabaev // templates or use macros or inline functions from this file, or you compile 24ffeaf689SAlexander Kabaev // this file and link it with other files to produce an executable, this 25ffeaf689SAlexander Kabaev // file does not by itself cause the resulting executable to be covered by 26ffeaf689SAlexander Kabaev // the GNU General Public License. This exception does not however 27ffeaf689SAlexander Kabaev // invalidate any other reasons why the executable file might be covered by 28ffeaf689SAlexander Kabaev // the GNU General Public License. 29ffeaf689SAlexander Kabaev 30*f8a1b7d9SAlexander Kabaev /** @file ext/new_allocator.h 31*f8a1b7d9SAlexander Kabaev * This file is a GNU extension to the Standard C++ Library. 32*f8a1b7d9SAlexander Kabaev */ 33*f8a1b7d9SAlexander Kabaev 34ffeaf689SAlexander Kabaev #ifndef _NEW_ALLOCATOR_H 35ffeaf689SAlexander Kabaev #define _NEW_ALLOCATOR_H 1 36ffeaf689SAlexander Kabaev 37ffeaf689SAlexander Kabaev #include <new> 38*f8a1b7d9SAlexander Kabaev #include <bits/functexcept.h> 39ffeaf689SAlexander Kabaev 40*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) 41*f8a1b7d9SAlexander Kabaev 42*f8a1b7d9SAlexander Kabaev using std::size_t; 43*f8a1b7d9SAlexander Kabaev using std::ptrdiff_t; 44*f8a1b7d9SAlexander Kabaev 45ffeaf689SAlexander Kabaev /** 46ffeaf689SAlexander Kabaev * @brief An allocator that uses global new, as per [20.4]. 47ffeaf689SAlexander Kabaev * 48ffeaf689SAlexander Kabaev * This is precisely the allocator defined in the C++ Standard. 49ffeaf689SAlexander Kabaev * - all allocation calls operator new 50ffeaf689SAlexander Kabaev * - all deallocation calls operator delete 51ffeaf689SAlexander Kabaev */ 52ffeaf689SAlexander Kabaev template<typename _Tp> 53ffeaf689SAlexander Kabaev class new_allocator 54ffeaf689SAlexander Kabaev { 55ffeaf689SAlexander Kabaev public: 56ffeaf689SAlexander Kabaev typedef size_t size_type; 57ffeaf689SAlexander Kabaev typedef ptrdiff_t difference_type; 58ffeaf689SAlexander Kabaev typedef _Tp* pointer; 59ffeaf689SAlexander Kabaev typedef const _Tp* const_pointer; 60ffeaf689SAlexander Kabaev typedef _Tp& reference; 61ffeaf689SAlexander Kabaev typedef const _Tp& const_reference; 62ffeaf689SAlexander Kabaev typedef _Tp value_type; 63ffeaf689SAlexander Kabaev 64ffeaf689SAlexander Kabaev template<typename _Tp1> 65ffeaf689SAlexander Kabaev struct rebind 66ffeaf689SAlexander Kabaev { typedef new_allocator<_Tp1> other; }; 67ffeaf689SAlexander Kabaev throw()68ffeaf689SAlexander Kabaev new_allocator() throw() { } 69ffeaf689SAlexander Kabaev throw()70ffeaf689SAlexander Kabaev new_allocator(const new_allocator&) throw() { } 71ffeaf689SAlexander Kabaev 72ffeaf689SAlexander Kabaev template<typename _Tp1> new_allocator(const new_allocator<_Tp1> &)73ffeaf689SAlexander Kabaev new_allocator(const new_allocator<_Tp1>&) throw() { } 74ffeaf689SAlexander Kabaev throw()75ffeaf689SAlexander Kabaev ~new_allocator() throw() { } 76ffeaf689SAlexander Kabaev 77ffeaf689SAlexander Kabaev pointer address(reference __x)78ffeaf689SAlexander Kabaev address(reference __x) const { return &__x; } 79ffeaf689SAlexander Kabaev 80ffeaf689SAlexander Kabaev const_pointer address(const_reference __x)81ffeaf689SAlexander Kabaev address(const_reference __x) const { return &__x; } 82ffeaf689SAlexander Kabaev 83ffeaf689SAlexander Kabaev // NB: __n is permitted to be 0. The C++ standard says nothing 84ffeaf689SAlexander Kabaev // about what the return value is when __n == 0. 85ffeaf689SAlexander Kabaev pointer 86ffeaf689SAlexander Kabaev allocate(size_type __n, const void* = 0) 87*f8a1b7d9SAlexander Kabaev { 88*f8a1b7d9SAlexander Kabaev if (__builtin_expect(__n > this->max_size(), false)) 89*f8a1b7d9SAlexander Kabaev std::__throw_bad_alloc(); 90*f8a1b7d9SAlexander Kabaev 91*f8a1b7d9SAlexander Kabaev return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp))); 92*f8a1b7d9SAlexander Kabaev } 93ffeaf689SAlexander Kabaev 94ffeaf689SAlexander Kabaev // __p is not permitted to be a null pointer. 95ffeaf689SAlexander Kabaev void deallocate(pointer __p,size_type)96ffeaf689SAlexander Kabaev deallocate(pointer __p, size_type) 97ffeaf689SAlexander Kabaev { ::operator delete(__p); } 98ffeaf689SAlexander Kabaev 99ffeaf689SAlexander Kabaev size_type max_size()100ffeaf689SAlexander Kabaev max_size() const throw() 101ffeaf689SAlexander Kabaev { return size_t(-1) / sizeof(_Tp); } 102ffeaf689SAlexander Kabaev 103ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS 104ffeaf689SAlexander Kabaev // 402. wrong new expression in [some_] allocator::construct 105ffeaf689SAlexander Kabaev void construct(pointer __p,const _Tp & __val)106ffeaf689SAlexander Kabaev construct(pointer __p, const _Tp& __val) 107ffeaf689SAlexander Kabaev { ::new(__p) _Tp(__val); } 108ffeaf689SAlexander Kabaev 109ffeaf689SAlexander Kabaev void destroy(pointer __p)110ffeaf689SAlexander Kabaev destroy(pointer __p) { __p->~_Tp(); } 111ffeaf689SAlexander Kabaev }; 112ffeaf689SAlexander Kabaev 113ffeaf689SAlexander Kabaev template<typename _Tp> 114ffeaf689SAlexander Kabaev inline bool 115ffeaf689SAlexander Kabaev operator==(const new_allocator<_Tp>&, const new_allocator<_Tp>&) 116ffeaf689SAlexander Kabaev { return true; } 117ffeaf689SAlexander Kabaev 118ffeaf689SAlexander Kabaev template<typename _Tp> 119ffeaf689SAlexander Kabaev inline bool 120ffeaf689SAlexander Kabaev operator!=(const new_allocator<_Tp>&, const new_allocator<_Tp>&) 121ffeaf689SAlexander Kabaev { return false; } 122*f8a1b7d9SAlexander Kabaev 123*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE 124ffeaf689SAlexander Kabaev 125ffeaf689SAlexander Kabaev #endif 126