xref: /aosp_15_r20/external/lzma/CPP/Common/DynamicBuffer.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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