/*
 * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(- *   * ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of the License "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * Nokia Corporation - initial contribution.
 *
 * Contributors:
 *
 * Description:
 * Name       : new
 * Part of    : standard c++ library.
 *
 */


#ifndef _SYMCPP_NEW_H_
#define _SYMCPP_NEW_H_


#ifndef _STLP_FEATURES_H
#  include <stl/config/features.h>
#endif



# ifdef __EABI__
#  include <stl/_cstddef.h> //Include the STLP internal header to make macros/typedefs expected of <csddef> available.
#  define _STLP_CSTDDEF		//Define this macro so that <cstddef> doesn't get included by new_eabi.h

#include "exception"

namespace std
{
	typedef unsigned size_t;

	class bad_alloc : public exception
		{
	public:
		IMPORT_C bad_alloc() __NO_THROW;
		IMPORT_C bad_alloc(const bad_alloc&) __NO_THROW;
		IMPORT_C bad_alloc& operator=(const bad_alloc&) __NO_THROW;  // { return *this;}

		IMPORT_C virtual ~bad_alloc() __NO_THROW;  // {}
		IMPORT_C virtual const char* what() const __NO_THROW; //  { return "bad_alloc";}
		};
	
	struct nothrow_t {};
	extern const nothrow_t nothrow;

	typedef void (*new_handler)();

	IMPORT_C new_handler set_new_handler(new_handler) __NO_THROW;
}

// Single-object form

IMPORT_C void* operator new(std::size_t) __THROW(std::bad_alloc);
IMPORT_C void  operator delete(void*) __NO_THROW;

IMPORT_C void* operator new(std::size_t, const std::nothrow_t&) __NO_THROW;
IMPORT_C void  operator delete(void*, const std::nothrow_t&) __NO_THROW;

#ifndef __PLACEMENT_NEW_INLINE
	#define __PLACEMENT_NEW_INLINE
	inline void* operator new(std::size_t, void* p) __NO_THROW
		{
		return p;
		}

	inline void operator delete(void*, void*) __NO_THROW
		{
		}
#endif

// Array form

IMPORT_C void* operator new[](std::size_t) __THROW(std::bad_alloc);
IMPORT_C void  operator delete[](void*) __NO_THROW;

IMPORT_C void* operator new[](std::size_t, const std::nothrow_t&) __NO_THROW;
IMPORT_C void  operator delete[](void*, const std::nothrow_t&) __NO_THROW;

#ifndef __PLACEMENT_VEC_NEW_INLINE
	#define __PLACEMENT_VEC_NEW_INLINE 
	inline void* operator new[](std::size_t, void* p) __NO_THROW
		{
		return p;
		}

	inline void operator delete[](void*, void*) __NO_THROW
		{
		}
#endif

// Symbian additions (not part of standard C++).
IMPORT_C void* operator new(std::size_t, std::size_t) __NO_THROW;
IMPORT_C void  operator delete(void*, std::size_t) __NO_THROW;





# else
#  include <exception>
#  include <stl/_cstddef.h>
#  include <e32def.h>
namespace std {

	struct nothrow_t { };
	extern const nothrow_t nothrow;

	class bad_alloc : public exception {
	public :
		bad_alloc () __NO_THROW {};
		bad_alloc ( const bad_alloc &) __NO_THROW {};
		bad_alloc & operator =( const bad_alloc &) __NO_THROW { return *this;}
		virtual const char * what () const __NO_THROW { return "bad_alloc";}
	};

	typedef void (* new_handler )();
	new_handler set_new_handler ( new_handler new_p ) __NO_THROW;
}

IMPORT_C void* operator new    (std::size_t) __THROW(std::bad_alloc);
IMPORT_C void  operator delete (void*)       __NO_THROW;

IMPORT_C void* operator new    (std::size_t, const std::nothrow_t&) __NO_THROW;
IMPORT_C void  operator delete (void*, const std::nothrow_t&)       __NO_THROW;

IMPORT_C void* operator new[]    (std::size_t) __THROW(std::bad_alloc);
IMPORT_C void  operator delete[] (void*)       __NO_THROW;

IMPORT_C void* operator new[]    (std::size_t, const std::nothrow_t&) __NO_THROW;
IMPORT_C void  operator delete[] (void*, const std::nothrow_t&)       __NO_THROW;

#   ifndef __PLACEMENT_NEW_INLINE
#   define __PLACEMENT_NEW_INLINE
inline void* operator new(std::size_t, void* aBase) __NO_THROW
	{return aBase;}

inline void operator delete(void*,  void*)  __NO_THROW	{} 
#   endif //__PLACEMENT_NEW_INLINE

#   ifndef __PLACEMENT_VEC_NEW_INLINE
#   define __PLACEMENT_VEC_NEW_INLINE
inline void* operator new[](std::size_t, void* aBase)  __NO_THROW
	{return aBase;}

inline void operator delete[](void* , void*)  __NO_THROW {}
#   endif //__PLACEMENT_VEC_NEW_INLINE

# endif //__EABI__
#endif //_SYMCPP_NEW_H_
