#ifndef MemoryH
#define MemoryH

#include <windows.h>
//-----------------------------------------------------------------------------

void *m_memset(void *szBuffer, DWORD dwSym, DWORD dwLen);
void *m_memcpy(void *szBuf, const void *szStr, int nLen);
int   m_memcmp(const void *buf1, const void *buf2, size_t count);


/*---------------------------------------------------------------------------*/
// Следующие функции для выделения памяти используют VirtualAlloc
// Главный нюанс данной функции в том, что память выделяется постранично,
// что приводит к излишним затратам памяти при инициализации небольших
// структур, либо маленьких блоков памяти.
//
// Для оперирования маленькими блоками памяти используйте функции выделяющие
// память из КУЧИ процесса. Функции начинаются с MemHeap...
/*---------------------------------------------------------------------------*/

// Узнать размер выделенной памяти
DWORD  GetMemSize(LPVOID lpAddr);

// Освободить память
VOID   MemFree(LPVOID lpAddr);

// Выделить памать указанного размера
LPVOID MemAlloc(DWORD dwSize);

// Выделить и очистить память указанного размера
LPVOID MemAllocAndClear(DWORD Size);

// Перевыделить память
LPVOID MemRealloc(LPVOID lpAddr, DWORD dwSize );


/*---------------------------------------------------------------------------*/
//  Функции для работы с памятью из КУЧИ процесса
//  Данные функции являются оболочкой над WINAPI функциями для работы
//  с памятью кучи.
//  Функции выделения, перевыделения памяти работают с флагом автоматической
//  очистки выделяемой памяти
/*---------------------------------------------------------------------------*/

namespace HEAP
{
	LPVOID Alloc(DWORD Size);

	LPVOID ReAlloc(LPVOID Buf, DWORD Size);
	bool ReAlloc2(LPVOID &Buf, DWORD Size);

	void Free(LPVOID Buf);
	void Free2(LPVOID &Buf);

	DWORD Size(LPVOID Buf);
}

/*---------------------------------------------------------------------------*/
//  Набор макросов облегчающих жизнь
/*---------------------------------------------------------------------------*/

// заполняет переменную нулями
#define ClearStruct(S) m_memset(&S, 0, sizeof(S))

// Выделяет память под переменную типа и возвращает указатель
#define CreateStruct(T) (T*)HEAP::Alloc(sizeof(T))

// Выделяет память под переменную типа и возвращает указатель
#define FreeStruct(S) HEAP::Free(S);

//-----------------------------------------------------------------------------
#endif

