#define AR_CHUNK_SIZE 64 // template class MCArray { protected: TYPE * _dataPtr; int _elementsCount; int _capacity; public: MCArray(); virtual ~MCArray(); virtual int Add( const TYPE &element ); virtual int AddExclusive( const TYPE &element ); virtual TYPE & GetAt( int Ndx ); virtual TYPE & operator [] ( int Ndx ); virtual int Find( int startNdx, const TYPE & element ); virtual int RemoveAt( int Ndx ); virtual void Clear(void); virtual int GetCount(void); }; // // template MCArray::MCArray() { // устанавливаем переменные this->_dataPtr = NULL; this->_capacity = 0; this->_elementsCount = 0; } // template MCArray::~MCArray() { // this->_capacity = 0; this->_elementsCount = 0; // if ( this->_dataPtr != NULL ) { delete this->_dataPtr; } } // template int MCArray::AddExclusive( const TYPE &element ) { // if ( this->Find( 0, element ) < 0 ) return this->Add( element ); else return -1; } // template int MCArray::Add( const TYPE &element ) { TYPE * dPtr; // есть ли место? if ( this->_elementsCount >= this->_capacity ) { // занимаем ещё памяти dPtr = new TYPE [this->_capacity + AR_CHUNK_SIZE]; // проверка if ( dPtr == NULL ) { // return -1; } if ( this->_capacity > 0 ) { // скопируем существующие данные на новое место memcpy( dPtr, this->_dataPtr, sizeof(TYPE) * this->_capacity ); // удалим старую копию данных delete this->_dataPtr; } // скорректируем размер this->_capacity += AR_CHUNK_SIZE; // скорректируем указатель на данные this->_dataPtr = dPtr; } // копируем элемент в массив this->_dataPtr[this->_elementsCount] = element; //memcpy( this->_dataPtr + this->_elementsCount, &element, sizeof(TYPE) ); // увеличиваем счётчик элементов return ++this->_elementsCount; } // template TYPE & MCArray::GetAt( int Ndx ) { //assert( Ndx >= 0 && Ndx < this->_elementsCount ); return this->_dataPtr[Ndx]; } // template TYPE & MCArray::operator [] ( int Ndx ) { return this->GetAt( Ndx ); } // template int MCArray::Find( int startNdx, const TYPE & element ) { int i; if ( startNdx < 0 || startNdx >= this->_elementsCount ) { return -1; } for ( i = startNdx; i < this->_elementsCount; i++ ) { if ( element == this->_dataPtr[i] ) { return i; } } return -1; } // template int MCArray::RemoveAt( int Ndx ) { int mn; if ( Ndx < 0 || Ndx >= this->_elementsCount ) { return 0; } mn = this->_elementsCount - Ndx; if ( mn != 1 ) { memcpy( this->_dataPtr + Ndx, this->_dataPtr + Ndx + 1, sizeof(TYPE) * ( mn - 1 ) ); } this->_elementsCount--; return 1; } // template void MCArray::Clear() { this->_elementsCount = 0; } // template int MCArray::GetCount() { return this->_elementsCount; }