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