Home | History | Annotate | Download | only in Common
      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