1 // Common/MyVector.cpp 2 3 #include "StdAfx.h" 4 5 #include <string.h> 6 7 #include "MyVector.h" 8 9 CBaseRecordVector::~CBaseRecordVector() { ClearAndFree(); } 10 11 void CBaseRecordVector::ClearAndFree() 12 { 13 Clear(); 14 delete []((unsigned char *)_items); 15 _capacity = 0; 16 _size = 0; 17 _items = 0; 18 } 19 20 void CBaseRecordVector::Clear() { DeleteFrom(0); } 21 void CBaseRecordVector::DeleteBack() { Delete(_size - 1); } 22 void CBaseRecordVector::DeleteFrom(int index) { Delete(index, _size - index); } 23 24 void CBaseRecordVector::ReserveOnePosition() 25 { 26 if (_size != _capacity) 27 return; 28 unsigned delta = 1; 29 if (_capacity >= 64) 30 delta = (unsigned)_capacity / 4; 31 else if (_capacity >= 8) 32 delta = 8; 33 Reserve(_capacity + (int)delta); 34 } 35 36 void CBaseRecordVector::Reserve(int newCapacity) 37 { 38 // if (newCapacity <= _capacity) 39 if (newCapacity == _capacity) 40 return; 41 if ((unsigned)newCapacity >= ((unsigned)1 << (sizeof(unsigned) * 8 - 1))) 42 throw 1052353; 43 size_t newSize = (size_t)(unsigned)newCapacity * _itemSize; 44 if (newSize / _itemSize != (size_t)(unsigned)newCapacity) 45 throw 1052354; 46 unsigned char *p = NULL; 47 if (newSize > 0) 48 { 49 p = new unsigned char[newSize]; 50 if (p == 0) 51 throw 1052355; 52 int numRecordsToMove = (_size < newCapacity ? _size : newCapacity); 53 memcpy(p, _items, _itemSize * numRecordsToMove); 54 } 55 delete [](unsigned char *)_items; 56 _items = p; 57 _capacity = newCapacity; 58 } 59 60 void CBaseRecordVector::ReserveDown() 61 { 62 Reserve(_size); 63 } 64 65 void CBaseRecordVector::MoveItems(int destIndex, int srcIndex) 66 { 67 memmove(((unsigned char *)_items) + destIndex * _itemSize, 68 ((unsigned char *)_items) + srcIndex * _itemSize, 69 _itemSize * (_size - srcIndex)); 70 } 71 72 void CBaseRecordVector::InsertOneItem(int index) 73 { 74 ReserveOnePosition(); 75 MoveItems(index + 1, index); 76 _size++; 77 } 78 79 void CBaseRecordVector::Delete(int index, int num) 80 { 81 TestIndexAndCorrectNum(index, num); 82 if (num > 0) 83 { 84 MoveItems(index, index + num); 85 _size -= num; 86 } 87 } 88