#ifndef SDK_MEMORY_H
#define SDK_MEMORY_H

#include <typedefs.h>
#include <trace.h>

#ifdef __cplusplus
extern "C" {
#endif

// Выделить память
// Если выделить память не удалось, то в err будет код ошибки
// Если вторым параметром было NULL то при неудаче выйдет ребут
void * suAllocMem( size_t size, INT32 * err );

// Освободить память
void suFreeMem( void * ptr );

void __rt_memclr( void *, size_t );
// Забивает нулями блок памяти
#define memclr(m,sz)			__rt_memclr((void *)m,(size_t)sz)

void * __rt_memcpy( void *, const void *, size_t );
// Копирует блоки памяти
#define memcpy(dst,src,sz)		__rt_memcpy((void *)dst,(const void *)src,(size_t)sz)

void * __rt_memset( void *, int, size_t );
// Забивает указанным байтом блок памяти
#define memset(m,byte,sz)			__rt_memset((void *)m,(int)byte,(size_t)sz)


// Ява менеджер памяти
//void * AmMemAlloc( size_t size );
//void AmMemFree( void * ptr );


// Получше чем su*Mem (но медленный)
// Для больших блоков использует su*Mem, для мЕньших - uis*Mem
// Доступно больше памяти
// После выделения еще и сам чистит память, поэтому медленный
// При неудаче нет ребута!
void * device_Alloc_mem( UINT32 count, size_t sz );
void device_Free_mem_fn( void * ptr );



// Огромная куча строк мешает
#define malloc1(sz)		suAllocMem(sz, NULL)
#define free1(mb)		suFreeMem(mb);

#ifdef __cplusplus
} /* extern "C" */
#endif


#endif // SDK_MEMORY_H