/********************************************************************************
*	ファイル名：MemManager.h													*
*	用　　　途：メモリ管理														*
*	備　　　考：																*
*	履　　　歴：2009.09.23 H.Saito 64bit対応									*
********************************************************************************/
/****************************
*	 コンパイル環境設定		*
****************************/
#pragma once
/****************************
*	インクルードファイル	*
****************************/
#include "System.h"
/****************************
*		 マクロ定数			*
****************************/

/***** メモリの取得方法 *****/
#define	CMEM_ALLOC_NONE		0						// メモリ取得設定なし
#define	CMEM_ALLOC_NEW		1						// new演算子を使ったメモリ取得
#define CMEM_ALLOC_HEAP		2						// ヒープから取得
#define CMEM_ALLOC_PHYS		3						// 物理メモリから取得
#define CMEM_ALLOC_STATIC	4						// 使用者がメモリを取得（管理なし）
#define	CMEM_ALLOC_VMEM		5						// 仮想メモリ

/***** Realloc 第３パラメータ *****/
#define	CMEM_REALLOC_NE		0						// サイズが異なればリサイズ
#define	CMEM_REALLOC_LT		1						// サイズが足りなければリサイズ
/****************************
*		 構造体定義			*
****************************/
/****************************
*		 クラス定義			*
****************************/
/****************************
*		 クラス定義			*
****************************/
class CMemManager
{
public:
							CMemManager();
	virtual				   ~CMemManager();
			BOOL			SetAllocKind(INT32 nAllocKind, PBYTE upPtr = 0, SIZE_T uSize = 0, PVOID vpInfo = 0);
			PBYTE			Alloc(SIZE_T uSize);
			PBYTE			Realloc(SIZE_T uSize, DWORD dwFlags = HEAP_ZERO_MEMORY, INT32 nOption = CMEM_REALLOC_NE);
			PBYTE			ReallocNe(SIZE_T uSize);
			PBYTE			ReallocLt(SIZE_T uSize);
			PBYTE			GetPtr();
			BOOL			Free();
			INT32			GetAllocKind();
			BOOL			Move(CMemManager& dstMem);
			BOOL			Copy(CMemManager& dstMem, SIZE_T uSize = 0);
			SIZE_T			Size();
			BOOL			IsEmpty();
			void			Clear();

protected:
			HANDLE			m_vpHeapHandle;			// ヒープメモリハンドル
			PHYSMEMLOCK		m_tPhysMemLock;			// 物理メモリ取得時の引数の構造体
			PBYTE			m_upMem;				// 取得しているメモリの先頭ポインタ
			INT32			m_nAllocKind;			// メモリの取得方法
			SIZE_T			m_uSize;				// メモリの取得サイズ
};
/****************************
*		 関数　定義			*
****************************/
/****************************
*		 変数　定義			*
****************************/

