// Для классов которые можно двигать в памяти (все стандартые, все структуры и многие классы)
template <class TYPE>
class C_MemoryManagerStruct
{
public:
static TYPE * Alloc(unsigned int size)
{
// Local variables
TYPE * lpType = (TYPE *)memAlloc(size * sizeof(TYPE));
// Code
if (lpType != NULL)
{
for (unsigned int i = 0; i < Size(lpType); i++)
{
new(lpType + i) TYPE;
}
}
return lpType;
}
static TYPE * ReAlloc(TYPE * lpType,unsigned int sizeNew)
{
if (sizeNew == 0)
{
Free(lpType);
return NULL;
}
if (lpType == NULL)
{
return Alloc(sizeNew);
}
if (sizeNew > Size(lpType))
{
// Local variables
unsigned int sizeOld = Size(lpType);
TYPE * lpTypeNew = (TYPE *)memRealloc(lpType,sizeNew * sizeof(TYPE));
// Code
if (lpTypeNew != NULL)
{
return lpTypeNew;
}
else
{
return NULL;
}
}
else
{
return lpType;
}
}
static void Free(TYPE * lpType)
{
for (unsigned int i = 0; i < Size(lpType); i++)
{
(lpType + i)->~TYPE();
}
memFree(lpType);
}
static unsigned int Size(TYPE * lpType)
{
return memSize(lpType) / sizeof(TYPE);
}
static Copy(TYPE * lpTypeDestination,const TYPE * lpTypeSource,unsigned int size)
{
memcpy(lpTypeDestination,const_cast<TYPE *>(lpTypeSource),size * sizeof(TYPE));
}
static Move(TYPE * lpTypeDestination,const TYPE * lpTypeSource,unsigned int size)
{
memmove(lpTypeDestination,const_cast<TYPE *>(lpTypeSource),size * sizeof(TYPE));
}
static Fill(TYPE * lpType,TYPE element,unsigned int size)
{
DEBUG_CHECK(size > 0)
// Local variables
unsigned int blockSize = 1;
unsigned int blockShift = 1;
// Code
memmove(lpType,&element,sizeof(element));
while(blockShift < size)
{
memmove(lpType + blockShift,lpType,blockSize);
blockShift <<= 1;
blockSize <<= 1;
if (blockShift + blockSize > size)
{
blockSize = size - blockShift;
}
}
}
};
// Для классов которые нельзя двигать в памяти (с int,float,bool... не использовать)
template <class TYPE>
class C_MemoryManagerClass
{
public:
static TYPE * Alloc(unsigned int size)
{
// Local variables
TYPE * lpType = (TYPE *)memAlloc(size * sizeof(TYPE));
// Code
if (lpType != NULL)
{
for (unsigned int i = 0; i < Size(lpType); i++)
{
new(lpType + i) TYPE;
}
}
return lpType;
}
static TYPE * ReAlloc(TYPE * lpType,unsigned int sizeNew)
{
if (sizeNew == 0)
{
Free(lpType);
return NULL;
}
if (lpType == NULL)
{
return Alloc(sizeNew);
}
if (sizeNew > Size(lpType))
{
// Local variables
TYPE * lpTypeNew = Alloc(sizeNew);
// Code
if (lpTypeNew != NULL)
{
Copy(lpTypeNew,lpType,Size(lpType));
Free(lpType);
return lpTypeNew;
}
else
{
return NULL;
}
}
else
{
return lpType;
}
}
static void Free(TYPE * lpType)
{
for (unsigned int i = 0; i < Size(lpType); i++)
{
(lpType + i)->~TYPE();
}
memFree(lpType);
}
static unsigned int Size(TYPE * lpType)
{
return memSize(lpType) / sizeof(TYPE);
}
static Copy(TYPE * lpTypeDestination,const TYPE * lpTypeSource,unsigned int size)
{
for(unsigned int i = 0; i < size; i++)
{
*(lpTypeDestination + i) = temporary<TYPE>(*(const_cast<TYPE *>(lpTypeSource) + i));
}
}
static Move(TYPE * lpTypeDestination,const TYPE * lpTypeSource,unsigned int size)
{
if (lpTypeDestination > lpTypeSource)
{
for(unsigned int i = size; i > 0; --i)
{
*(lpTypeDestination + i) = temporary<TYPE>(*(const_cast<TYPE *>(lpTypeSource) + i));
}
}
else
{
for(unsigned int i = 0; i < size; i++)
{
*(lpTypeDestination + i) = temporary<TYPE>(*(const_cast<TYPE *>(lpTypeSource) + i));
}
}
}
static Fill(TYPE * lpType,TYPE element,unsigned int size)
{
for(unsigned int i = 0; i < size; i++)
{
*(lpType + i) = element;
}
}
};