1 // Common/DynamicBuffer.h 2 3 #ifndef ZIP7_INC_COMMON_DYNAMIC_BUFFER_H 4 #define ZIP7_INC_COMMON_DYNAMIC_BUFFER_H 5 6 #include <string.h> 7 8 #include "Common.h" 9 10 template <class T> class CDynamicBuffer 11 { 12 T *_items; 13 size_t _size; 14 size_t _pos; 15 16 CDynamicBuffer(const CDynamicBuffer &buffer); 17 void operator=(const CDynamicBuffer &buffer); 18 Grow(size_t size)19 void Grow(size_t size) 20 { 21 size_t delta = _size >= 64 ? _size : 64; 22 if (delta < size) 23 delta = size; 24 size_t newCap = _size + delta; 25 if (newCap < delta) 26 { 27 newCap = _size + size; 28 if (newCap < size) 29 throw 20120116; 30 } 31 32 T *newBuffer = new T[newCap]; 33 if (_pos != 0) 34 memcpy(newBuffer, _items, _pos * sizeof(T)); 35 delete []_items; 36 _items = newBuffer; 37 _size = newCap; 38 } 39 40 public: CDynamicBuffer()41 CDynamicBuffer(): _items(NULL), _size(0), _pos(0) {} 42 // operator T *() { return _items; } operator const T *() const43 operator const T *() const { return _items; } ~CDynamicBuffer()44 ~CDynamicBuffer() { delete []_items; } 45 GetCurPtrAndGrow(size_t addSize)46 T *GetCurPtrAndGrow(size_t addSize) 47 { 48 size_t rem = _size - _pos; 49 if (rem < addSize) 50 Grow(addSize - rem); 51 T *res = _items + _pos; 52 _pos += addSize; 53 return res; 54 } 55 AddData(const T *data, size_t size)56 void AddData(const T *data, size_t size) 57 { 58 memcpy(GetCurPtrAndGrow(size), data, size * sizeof(T)); 59 } 60 GetPos() const61 size_t GetPos() const { return _pos; } 62 63 // void Empty() { _pos = 0; } 64 }; 65 66 typedef CDynamicBuffer<unsigned char> CByteDynamicBuffer; 67 68 #endif 69