1// vi:set ft=cpp: -*- Mode: C++ -*- 2/* 3 * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>, 4 * Alexander Warg <warg@os.inf.tu-dresden.de> 5 * economic rights: Technische Universität Dresden (Germany) 6 * 7 * This file is part of TUD:OS and distributed under the terms of the 8 * GNU General Public License 2. 9 * Please see the COPYING-GPL-2 file for details. 10 * 11 * As a special exception, you may use this file as part of a free software 12 * library without restriction. Specifically, if other files instantiate 13 * templates or use macros or inline functions from this file, or you compile 14 * this file and link it with other files to produce an executable, this 15 * file does not by itself cause the resulting executable to be covered by 16 * the GNU General Public License. This exception does not however 17 * invalidate any other reasons why the executable file might be covered by 18 * the GNU General Public License. 19 */ 20 21#pragma once 22 23#include <stddef.h> 24namespace cxx { 25/** 26 * \ingroup cxx_api 27 * \brief Helper type to distinguish the <c> oeprator new </c> version 28 * that does not throw exceptions. 29 */ 30class Nothrow {}; 31} 32 33/** 34 * \ingroup cxx_api 35 * \brief Simple placement new operator. 36 * \param mem the address of the memory block to place the new object. 37 * \return the address given by \a mem. 38 */ 39inline void *operator new (size_t, void *mem, cxx::Nothrow const &) throw() 40{ return mem; } 41 42/** 43 * \ingroup cxx_api 44 * \brief New operator that does not throw exceptions. 45 */ 46void *operator new (size_t, cxx::Nothrow const &) throw(); 47 48namespace cxx { 49 50 51/** 52 * \ingroup cxx_api 53 * \brief Standard allocator based on <c>operator new () </c>. 54 * 55 * This allocator is the default allocator used for the \em cxx 56 * \em Containers, such as cxx::Avl_set and cxx::Avl_map, to allocate 57 * the internal data structures. 58 */ 59template< typename _Type > 60class New_allocator 61{ 62public: 63 enum { can_free = true }; 64 65 New_allocator() throw() {} 66 New_allocator(New_allocator const &) throw() {} 67 68 ~New_allocator() throw() {} 69 70 _Type *alloc() throw() 71 { return static_cast<_Type*>(::operator new(sizeof (_Type), cxx::Nothrow())); } 72 73 void free(_Type *t) throw() 74 { ::operator delete(t); } 75}; 76 77} 78 79