#pragma once

void* __new(size_t n, const char* filename,
	const char* funcname, int lineno);

//void* __new[](size_t n, const char* filename,
//	    const char* funcname, int lineno);

void __delete(void* p, const char* filename,
	const char* funcname, int lineno);

//void __delete[](void* p, const char* filename,
//	      const char* funcname, int lineno);

inline void* __cdecl operator new(size_t n)
{
	return ::__new(n, __FILE__, __FUNCTION__, __LINE__);
}

inline void __cdecl operator delete(void *p)
{
	::__delete(p, __FILE__, __FUNCTION__, __LINE__);
}

inline void* __cdecl operator new(size_t n, const char* filename, int lineno)
{
	return ::__new(n, filename, __FUNCTION__, lineno);
}

inline void __cdecl operator delete(void *p, const char* filename, int lineno)
{
	::__delete(p, filename, __FUNCTION__, lineno);
}

//#define NEW(n)	(::__new((n), __FILE__, __FUNCTION__, __LINE__))
//#define DELETE(p) (::__delete((p), __FILE__, __FUNCTION__, __LINE__))