michael@0: // Common/Vector.cpp michael@0: michael@0: #include "StdAfx.h" michael@0: michael@0: #include michael@0: michael@0: #include "Vector.h" michael@0: michael@0: CBaseRecordVector::~CBaseRecordVector() michael@0: { delete []((unsigned char *)_items); } michael@0: void CBaseRecordVector::Clear() michael@0: { DeleteFrom(0); } michael@0: void CBaseRecordVector::DeleteBack() michael@0: { Delete(_size - 1); } michael@0: void CBaseRecordVector::DeleteFrom(int index) michael@0: { Delete(index, _size - index); } michael@0: michael@0: void CBaseRecordVector::ReserveOnePosition() michael@0: { michael@0: if(_size != _capacity) michael@0: return; michael@0: int delta; michael@0: if (_capacity > 64) michael@0: delta = _capacity / 2; michael@0: else if (_capacity > 8) michael@0: delta = 8; michael@0: else michael@0: delta = 4; michael@0: Reserve(_capacity + delta); michael@0: } michael@0: michael@0: void CBaseRecordVector::Reserve(int newCapacity) michael@0: { michael@0: if(newCapacity <= _capacity) michael@0: return; michael@0: /* michael@0: #ifndef _DEBUG michael@0: static const unsigned int kMaxVectorSize = 0xF0000000; michael@0: if(newCapacity < _size || michael@0: ((unsigned int )newCapacity * (unsigned int )_itemSize) > kMaxVectorSize) michael@0: throw 1052354; michael@0: #endif michael@0: */ michael@0: unsigned char *p = new unsigned char[newCapacity * _itemSize]; michael@0: int numRecordsToMove = _capacity; michael@0: memmove(p, _items, _itemSize * numRecordsToMove); michael@0: delete [](unsigned char *)_items; michael@0: _items = p; michael@0: _capacity = newCapacity; michael@0: } michael@0: michael@0: void CBaseRecordVector::MoveItems(int destIndex, int srcIndex) michael@0: { michael@0: memmove(((unsigned char *)_items) + destIndex * _itemSize, michael@0: ((unsigned char *)_items) + srcIndex * _itemSize, michael@0: _itemSize * (_size - srcIndex)); michael@0: } michael@0: michael@0: void CBaseRecordVector::InsertOneItem(int index) michael@0: { michael@0: ReserveOnePosition(); michael@0: MoveItems(index + 1, index); michael@0: _size++; michael@0: } michael@0: michael@0: void CBaseRecordVector::Delete(int index, int num) michael@0: { michael@0: TestIndexAndCorrectNum(index, num); michael@0: if (num > 0) michael@0: { michael@0: MoveItems(index, index + num); michael@0: _size -= num; michael@0: } michael@0: }