#ifndef _RAR_ARRAY_ #define _RAR_ARRAY_ extern ErrorHandler ErrHandler; template class Array { private: T *Buffer; size_t BufSize; size_t AllocSize; public: Array(); Array(size_t Size); ~Array(); inline void CleanData(); inline T& operator [](size_t Item); inline size_t Size(); void Add(size_t Items); void Alloc(size_t Items); void Reset(); void operator = (Array &Src); void Push(T Item); T* Addr() {return(Buffer);} }; template void Array::CleanData() { Buffer=NULL; BufSize=0; AllocSize=0; } template Array::Array() { CleanData(); } template Array::Array(size_t Size) { Buffer=(T *)rarmalloc(sizeof(T)*Size); if (Buffer==NULL && Size!=0) ErrHandler.MemoryError(); AllocSize=BufSize=Size; } template Array::~Array() { if (Buffer!=NULL) rarfree(Buffer); } template inline T& Array::operator [](size_t Item) { return(Buffer[Item]); } template inline size_t Array::Size() { return(BufSize); } template void Array::Add(size_t Items) { BufSize+=Items; if (BufSize>AllocSize) { size_t Suggested=AllocSize+AllocSize/4+32; size_t NewSize=Max(BufSize,Suggested); Buffer=(T *)rarrealloc(Buffer,NewSize*sizeof(T)); if (Buffer==NULL) ErrHandler.MemoryError(); AllocSize=NewSize; } } template void Array::Alloc(size_t Items) { if (Items>AllocSize) Add(Items-BufSize); else BufSize=Items; } template void Array::Reset() { if (Buffer!=NULL) { rarfree(Buffer); Buffer=NULL; } BufSize=0; AllocSize=0; } template void Array::operator =(Array &Src) { Reset(); Alloc(Src.BufSize); if (Src.BufSize!=0) memcpy((void *)Buffer,(void *)Src.Buffer,Src.BufSize*sizeof(T)); } template void Array::Push(T Item) { Add(1); (*this)[Size()-1]=Item; } #endif