C_MemoryManager
От: adontz Грузия http://adontz.wordpress.com/
Дата: 01.03.03 19:41
Оценка:
// Для классов которые можно двигать в памяти (все стандартые, все структуры и многие классы)
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;
      }
    }
 };
A journey of a thousand miles must begin with a single step © Lau Tsu
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.