// Standard C++ dynamic memory management header

#ifndef _NEW
#define _NEW

#include <cstddef>
#include <exception>

extern "C++" {

namespace std 
{
  class bad_alloc : public exception 
  {
  public:
    bad_alloc() throw() { }

    // This declaration is not useless:
    // http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_6.html#SEC118
    virtual ~bad_alloc() throw();

    // See comment in eh_exception.cc.
    virtual const char* what() const throw();
  };

  struct nothrow_t { };

  extern const nothrow_t nothrow;
} // namespace std

typedef void (*new_handler)();

new_handler set_new_handler(new_handler) throw();

void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw();
inline void* operator new (std::size_t size, void* ptr) throw() { return ptr; }
void* operator new[] (std::size_t size, const std::nothrow_t& nothrow_constant) throw();
inline void* operator new[] (std::size_t size, void* ptr) throw() { return ptr; }

void operator delete (void* ptr) throw ();
void operator delete (void* ptr, const std::nothrow_t& nothrow_constant) throw();
inline void operator delete (void* ptr, void* voidptr2) throw() { }
void operator delete[] (void* ptr) throw ();
void operator delete[] (void* ptr, const std::nothrow_t& nothrow_constant) throw();
inline void operator delete[] (void* ptr, void* voidptr2) throw() { }
//@}
} // extern "C++"

#endif
