19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// This file is part of the ustl library, an STL implementation.
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Copyright (C) 2005 by Mike Sharov <msharov@users.sourceforge.net>
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// This file is free software, distributed under the MIT License.
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/// \file unew.h
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project///
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/// \brief Same as \<new\>, but throws ustl:: exceptions.
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef UNEW_H_11D237512B324C9C05A55DAF1BF086F1
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define UNEW_H_11D237512B324C9C05A55DAF1BF086F1
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "uexception.h"
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/// Just like malloc, but throws on failure.
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid* throwing_malloc (size_t n) throw (ustl::bad_alloc);
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/// Just like free, but doesn't crash when given a NULL.
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid free_nullok (void* p) throw();
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef WITHOUT_LIBSTDCPP
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// These are replaceable signatures:
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//  - normal single new and delete (no arguments, throw @c bad_alloc on error)
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//  - normal array new and delete (same)
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//  - @c nothrow single new and delete (take a @c nothrow argument, return
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//    @c NULL on error)
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//  - @c nothrow array new and delete (same)
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//  Placement new and delete signatures (take a memory address argument,
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//  does nothing) may not be replaced by a user's program.
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline void* operator new (size_t n) throw (ustl::bad_alloc)	{ return (throwing_malloc (n)); }
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline void* operator new[] (size_t n) throw (ustl::bad_alloc)	{ return (throwing_malloc (n)); }
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline void  operator delete (void* p) throw()			{ free_nullok (p); }
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline void  operator delete[] (void* p) throw()		{ free_nullok (p); }
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Default placement versions of operator new.
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline void* operator new (size_t, void* p) throw() { return (p); }
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline void* operator new[] (size_t, void* p) throw() { return (p); }
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Default placement versions of operator delete.
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline void  operator delete  (void*, void*) throw() { }
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline void  operator delete[](void*, void*) throw() { }
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <new>
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif	// WITHOUT_LIBSTDCPP
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53