//----------------------------------------------------
/**
	\file		ctk/src/memclaim.h
	\ingroup	other
	\ingroup	all

	\brief		Knihovna nenavratnych alokaci v predem vymezene oblasti
				<<< ALL >>>

	\author		ConTeK s.r.o., Ing. Pavel Bazika
	\version	01.01
	\date		08.11.2010
*/
//----------------------------------------------------

#ifndef _MEMCLAIM_H_
#define _MEMCLAIM_H_

//----------------------------------------------------
/**
	\brief	Makro alokujici misto pro dany typ

	\param	_type	Typ, pro ktery alokujeme misto

	\return		Ukazatel na zacatek alokovane oblasti; NULL, pokud se alokace nezdarila
*/
//----------------------------------------------------

#define MemClaimAlloc(_type) \
	((_type *)MemClaimAllocMemory(sizeof(_type)))


//----------------------------------------------------
/**
	\brief	Makro alokujici misto pro pole daneho typu

	\param	_type	Typ polozky pole
	\param	_count	Pocet polozek pole

	\return		Ukazatel na zacatek alokovane oblasti; NULL, pokud se alokace nezdarila
*/
//----------------------------------------------------

#define MemClaimAllocArray(_type, _count) \
	((_type *)MemClaimAllocMemory(sizeof(_type) * (_count)))


//----------------------------------------------------
/**
	\brief	Funkce zjisti celkovou kapacitu memclaim

	\return		Pocet bytu, ktery je na pocatku k dispozici
*/
//----------------------------------------------------

uint32_t MemClaimGetCapacity(void);


//----------------------------------------------------
/**
	\brief	Funkce zjisti, kolik kapacity je jiz obsazeno

	\return		Pocet bytu, ktere jiz byly alokovany
*/
//----------------------------------------------------

uint32_t MemClaimGetOccupiedBytes(void);


//----------------------------------------------------
/**
	\brief	Funkce zjisti, kolik kapacity je jeste volne

	\return		Pocet bytu, ktere jsou jeste k dispozici pro alokaci
*/
//----------------------------------------------------

uint32_t MemClaimGetFreeBytes(void);


//----------------------------------------------------
/**
	\brief	Pozadavek na alokaci pameti

	\param	_size	Pocet bytu, ktere chceme alokovat

	\return		Ukazatel na pocatek alokovane oblasti
*/
//----------------------------------------------------

void * MemClaimAllocMemory(uint32_t _size);


//----------------------------------------------------
/**
	\brief	Funkce odvolava posledni alokaci

	\param	_ptr	Ukazatel na domnelou posledni alokaci

	\return 	TRUE, pokud byla posledni alokace zrusena

	Vzhledem k povaze algoritmu alokace pameti je mozne odvolat vzdy jen
	posledni alokaci. Ukazatel _ptr zde slouzi pouze pro kontrolu, zda
	rusena oblast byla opravdu jako posledni alokovana.
*/
//----------------------------------------------------

bool_t MemClaimUnrollLastAlloc(const void * const _ptr);


//----------------------------------------------------
/**
	\brief	Inicializace knihovny memclaim

	\return		TRUE, pokud byla inicializace uspesna
*/
//----------------------------------------------------

bool_t MemClaimInitialize(void);


//----------------------------------------------------
/**
	\brief	Finalizace knihovny memclaim
*/
//----------------------------------------------------

void MemClaimFinalize(void);

#endif /* _MEMCLAIM_H_ */
