rlm@1: // Common/MyVector.cpp rlm@1: rlm@1: #include "StdAfx.h" rlm@1: rlm@1: #include rlm@1: rlm@1: #include "MyVector.h" rlm@1: rlm@1: CBaseRecordVector::~CBaseRecordVector() { ClearAndFree(); } rlm@1: rlm@1: void CBaseRecordVector::ClearAndFree() rlm@1: { rlm@1: Clear(); rlm@1: delete []((unsigned char *)_items); rlm@1: _capacity = 0; rlm@1: _size = 0; rlm@1: _items = 0; rlm@1: } rlm@1: rlm@1: void CBaseRecordVector::Clear() { DeleteFrom(0); } rlm@1: void CBaseRecordVector::DeleteBack() { Delete(_size - 1); } rlm@1: void CBaseRecordVector::DeleteFrom(int index) rlm@1: { rlm@1: Delete(index, _size - index); rlm@1: } rlm@1: rlm@1: void CBaseRecordVector::ReserveOnePosition() rlm@1: { rlm@1: if (_size != _capacity) rlm@1: return; rlm@1: int delta = 1; rlm@1: if (_capacity >= 64) rlm@1: delta = _capacity / 4; rlm@1: else if (_capacity >= 8) rlm@1: delta = 8; rlm@1: Reserve(_capacity + delta); rlm@1: } rlm@1: rlm@1: void CBaseRecordVector::Reserve(int newCapacity) rlm@1: { rlm@1: // if (newCapacity <= _capacity) rlm@1: if (newCapacity == _capacity) rlm@1: return; rlm@1: if ((unsigned)newCapacity >= ((unsigned)1 << (sizeof(unsigned) * 8 - 1))) rlm@1: throw 1052353; rlm@1: size_t newSize = (size_t)(unsigned)newCapacity * _itemSize; rlm@1: if (newSize / _itemSize != (size_t)(unsigned)newCapacity) rlm@1: throw 1052354; rlm@1: unsigned char *p = NULL; rlm@1: if (newSize > 0) rlm@1: { rlm@1: p = new unsigned char[newSize]; rlm@1: if (p == 0) rlm@1: throw 1052355; rlm@1: int numRecordsToMove = (_size < newCapacity ? _size : newCapacity); rlm@1: memcpy(p, _items, _itemSize * numRecordsToMove); rlm@1: } rlm@1: delete [](unsigned char *)_items; rlm@1: _items = p; rlm@1: _capacity = newCapacity; rlm@1: } rlm@1: rlm@1: void CBaseRecordVector::ReserveDown() rlm@1: { rlm@1: Reserve(_size); rlm@1: } rlm@1: rlm@1: void CBaseRecordVector::MoveItems(int destIndex, int srcIndex) rlm@1: { rlm@1: memmove(((unsigned char *)_items) + destIndex * _itemSize, rlm@1: ((unsigned char *)_items) + srcIndex * _itemSize, rlm@1: _itemSize * (_size - srcIndex)); rlm@1: } rlm@1: rlm@1: void CBaseRecordVector::InsertOneItem(int index) rlm@1: { rlm@1: ReserveOnePosition(); rlm@1: MoveItems(index + 1, index); rlm@1: _size++; rlm@1: } rlm@1: rlm@1: void CBaseRecordVector::Delete(int index, int num) rlm@1: { rlm@1: TestIndexAndCorrectNum(index, num); rlm@1: if (num > 0) rlm@1: { rlm@1: MoveItems(index, index + num); rlm@1: _size -= num; rlm@1: } rlm@1: }