19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk.
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies.
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted,
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice.
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_NEW
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_INTERNAL_NEW
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_CSTDDEF
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// size_t
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_cstddef.h>
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (__BORLANDC__) && (__BORLANDC__ < 0x570)
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// new.h uses ::malloc ;(
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include _STLP_NATIVE_CPP_C_HEADER(cstdlib)
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockusing _STLP_VENDOR_CSTD::malloc;
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_NEW_NEW_HEADER)
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// eMbedded Visual C++ .NET unfortunately uses _INC_NEW for both <new.h> and <new>
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// we undefine the symbol to get the stuff in the SDK's <new>
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if defined (_STLP_WCE_NET) && defined (_INC_NEW)
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    undef _INC_NEW
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if defined (new)
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* STLport cannot replace native Std library new header if new is a macro,
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * please define new macro after <new> header inclusion.
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    error Cannot include native new header as new is a macro.
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if defined (_STLP_HAS_INCLUDE_NEXT)
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    include_next <new>
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  else
47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    include _STLP_NATIVE_CPP_RUNTIME_HEADER(new)
489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <new.h>
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_NO_BAD_ALLOC) && !defined (_STLP_NEW_DONT_THROW_BAD_ALLOC)
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define _STLP_NEW_DONT_THROW_BAD_ALLOC 1
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_EXCEPTIONS) && defined (_STLP_NEW_DONT_THROW_BAD_ALLOC)
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  ifndef _STLP_INTERNAL_EXCEPTION
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    include <stl/_exception.h>
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if defined (_STLP_NO_BAD_ALLOC)
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct nothrow_t {};
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define nothrow nothrow_t()
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * STLport own bad_alloc exception to be used if the native C++ library
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * do not define it or when the new operator do not throw it to avoid
739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * a useless library dependency.
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass bad_alloc : public exception {
769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic:
779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bad_alloc () _STLP_NOTHROW_INHERENTLY { }
789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bad_alloc(const bad_alloc&) _STLP_NOTHROW_INHERENTLY { }
799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  bad_alloc& operator=(const bad_alloc&) _STLP_NOTHROW_INHERENTLY {return *this;}
809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  ~bad_alloc () _STLP_NOTHROW_INHERENTLY { }
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  const char* what() const _STLP_NOTHROW_INHERENTLY { return "bad alloc"; }
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block};
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_USE_EXCEPTIONS && (_STLP_NO_BAD_ALLOC || _STLP_NEW_DONT_THROW_BAD_ALLOC) */
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_OWN_NAMESPACE)
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if !defined (_STLP_NEW_DONT_THROW_BAD_ALLOC)
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockusing _STLP_VENDOR_EXCEPT_STD::bad_alloc;
94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if !defined (_STLP_NO_BAD_ALLOC)
979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockusing _STLP_VENDOR_EXCEPT_STD::nothrow_t;
989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockusing _STLP_VENDOR_EXCEPT_STD::nothrow;
99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    if defined (_STLP_GLOBAL_NEW_HANDLER)
1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockusing ::new_handler;
1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockusing ::set_new_handler;
102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    else
1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockusing _STLP_VENDOR_EXCEPT_STD::new_handler;
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockusing _STLP_VENDOR_EXCEPT_STD::set_new_handler;
105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    endif
106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif /* !_STLP_NO_BAD_ALLOC */
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif /* _STLP_USE_OWN_NAMESPACE */
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_THROW_BAD_ALLOC
112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if !defined (_STLP_USE_EXCEPTIONS)
113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    ifndef _STLP_INTERNAL_CSTDIO
114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#      include <stl/_cstdio.h>
115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    endif
116ec42173ef0955aa1844e0be303363c7e5dc98fb7James Dong#    define _STLP_THROW_BAD_ALLOC puts("out of memory\n"); abort()
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  else
118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    define _STLP_THROW_BAD_ALLOC _STLP_THROW(_STLP_STD::bad_alloc())
1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_NO_NEW_NEW_HEADER) || defined (_STLP_NEW_DONT_THROW_BAD_ALLOC)
123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define _STLP_CHECK_NULL_ALLOC(__x) void* __y = __x; if (__y == 0) { _STLP_THROW_BAD_ALLOC; } return __y
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  define _STLP_CHECK_NULL_ALLOC(__x) return __x
126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if ((defined (__IBMCPP__) || defined (__OS400__) || defined (__xlC__) || defined (qTidyHeap)) && defined (_STLP_DEBUG_ALLOC))
131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline void* _STLP_CALL __stl_new(size_t __n)   { _STLP_CHECK_NULL_ALLOC(::operator new(__n, __FILE__, __LINE__)); }
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void  _STLP_CALL __stl_delete(void* __p) { ::operator delete(__p, __FILE__, __LINE__); }
133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline void* _STLP_CALL __stl_new(size_t __n)   { _STLP_CHECK_NULL_ALLOC(::operator new(__n)); }
1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void  _STLP_CALL __stl_delete(void* __p) { ::operator delete(__p); }
136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_INTERNAL_NEW */
1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Local Variables:
1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * mode:C++
1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * End:
1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
146