blob: 28684b8e0835d840f60c5da2efd4f51f1491673c [file] [log] [blame]
// -*- C++ -*-
/***************************************************************************
*
* new - declarations for the Standard Library new header
*
* $Id$
*
***************************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
* Copyright 1994-2006 Rogue Wave Software.
*
**************************************************************************/
#ifndef _RWSTD_NEW_INCLUDED
#define _RWSTD_NEW_INCLUDED
#include <rw/_exception.h>
#include <rw/_new.h>
#include <rw/_defs.h>
// for compilers that define ::nothrow_t, as opposed to std::nothow_t,
// in their support library, struct nothrow_t is defined in the global
// namespace, otherwise in std
//
// +-------------------+-------------------+---------------------+
// | declaration/macro | _NO_STD_NOTHROW_T | _NO_GLOBAL_NOTHROW |
// +-------------------+-------------------+---------------------+
// | std::nothrow_t | !defined | defined |
// +-------------------+-------------------+---------------------+
// | std::nothrow_t | !defined | !defined |
// +-------------------+-------------------+---------------------+
// | std::nothrow_t | defined | defined |
// +-------------------+-------------------+---------------------+
// | using ::nothrow_t | defined | !defined |
// +-------------------+-------------------+---------------------+
#if !defined (_RWSTD_NO_STD_NOTHROW_T) || defined (_RWSTD_NO_GLOBAL_NOTHROW_T)
_RWSTD_NAMESPACE (std) {
#endif // !_RWSTD_NO_STD_NOTHROW_T || _RWSTD_NO_GLOBAL_NOTHROW_T
#if !defined (_MSC_VER) || !defined (__NOTHROW_T_DEFINED)
// disable definitions of nothrow_t in MSVC's <new.h>
# define __NOTHROW_T_DEFINED
struct nothrow_t { };
#endif // !_MSC_VER || !__NOTHROW_T_DEFINED
#if !defined (_RWSTD_NO_STD_NOTHROW_T) || defined (_RWSTD_NO_GLOBAL_NOTHROW_T)
} // namespace std
#endif // !_RWSTD_NO_STD_NOTHROW_T || _RWSTD_NO_GLOBAL_NOTHROW_T
#if defined (_RWSTD_NO_STD_NOTHROW) \
&& ( defined (_RWSTD_NO_GLOBAL_NOTHROW) \
|| !defined (_RWSTD_NO_HONOR_STD))
# define _RWSTD_EXPORT_NOTHROW _RWSTD_EXPORT
#else
# define _RWSTD_EXPORT_NOTHROW /* empty */
#endif
// declare global nothrow if we need to bring it into std namespace
#if !defined (_RWSTD_NO_GLOBAL_NOTHROW) && defined (_RWSTD_NO_STD_NOTHROW)
// export the nothrow object iff it is also defined in the library
_RWSTD_EXPORT_NOTHROW extern const nothrow_t nothrow;
#endif // !_RWSTD_NO_GLOBAL_NOTHROW_T && _RWSTD_NO_STD_NOTHROW
_RWSTD_NAMESPACE (std) {
#if defined (_RWSTD_NO_STD_NOTHROW_T) && !defined (_RWSTD_NO_GLOBAL_NOTHROW_T)
// bring the global nothrow_t into the std namespace
using ::nothrow_t;
#endif // _RWSTD_NO_STD_NOTHROW_T || !_RWSTD_NO_GLOBAL_NOTHROW_T
#if __HP_aCC != 33000 && __HP_aCC != 33100
// 18.4.1
_RWSTD_EXPORT_NOTHROW extern const nothrow_t nothrow;
#else // if (__HP_aCC == 33000) || (__HP_aCC == 33100)
// working around an HP aCC 3.30 bug (see PR #25382)
const nothrow_t nothrow = nothrow_t ();
#endif // __HP_aCC == 33000 || __HP_aCC == 33100
} // namespace std
#if !defined (_RWSTD_NO_STD_BAD_ALLOC) \
|| !defined (_RWSTD_NO_RUNTIME_IN_STD)
_RWSTD_NAMESPACE (std) {
#endif // _RWSTD_NO_STD_BAD_ALLOC || !_RWSTD_NO_RUNTIME_IN_STD
// 18.4.2.1
class _RWSTD_EXPORT bad_alloc: public _STD::exception
{
public:
// 18.4.2.1, p2
bad_alloc () _THROWS (());
// 18.4.2.1, p4
bad_alloc (const bad_alloc&) _THROWS (());
// 18.4.2.1, p4
bad_alloc& operator= (const bad_alloc&) _THROWS (());
#if !__INTEL_COMPILER || __INTEL_COMPILER > 800
// prevent ld error when replacing operator new:
// multiple definition of `operator new(unsigned long)'
~bad_alloc () _THROWS (());
// 18.4.2.1, p5
virtual const char* what () const _THROWS (());
#endif // Intel C++ > 8.0
};
#if !defined (_RWSTD_NO_STD_BAD_ALLOC) \
|| !defined (_RWSTD_NO_RUNTIME_IN_STD)
# define _RWSTD_BAD_ALLOC _STD::bad_alloc
} // namespace std
#else // if _RWSTD_NO_STD_BAD_ALLOC && _RWSTD_NO_RUNTIME_IN_STD
// working around a gcc 2.x bug (PR #24400)
# if !defined (__GNUG__) || __GNUG__ > 2
_RWSTD_NAMESPACE (std) {
_USING (::bad_alloc);
# define _RWSTD_BAD_ALLOC _STD::bad_alloc
} // namespace std
# else
# define _RWSTD_BAD_ALLOC ::bad_alloc
# endif // gcc > 2.x
#endif // _RWSTD_NO_STD_BAD_ALLOC || !_RWSTD_NO_RUNTIME_IN_STD
#if !defined (_RWSTD_NO_STD_SET_NEW_HANDLER) || defined (_MSC_VER)
// when using MSVC, declare set_new_handler() in namespace std
// even though the runtime library doesn't define it there, so
// that the declaration matches the one in the compiler's <new.h>
// (the function is defined in our library)
_RWSTD_NAMESPACE (std) {
#endif // !_RWSTD_NO_STD_SET_NEW_HANDLER || MSVC
// 18.4.2.3
typedef void (*new_handler) ();
_RWSTD_EXPORT new_handler set_new_handler (new_handler) _THROWS (());
#if !defined (_RWSTD_NO_STD_SET_NEW_HANDLER) || defined (_MSC_VER)
} // namespace std
#else // if !(!defined (_RWSTD_NO_STD_SET_NEW_HANDLER) || defined (_MSC_VER))
_RWSTD_NAMESPACE (std) {
_USING (::new_handler);
_USING (::set_new_handler);
} // namespace std
#endif // !_RWSTD_NO_STD_SET_NEW_HANDLER || MSVC
// 18.4.1.1 - replaceable
void* operator new (_RWSTD_SIZE_T) _NEW_THROWS ((_RWSTD_BAD_ALLOC));
#ifdef _RWSTD_NO_OPERATOR_NEW_NOTHROW
_RWSTD_EXPORT
#endif // _RWSTD_NO_OPERATOR_NEW_NOTHROW
void* operator new (_RWSTD_SIZE_T, const _STD::nothrow_t&) _NEW_THROWS (());
void operator delete (void*) _NEW_THROWS (());
// guarded in case a compiler has trouble with these
// (e.g. gcc 2.95.2 in conjunction with placement new)
#ifndef _RWSTD_NO_PLACEMENT_DELETE
# ifdef _RWSTD_NO_OPERATOR_DELETE_NOTHROW
_RWSTD_EXPORT
# endif // _RWSTD_NO_OPERATOR_DELETE_NOTHROW
void operator delete (void*, const _STD::nothrow_t&) _NEW_THROWS (());
#endif // _RWSTD_NO_PLACEMENT_DELETE
// 18.4.1.2 - replaceable
#ifdef _RWSTD_NO_OPERATOR_NEW_ARRAY
_RWSTD_EXPORT
#endif // _RWSTD_NO_OPERATOR_NEW_ARRAY
void* operator new[] (_RWSTD_SIZE_T) _NEW_THROWS ((_RWSTD_BAD_ALLOC));
#ifdef _RWSTD_NO_OPERATOR_NEW_ARRAY_NOTHROW
_RWSTD_EXPORT
#endif // _RWSTD_NO_OPERATOR_NEW_ARRAY_NOTHROW
void* operator new[] (_RWSTD_SIZE_T, const _STD::nothrow_t&) _NEW_THROWS (());
#ifdef _RWSTD_NO_OPERATOR_DELETE_ARRAY
_RWSTD_EXPORT
#endif // _RWSTD_NO_OPERATOR_DELETE_ARRAY
void operator delete[] (void*) _NEW_THROWS (());
#ifndef _RWSTD_NO_PLACEMENT_DELETE
# ifdef _RWSTD_NO_OPERATOR_DELETE_ARRAY_NOTHROW
_RWSTD_EXPORT
# endif // _RWSTD_NO_OPERATOR_DELETE_ARRAY_NOTHROW
void operator delete[] (void*, const _STD::nothrow_t&) _NEW_THROWS (());
#endif // _RWSTD_NO_PLACEMENT_DELETE
// 18.4.1.3, p2 - not replaceable (see <rw/_new.h>)
// void* operator new (_RWSTD_SIZE_T, void*) _NEW_THROWS (());
// 18.4.1.3, p5 - not replaceable
#ifdef _RWSTD_NO_OPERATOR_NEW_ARRAY_PLACEMENT
_RWSTD_EXPORT
#endif // _RWSTD_NO_OPERATOR_NEW_ARRAY_PLACEMENT
void* operator new[] (_RWSTD_SIZE_T, void*) _NEW_THROWS (());
#ifdef _RWSTD_NO_OPERATOR_NEW_ARRAY_PLACEMENT
// not replaceable
inline void* operator new[] (_RWSTD_SIZE_T, void *__ptr) _NEW_THROWS (())
{
return __ptr; // inline for efficiency
}
#endif // _RWSTD_NO_OPERATOR_NEW_ARRAY_PLACEMENT
#ifndef _RWSTD_NO_PLACEMENT_DELETE
// 18.4.1.3, p7 - not replaceable (see <rw/_new.h>)
// void operator delete (void*, void*) _NEW_THROWS (());
// 18.4.1.3, p9 - not replaceable
# ifdef _RWSTD_NO_OPERATOR_DELETE_ARRAY_PLACEMENT
_RWSTD_EXPORT
# endif // _RWSTD_NO_OPERATOR_DELETE_ARRAY_PLACEMENT
void operator delete[] (void*, void*) _NEW_THROWS (());
# if defined (_RWSTD_NO_OPERATOR_DELETE_ARRAY_PLACEMENT)
// not replaceable
inline void operator delete[] (void*, void*) _NEW_THROWS (())
{
// no-op, inline for efficiency
}
# endif // _RWSTD_NO_OPERATOR_DELETE_ARRAY_PLACEMENT
#endif // _RWSTD_NO_PLACEMENT_DELETE
#endif // _RWSTD_NEW_INCLUDED