//==========================================================
// MemoryManager.h
//
// Définition de la classe CMemoryManager
//
//==========================================================

#ifndef MEMORYMANAGER_H
#define MEMORYMANAGER_H

//==========================================================
// En-têtes
//==========================================================
#include <MemoryManager/File.h>
#include <fstream>
#include <map>
#include <stack>
#include <string>

    //==========================================================
    // Gestionnaire de mémoire - détecte les fuites
    //==========================================================
    class MemoryManager
    {
	private:
		struct MemoryBlock{
			std::string file;
			int line;
			int size;
			bool array;
		};
		struct FileReport{
			std::map<int,int> lignes;
			int nbAllocations;
			int maxSizeAllocated;
			int currentSizeAllocated;
			FileReport(){
				this->nbAllocations = 0;
				this->maxSizeAllocated = 0;
				this->currentSizeAllocated = 0;
			}
		};
		std::map<int,MemoryBlock> memoryHeap;
		std::map<std::string,FileReport > fileAllocationReporter;
		int maxMemoryUsed;
		int currentMemoryUsed;
		int nbAllocation;
		int nbDesallocation;
    public :
		/**
		 * constructeur par defaut
		 */
		MemoryManager();
		/**
		 * destructeur par defaut
		 */
		~MemoryManager();

		/**
		 * l'instance unique de memory manager.
		 */
		static MemoryManager& getInstance();

		/**
		 * methode appelée lors de l'allocation
		 */
		void* allocation(int size,const std::string& file, int line,bool array);

		/**
		 * methode appelée lors de la desallocation
		 */
		void desallocation(void * address, bool array);

		
	};

#endif // MEMORYMANAGER_H
