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