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