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