//==========================================================
// DebugNew.h
//
// Surcharge des opérateurs / fonctions d'allocation et de
// désallocation de la mémoire pour traquer les fuites
//
//==========================================================

#ifdef _DEBUG

#ifndef DEBUGNEW_H
#define DEBUGNEW_H

//==========================================================
// En-têtes
//==========================================================
#include <MemoryManager/MemoryManager.h>


////////////////////////////////////////////////////////////
// Surcharge de l'opérateur new
//
// [in] Size : Taille à allouer
// [in] File : Fichier source
// [in] Line : Ligne dans le fichier source
//
// [retval] Pointeur sur la zone allouée
//
////////////////////////////////////////////////////////////
inline void* operator new(std::size_t size, const char* file, int line)
{
	return MemoryManager::getInstance().
					allocation(size,file,line,false);
}


////////////////////////////////////////////////////////////
// Surcharge de l'opérateur new[]
//
// [in] Size : Taille à allouer
// [in] File : Fichier source
// [in] Line : Ligne dans le fichier source
//
// [retval] Pointeur sur la zone allouée
//
////////////////////////////////////////////////////////////
inline void* operator new[](std::size_t size, const char* file, int line)
{
    return MemoryManager::getInstance().
					allocation(size,file,line,true);
}


////////////////////////////////////////////////////////////
// Surcharge de l'opérateur delete
//
// [in] Ptr : Pointeur sur la zone à libérer
//
////////////////////////////////////////////////////////////
inline void operator delete(void* ptr)
{
	MemoryManager::getInstance().
					desallocation(ptr,false);
}


////////////////////////////////////////////////////////////
// Surcharge de l'opérateur delete
//
// [in] Ptr :  Pointeur sur la zone à libérer
// [in] File : Fichier source
// [in] Line : Ligne dans le fichier source
//
////////////////////////////////////////////////////////////
inline void operator delete(void* ptr, const char* file, int line)
{
	MemoryManager::getInstance().
					desallocation(ptr,false);
}


////////////////////////////////////////////////////////////
// Surcharge de l'opérateur delete[]
//
// [in] Ptr : Pointeur sur la zone à libérer
//
////////////////////////////////////////////////////////////
inline void operator delete[](void* ptr)
{
	MemoryManager::getInstance().
					desallocation(ptr,true);
}


////////////////////////////////////////////////////////////
// Surcharge de l'opérateur delete[]
//
// [in] Ptr :  Pointeur sur la zone à libérer
// [in] File : Fichier source
// [in] Line : Ligne dans le fichier source
//
////////////////////////////////////////////////////////////
inline void operator delete[](void* ptr, const char* file, int line)
{
	MemoryManager::getInstance().
					desallocation(ptr,true);
}

#endif // DEBUGNEW_H


//==========================================================
// Définition de macros servant à automatiser le tracking
// /!\ sortir des directives anti-réinclusions !
//==========================================================
#ifndef new
    #define new    new(__FILE__, __LINE__)
//    #define delete CMemoryManager::Instance().NextDelete(__FILE__, __LINE__), delete
//    #define delete CMemoryManager::Instance().NextDelete(__FILE__, __LINE__), delete
#endif

#endif // _DEBUG
