1ffeaf689SAlexander Kabaev // Allocator that wraps "C" malloc -*- 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/malloc_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 _MALLOC_ALLOCATOR_H 35ffeaf689SAlexander Kabaev #define _MALLOC_ALLOCATOR_H 1 36ffeaf689SAlexander Kabaev 37*f8a1b7d9SAlexander Kabaev #include <cstdlib> 38ffeaf689SAlexander Kabaev #include <new> 39*f8a1b7d9SAlexander Kabaev #include <bits/functexcept.h> 40ffeaf689SAlexander Kabaev 41*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) 42*f8a1b7d9SAlexander Kabaev 43*f8a1b7d9SAlexander Kabaev using std::size_t; 44*f8a1b7d9SAlexander Kabaev using std::ptrdiff_t; 45*f8a1b7d9SAlexander Kabaev 46ffeaf689SAlexander Kabaev /** 47*f8a1b7d9SAlexander Kabaev * @brief An allocator that uses malloc. 48ffeaf689SAlexander Kabaev * 49ffeaf689SAlexander Kabaev * This is precisely the allocator defined in the C++ Standard. 50ffeaf689SAlexander Kabaev * - all allocation calls malloc 51ffeaf689SAlexander Kabaev * - all deallocation calls free 52ffeaf689SAlexander Kabaev */ 53ffeaf689SAlexander Kabaev template<typename _Tp> 54ffeaf689SAlexander Kabaev class malloc_allocator 55ffeaf689SAlexander Kabaev { 56ffeaf689SAlexander Kabaev public: 57ffeaf689SAlexander Kabaev typedef size_t size_type; 58ffeaf689SAlexander Kabaev typedef ptrdiff_t difference_type; 59ffeaf689SAlexander Kabaev typedef _Tp* pointer; 60ffeaf689SAlexander Kabaev typedef const _Tp* const_pointer; 61ffeaf689SAlexander Kabaev typedef _Tp& reference; 62ffeaf689SAlexander Kabaev typedef const _Tp& const_reference; 63ffeaf689SAlexander Kabaev typedef _Tp value_type; 64ffeaf689SAlexander Kabaev 65ffeaf689SAlexander Kabaev template<typename _Tp1> 66ffeaf689SAlexander Kabaev struct rebind 67ffeaf689SAlexander Kabaev { typedef malloc_allocator<_Tp1> other; }; 68ffeaf689SAlexander Kabaev throw()69ffeaf689SAlexander Kabaev malloc_allocator() throw() { } 70ffeaf689SAlexander Kabaev throw()71ffeaf689SAlexander Kabaev malloc_allocator(const malloc_allocator&) throw() { } 72ffeaf689SAlexander Kabaev 73ffeaf689SAlexander Kabaev template<typename _Tp1> malloc_allocator(const malloc_allocator<_Tp1> &)74ffeaf689SAlexander Kabaev malloc_allocator(const malloc_allocator<_Tp1>&) throw() { } 75ffeaf689SAlexander Kabaev throw()76ffeaf689SAlexander Kabaev ~malloc_allocator() throw() { } 77ffeaf689SAlexander Kabaev 78ffeaf689SAlexander Kabaev pointer address(reference __x)79ffeaf689SAlexander Kabaev address(reference __x) const { return &__x; } 80ffeaf689SAlexander Kabaev 81ffeaf689SAlexander Kabaev const_pointer address(const_reference __x)82ffeaf689SAlexander Kabaev address(const_reference __x) const { return &__x; } 83ffeaf689SAlexander Kabaev 84ffeaf689SAlexander Kabaev // NB: __n is permitted to be 0. The C++ standard says nothing 85ffeaf689SAlexander Kabaev // about what the return value is when __n == 0. 86ffeaf689SAlexander Kabaev pointer 87ffeaf689SAlexander Kabaev allocate(size_type __n, const void* = 0) 88ffeaf689SAlexander Kabaev { 89*f8a1b7d9SAlexander Kabaev if (__builtin_expect(__n > this->max_size(), false)) 90*f8a1b7d9SAlexander Kabaev std::__throw_bad_alloc(); 91*f8a1b7d9SAlexander Kabaev 92ffeaf689SAlexander Kabaev pointer __ret = static_cast<_Tp*>(malloc(__n * sizeof(_Tp))); 93ffeaf689SAlexander Kabaev if (!__ret) 94*f8a1b7d9SAlexander Kabaev std::__throw_bad_alloc(); 95ffeaf689SAlexander Kabaev return __ret; 96ffeaf689SAlexander Kabaev } 97ffeaf689SAlexander Kabaev 98ffeaf689SAlexander Kabaev // __p is not permitted to be a null pointer. 99ffeaf689SAlexander Kabaev void deallocate(pointer __p,size_type)100ffeaf689SAlexander Kabaev deallocate(pointer __p, size_type) 101ffeaf689SAlexander Kabaev { free(static_cast<void*>(__p)); } 102ffeaf689SAlexander Kabaev 103ffeaf689SAlexander Kabaev size_type max_size()104ffeaf689SAlexander Kabaev max_size() const throw() 105ffeaf689SAlexander Kabaev { return size_t(-1) / sizeof(_Tp); } 106ffeaf689SAlexander Kabaev 107ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS 108ffeaf689SAlexander Kabaev // 402. wrong new expression in [some_] allocator::construct 109ffeaf689SAlexander Kabaev void construct(pointer __p,const _Tp & __val)110ffeaf689SAlexander Kabaev construct(pointer __p, const _Tp& __val) 111ffeaf689SAlexander Kabaev { ::new(__p) value_type(__val); } 112ffeaf689SAlexander Kabaev 113ffeaf689SAlexander Kabaev void destroy(pointer __p)114ffeaf689SAlexander Kabaev destroy(pointer __p) { __p->~_Tp(); } 115ffeaf689SAlexander Kabaev }; 116ffeaf689SAlexander Kabaev 117ffeaf689SAlexander Kabaev template<typename _Tp> 118ffeaf689SAlexander Kabaev inline bool 119ffeaf689SAlexander Kabaev operator==(const malloc_allocator<_Tp>&, const malloc_allocator<_Tp>&) 120ffeaf689SAlexander Kabaev { return true; } 121ffeaf689SAlexander Kabaev 122ffeaf689SAlexander Kabaev template<typename _Tp> 123ffeaf689SAlexander Kabaev inline bool 124ffeaf689SAlexander Kabaev operator!=(const malloc_allocator<_Tp>&, const malloc_allocator<_Tp>&) 125ffeaf689SAlexander Kabaev { return false; } 126*f8a1b7d9SAlexander Kabaev 127*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE 128ffeaf689SAlexander Kabaev 129ffeaf689SAlexander Kabaev #endif 130