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 "MyTypes.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; } 43 operator const T *() const { return _items; } ~CDynamicBuffer()44 ~CDynamicBuffer() { delete []_items; } 45 Free()46 void Free() 47 { 48 delete []_items; 49 _items = NULL; 50 _size = 0; 51 _pos = 0; 52 } 53 GetCurPtrAndGrow(size_t addSize)54 T *GetCurPtrAndGrow(size_t addSize) 55 { 56 size_t rem = _size - _pos; 57 if (rem < addSize) 58 Grow(addSize - rem); 59 T *res = _items + _pos; 60 _pos += addSize; 61 return res; 62 } 63 AddData(const T * data,size_t size)64 void AddData(const T *data, size_t size) 65 { 66 memcpy(GetCurPtrAndGrow(size), data, size * sizeof(T)); 67 } 68 GetPos()69 size_t GetPos() const { return _pos; } 70 71 // void Empty() { _pos = 0; } 72 }; 73 74 typedef CDynamicBuffer<Byte> CByteDynamicBuffer; 75 76 #endif 77