williamr@4: /* williamr@4: * Copyright (c) 1999 williamr@4: * Boris Fomitchev williamr@4: * williamr@4: * This material is provided "as is", with absolutely no warranty expressed williamr@4: * or implied. Any use is at your own risk. williamr@4: * williamr@4: * Permission to use or copy this software for any purpose is hereby granted williamr@4: * without fee, provided the above notices are retained on all copies. williamr@4: * Permission to modify the code and to distribute modified code is granted, williamr@4: * provided the above notices are retained, and a notice that the code was williamr@4: * modified is included with the above copyright notice. williamr@4: * williamr@4: */ williamr@4: williamr@4: #ifndef _STLP_INTERNAL_NEW williamr@4: #define _STLP_INTERNAL_NEW williamr@4: williamr@4: #ifndef _STLP_INTERNAL_CSTDDEF williamr@4: // size_t williamr@4: # include williamr@4: #endif williamr@4: williamr@4: #if defined (__BORLANDC__) && (__BORLANDC__ < 0x580) williamr@4: // new.h uses ::malloc ;( williamr@4: # include _STLP_NATIVE_CPP_C_HEADER(cstdlib) williamr@4: using _STLP_VENDOR_CSTD::malloc; williamr@4: #endif williamr@4: williamr@4: #if !defined (_STLP_NO_NEW_NEW_HEADER) williamr@4: # if defined (_STLP_BROKEN_BAD_ALLOC_CLASS) williamr@4: # define bad_alloc _STLP_NULLIFIED_BROKEN_BAD_ALLOC_CLASS williamr@4: # define nothrow_t _STLP_NULLIFIED_BROKEN_BAD_NOTHROW_T_CLASS williamr@4: # define nothrow _STLP_NULLIFIED_BROKEN_BAD_NOTHROW williamr@4: # endif williamr@4: williamr@4: // eMbedded Visual C++ .NET unfortunately uses _INC_NEW for both and williamr@4: // we undefine the symbol to get the stuff in the SDK's williamr@4: # if defined (_STLP_WCE_NET) && defined (_INC_NEW) williamr@4: # undef _INC_NEW williamr@4: # endif williamr@4: williamr@4: # if defined (new) williamr@4: /* STLport cannot replace native Std library new header if new is a macro, williamr@4: * please define new macro after header inclusion. williamr@4: */ williamr@4: # error Cannot include native new header as new is a macro. williamr@4: # endif williamr@4: williamr@4: # include _STLP_NATIVE_CPP_RUNTIME_HEADER(new) williamr@4: williamr@4: # if defined (_STLP_BROKEN_BAD_ALLOC_CLASS) williamr@4: # undef bad_alloc williamr@4: # undef nothrow_t williamr@4: # undef nothrow williamr@4: # undef _STLP_NULLIFIED_BROKEN_BAD_ALLOC_CLASS williamr@4: # undef _STLP_NULLIFIED_BROKEN_BAD_NOTHROW_T_CLASS williamr@4: # undef _STLP_NULLIFIED_BROKEN_BAD_NOTHROW williamr@4: # endif williamr@4: #else williamr@4: # include williamr@4: #endif williamr@4: williamr@4: #if defined (_STLP_NO_BAD_ALLOC) && !defined (_STLP_NEW_DONT_THROW_BAD_ALLOC) williamr@4: # define _STLP_NEW_DONT_THROW_BAD_ALLOC 1 williamr@4: #endif williamr@4: williamr@4: #if defined (_STLP_USE_EXCEPTIONS) && defined (_STLP_NEW_DONT_THROW_BAD_ALLOC) williamr@4: williamr@4: # ifndef _STLP_INTERNAL_EXCEPTION williamr@4: # include williamr@4: # endif williamr@4: williamr@4: _STLP_BEGIN_NAMESPACE williamr@4: williamr@4: # if defined (_STLP_NO_BAD_ALLOC) williamr@4: struct nothrow_t {}; williamr@4: # define nothrow nothrow_t() williamr@4: # endif williamr@4: williamr@4: /* williamr@4: * STLport own bad_alloc exception to be used if the native C++ library williamr@4: * do not define it or when the new operator do not throw it to avoid williamr@4: * a useless library dependency. williamr@4: */ williamr@4: class bad_alloc : public exception { williamr@4: public: williamr@4: bad_alloc () _STLP_NOTHROW_INHERENTLY { } williamr@4: bad_alloc(const bad_alloc&) _STLP_NOTHROW_INHERENTLY { } williamr@4: bad_alloc& operator=(const bad_alloc&) _STLP_NOTHROW_INHERENTLY {return *this;} williamr@4: ~bad_alloc () _STLP_NOTHROW_INHERENTLY { } williamr@4: const char* what() const _STLP_NOTHROW_INHERENTLY { return "bad alloc"; } williamr@4: }; williamr@4: williamr@4: _STLP_END_NAMESPACE williamr@4: williamr@4: #endif /* _STLP_USE_EXCEPTIONS && (_STLP_NO_BAD_ALLOC || _STLP_NEW_DONT_THROW_BAD_ALLOC) */ williamr@4: williamr@4: #if defined (_STLP_RTTI_BUG) williamr@4: _STLP_BEGIN_NAMESPACE williamr@4: williamr@4: inline void* _STLP_CALL __stl_new(size_t __n) williamr@4: { return ::malloc(__n); } williamr@4: williamr@4: inline void _STLP_CALL __stl_delete(void* __p) williamr@4: { ::free(__p); } williamr@4: _STLP_END_NAMESPACE williamr@4: williamr@4: #else /* _STLP_RTTI_BUG */ williamr@4: williamr@4: # if defined (_STLP_USE_OWN_NAMESPACE) williamr@4: williamr@4: _STLP_BEGIN_NAMESPACE williamr@4: williamr@4: # if !defined (_STLP_NEW_DONT_THROW_BAD_ALLOC) williamr@4: using _STLP_VENDOR_EXCEPT_STD::bad_alloc; williamr@4: # endif williamr@4: williamr@4: # if !defined (_STLP_NO_BAD_ALLOC) williamr@4: using _STLP_VENDOR_EXCEPT_STD::nothrow_t; williamr@4: using _STLP_VENDOR_EXCEPT_STD::nothrow; williamr@4: # if defined (_STLP_GLOBAL_NEW_HANDLER) williamr@4: using ::new_handler; williamr@4: using ::set_new_handler; williamr@4: # else williamr@4: using _STLP_VENDOR_EXCEPT_STD::new_handler; williamr@4: using _STLP_VENDOR_EXCEPT_STD::set_new_handler; williamr@4: # endif williamr@4: # endif /* !_STLP_NO_BAD_ALLOC */ williamr@4: williamr@4: _STLP_END_NAMESPACE williamr@4: # endif /* _STLP_USE_OWN_NAMESPACE */ williamr@4: williamr@4: # if defined (_STLP_USE_EXCEPTIONS) && \ williamr@4: (defined (_STLP_NO_NEW_NEW_HEADER) || defined (_STLP_NEW_DONT_THROW_BAD_ALLOC)) williamr@4: # define _STLP_CHECK_NULL_ALLOC(__x) void* __y = __x; if (__y == 0) { _STLP_THROW(_STLP_STD::bad_alloc()); } return __y williamr@4: # else williamr@4: # define _STLP_CHECK_NULL_ALLOC(__x) return __x williamr@4: # endif williamr@4: williamr@4: _STLP_BEGIN_NAMESPACE williamr@4: williamr@4: # if ((defined (__IBMCPP__) || defined (__OS400__) || defined (__xlC__) || defined (qTidyHeap)) && defined (__DEBUG_ALLOC__)) williamr@4: inline void* _STLP_CALL __stl_new(size_t __n) { _STLP_CHECK_NULL_ALLOC(::operator _STLP_NEW(__n, __FILE__, __LINE__)); } williamr@4: inline void _STLP_CALL __stl_delete(void* __p) { ::operator delete(__p, __FILE__, __LINE__); } williamr@4: # else williamr@4: inline void* _STLP_CALL __stl_new(size_t __n) { _STLP_CHECK_NULL_ALLOC(::operator _STLP_NEW(__n)); } williamr@4: inline void _STLP_CALL __stl_delete(void* __p) { ::operator delete(__p); } williamr@4: # endif williamr@4: _STLP_END_NAMESPACE williamr@4: williamr@4: #endif /* _STLP_RTTI_BUG */ williamr@4: williamr@4: #endif /* _STLP_INTERNAL_NEW */ williamr@4: williamr@4: williamr@4: /* williamr@4: * Local Variables: williamr@4: * mode:C++ williamr@4: * End: williamr@4: */