// Copyright (C) 2011 The Android Open Source Project
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
// 3. Neither the name of the project nor the names of its contributors
//    may be used to endorse or promote products derived from this software
//    without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
// SUCH DAMAGE.
//
// new: Dynamic storage management.

#ifndef __GABIXX_NEW__
#define __GABIXX_NEW__

#if !defined(GABIXX_LIBCXX)

#include <cstddef>
#include <exception>

namespace std
{
  struct nothrow_t {};
  extern const nothrow_t nothrow;
  typedef void (*new_handler)();

class bad_alloc : public exception {
public:
  bad_alloc() throw();
  virtual ~bad_alloc() throw();
  virtual const char* what() const throw();
};

typedef void (*new_handler)();
new_handler set_new_handler(new_handler) throw();

}

void* operator new(std::size_t size) throw(std::bad_alloc);
void* operator new(std::size_t size, const std::nothrow_t&) throw();
void* operator new[](std::size_t size) throw(std::bad_alloc);
void* operator new[](std::size_t size, const std::nothrow_t&) throw();

void  operator delete[](void* ptr) throw();
void  operator delete[](void* const, std::nothrow_t&) throw();
void  operator delete(void* ptr) throw();
void  operator delete(void*, const std::nothrow_t&) throw();

inline void* operator new(std::size_t, void* p) throw() { return p; }
inline void* operator new[](std::size_t, void* p) throw() { return p; }
inline void  operator delete(void*, void*) throw() {}
inline void  operator delete[](void*, void*) throw() {}

#endif // !defined(GABIXX_LIBCXX)

#endif // __GABIXX_NEW__
