array.hpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #ifndef _RAR_ARRAY_
  2. #define _RAR_ARRAY_
  3. extern ErrorHandler ErrHandler;
  4. template <class T> class Array
  5. {
  6. private:
  7. T *Buffer;
  8. size_t BufSize;
  9. size_t AllocSize;
  10. public:
  11. Array();
  12. Array(size_t Size);
  13. ~Array();
  14. inline void CleanData();
  15. inline T& operator [](size_t Item);
  16. inline size_t Size(); // Returns the size in items, not in bytes.
  17. void Add(size_t Items);
  18. void Alloc(size_t Items);
  19. void Reset();
  20. void operator = (Array<T> &Src);
  21. void Push(T Item);
  22. T* Addr() {return(Buffer);}
  23. };
  24. template <class T> void Array<T>::CleanData()
  25. {
  26. Buffer=NULL;
  27. BufSize=0;
  28. AllocSize=0;
  29. }
  30. template <class T> Array<T>::Array()
  31. {
  32. CleanData();
  33. }
  34. template <class T> Array<T>::Array(size_t Size)
  35. {
  36. Buffer=(T *)malloc(sizeof(T)*Size);
  37. if (Buffer==NULL && Size!=0)
  38. ErrHandler.MemoryError();
  39. AllocSize=BufSize=Size;
  40. }
  41. template <class T> Array<T>::~Array()
  42. {
  43. if (Buffer!=NULL)
  44. free(Buffer);
  45. }
  46. template <class T> inline T& Array<T>::operator [](size_t Item)
  47. {
  48. return(Buffer[Item]);
  49. }
  50. template <class T> inline size_t Array<T>::Size()
  51. {
  52. return(BufSize);
  53. }
  54. template <class T> void Array<T>::Add(size_t Items)
  55. {
  56. BufSize+=Items;
  57. if (BufSize>AllocSize)
  58. {
  59. size_t Suggested=AllocSize+AllocSize/4+32;
  60. size_t NewSize=Max(BufSize,Suggested);
  61. Buffer=(T *)realloc(Buffer,NewSize*sizeof(T));
  62. if (Buffer==NULL)
  63. ErrHandler.MemoryError();
  64. AllocSize=NewSize;
  65. }
  66. }
  67. template <class T> void Array<T>::Alloc(size_t Items)
  68. {
  69. if (Items>AllocSize)
  70. Add(Items-BufSize);
  71. else
  72. BufSize=Items;
  73. }
  74. template <class T> void Array<T>::Reset()
  75. {
  76. if (Buffer!=NULL)
  77. {
  78. free(Buffer);
  79. Buffer=NULL;
  80. }
  81. BufSize=0;
  82. AllocSize=0;
  83. }
  84. template <class T> void Array<T>::operator =(Array<T> &Src)
  85. {
  86. Reset();
  87. Alloc(Src.BufSize);
  88. if (Src.BufSize!=0)
  89. memcpy((void *)Buffer,(void *)Src.Buffer,Src.BufSize*sizeof(T));
  90. }
  91. template <class T> void Array<T>::Push(T Item)
  92. {
  93. Add(1);
  94. (*this)[Size()-1]=Item;
  95. }
  96. #endif