MyVector.cpp 1.7 KB

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