xref: /aosp_15_r20/external/lzma/CPP/Common/MyBuffer.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Common/MyBuffer.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_COMMON_MY_BUFFER_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_COMMON_MY_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 "Defs.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "MyTypes.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker /* 7-Zip now uses CBuffer only as CByteBuffer.
12*f6dc9357SAndroid Build Coastguard Worker    So there is no need to use Z7_ARRAY_NEW macro in CBuffer code. */
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker template <class T> class CBuffer
15*f6dc9357SAndroid Build Coastguard Worker {
16*f6dc9357SAndroid Build Coastguard Worker   T *_items;
17*f6dc9357SAndroid Build Coastguard Worker   size_t _size;
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker public:
Free()20*f6dc9357SAndroid Build Coastguard Worker   void Free()
21*f6dc9357SAndroid Build Coastguard Worker   {
22*f6dc9357SAndroid Build Coastguard Worker     if (_items)
23*f6dc9357SAndroid Build Coastguard Worker     {
24*f6dc9357SAndroid Build Coastguard Worker       delete []_items;
25*f6dc9357SAndroid Build Coastguard Worker       _items = NULL;
26*f6dc9357SAndroid Build Coastguard Worker     }
27*f6dc9357SAndroid Build Coastguard Worker     _size = 0;
28*f6dc9357SAndroid Build Coastguard Worker   }
29*f6dc9357SAndroid Build Coastguard Worker 
CBuffer()30*f6dc9357SAndroid Build Coastguard Worker   CBuffer(): _items(NULL), _size(0) {}
CBuffer(size_t size)31*f6dc9357SAndroid Build Coastguard Worker   CBuffer(size_t size): _items(NULL), _size(0)
32*f6dc9357SAndroid Build Coastguard Worker   {
33*f6dc9357SAndroid Build Coastguard Worker     if (size != 0)
34*f6dc9357SAndroid Build Coastguard Worker     {
35*f6dc9357SAndroid Build Coastguard Worker       _items = new T[size];
36*f6dc9357SAndroid Build Coastguard Worker       _size = size;
37*f6dc9357SAndroid Build Coastguard Worker     }
38*f6dc9357SAndroid Build Coastguard Worker   }
CBuffer(const CBuffer & buffer)39*f6dc9357SAndroid Build Coastguard Worker   CBuffer(const CBuffer &buffer): _items(NULL), _size(0)
40*f6dc9357SAndroid Build Coastguard Worker   {
41*f6dc9357SAndroid Build Coastguard Worker     const size_t size = buffer._size;
42*f6dc9357SAndroid Build Coastguard Worker     if (size != 0)
43*f6dc9357SAndroid Build Coastguard Worker     {
44*f6dc9357SAndroid Build Coastguard Worker       _items = new T[size];
45*f6dc9357SAndroid Build Coastguard Worker       memcpy(_items, buffer._items, size * sizeof(T));
46*f6dc9357SAndroid Build Coastguard Worker       _size = size;
47*f6dc9357SAndroid Build Coastguard Worker     }
48*f6dc9357SAndroid Build Coastguard Worker   }
49*f6dc9357SAndroid Build Coastguard Worker 
~CBuffer()50*f6dc9357SAndroid Build Coastguard Worker   ~CBuffer() { delete []_items; }
51*f6dc9357SAndroid Build Coastguard Worker 
52*f6dc9357SAndroid Build Coastguard Worker   operator       T *()       { return _items; }
53*f6dc9357SAndroid Build Coastguard Worker   operator const T *() const { return _items; }
ConstData()54*f6dc9357SAndroid Build Coastguard Worker   const T* ConstData()    const { return _items; }
NonConstData()55*f6dc9357SAndroid Build Coastguard Worker         T* NonConstData() const { return _items; }
NonConstData()56*f6dc9357SAndroid Build Coastguard Worker         T* NonConstData()       { return _items; }
57*f6dc9357SAndroid Build Coastguard Worker   // const T* Data() const         { return _items; }
58*f6dc9357SAndroid Build Coastguard Worker   //       T* Data()               { return _items; }
59*f6dc9357SAndroid Build Coastguard Worker 
Size()60*f6dc9357SAndroid Build Coastguard Worker   size_t Size() const { return _size; }
61*f6dc9357SAndroid Build Coastguard Worker 
Alloc(size_t size)62*f6dc9357SAndroid Build Coastguard Worker   void Alloc(size_t size)
63*f6dc9357SAndroid Build Coastguard Worker   {
64*f6dc9357SAndroid Build Coastguard Worker     if (size != _size)
65*f6dc9357SAndroid Build Coastguard Worker     {
66*f6dc9357SAndroid Build Coastguard Worker       Free();
67*f6dc9357SAndroid Build Coastguard Worker       if (size != 0)
68*f6dc9357SAndroid Build Coastguard Worker       {
69*f6dc9357SAndroid Build Coastguard Worker         _items = new T[size];
70*f6dc9357SAndroid Build Coastguard Worker         _size = size;
71*f6dc9357SAndroid Build Coastguard Worker       }
72*f6dc9357SAndroid Build Coastguard Worker     }
73*f6dc9357SAndroid Build Coastguard Worker   }
74*f6dc9357SAndroid Build Coastguard Worker 
AllocAtLeast(size_t size)75*f6dc9357SAndroid Build Coastguard Worker   void AllocAtLeast(size_t size)
76*f6dc9357SAndroid Build Coastguard Worker   {
77*f6dc9357SAndroid Build Coastguard Worker     if (size > _size)
78*f6dc9357SAndroid Build Coastguard Worker     {
79*f6dc9357SAndroid Build Coastguard Worker       Free();
80*f6dc9357SAndroid Build Coastguard Worker       _items = new T[size];
81*f6dc9357SAndroid Build Coastguard Worker       _size = size;
82*f6dc9357SAndroid Build Coastguard Worker     }
83*f6dc9357SAndroid Build Coastguard Worker   }
84*f6dc9357SAndroid Build Coastguard Worker 
CopyFrom(const T * data,size_t size)85*f6dc9357SAndroid Build Coastguard Worker   void CopyFrom(const T *data, size_t size)
86*f6dc9357SAndroid Build Coastguard Worker   {
87*f6dc9357SAndroid Build Coastguard Worker     Alloc(size);
88*f6dc9357SAndroid Build Coastguard Worker     if (size != 0)
89*f6dc9357SAndroid Build Coastguard Worker       memcpy(_items, data, size * sizeof(T));
90*f6dc9357SAndroid Build Coastguard Worker   }
91*f6dc9357SAndroid Build Coastguard Worker 
ChangeSize_KeepData(size_t newSize,size_t keepSize)92*f6dc9357SAndroid Build Coastguard Worker   void ChangeSize_KeepData(size_t newSize, size_t keepSize)
93*f6dc9357SAndroid Build Coastguard Worker   {
94*f6dc9357SAndroid Build Coastguard Worker     if (newSize == _size)
95*f6dc9357SAndroid Build Coastguard Worker       return;
96*f6dc9357SAndroid Build Coastguard Worker     T *newBuffer = NULL;
97*f6dc9357SAndroid Build Coastguard Worker     if (newSize != 0)
98*f6dc9357SAndroid Build Coastguard Worker     {
99*f6dc9357SAndroid Build Coastguard Worker       newBuffer = new T[newSize];
100*f6dc9357SAndroid Build Coastguard Worker       if (keepSize > _size)
101*f6dc9357SAndroid Build Coastguard Worker         keepSize = _size;
102*f6dc9357SAndroid Build Coastguard Worker       if (keepSize != 0)
103*f6dc9357SAndroid Build Coastguard Worker         memcpy(newBuffer, _items, MyMin(keepSize, newSize) * sizeof(T));
104*f6dc9357SAndroid Build Coastguard Worker     }
105*f6dc9357SAndroid Build Coastguard Worker     delete []_items;
106*f6dc9357SAndroid Build Coastguard Worker     _items = newBuffer;
107*f6dc9357SAndroid Build Coastguard Worker     _size = newSize;
108*f6dc9357SAndroid Build Coastguard Worker   }
109*f6dc9357SAndroid Build Coastguard Worker 
Wipe()110*f6dc9357SAndroid Build Coastguard Worker   void Wipe()
111*f6dc9357SAndroid Build Coastguard Worker   {
112*f6dc9357SAndroid Build Coastguard Worker     if (_size != 0)
113*f6dc9357SAndroid Build Coastguard Worker       memset(_items, 0, _size * sizeof(T));
114*f6dc9357SAndroid Build Coastguard Worker   }
115*f6dc9357SAndroid Build Coastguard Worker 
116*f6dc9357SAndroid Build Coastguard Worker   CBuffer& operator=(const CBuffer &buffer)
117*f6dc9357SAndroid Build Coastguard Worker   {
118*f6dc9357SAndroid Build Coastguard Worker     if (&buffer != this)
119*f6dc9357SAndroid Build Coastguard Worker       CopyFrom(buffer, buffer._size);
120*f6dc9357SAndroid Build Coastguard Worker     return *this;
121*f6dc9357SAndroid Build Coastguard Worker   }
122*f6dc9357SAndroid Build Coastguard Worker };
123*f6dc9357SAndroid Build Coastguard Worker 
124*f6dc9357SAndroid Build Coastguard Worker template <class T>
125*f6dc9357SAndroid Build Coastguard Worker bool operator==(const CBuffer<T>& b1, const CBuffer<T>& b2)
126*f6dc9357SAndroid Build Coastguard Worker {
127*f6dc9357SAndroid Build Coastguard Worker   size_t size1 = b1.Size();
128*f6dc9357SAndroid Build Coastguard Worker   if (size1 != b2.Size())
129*f6dc9357SAndroid Build Coastguard Worker     return false;
130*f6dc9357SAndroid Build Coastguard Worker   if (size1 == 0)
131*f6dc9357SAndroid Build Coastguard Worker     return true;
132*f6dc9357SAndroid Build Coastguard Worker   return memcmp(b1, b2, size1 * sizeof(T)) == 0;
133*f6dc9357SAndroid Build Coastguard Worker }
134*f6dc9357SAndroid Build Coastguard Worker 
135*f6dc9357SAndroid Build Coastguard Worker template <class T>
136*f6dc9357SAndroid Build Coastguard Worker bool operator!=(const CBuffer<T>& b1, const CBuffer<T>& b2)
137*f6dc9357SAndroid Build Coastguard Worker {
138*f6dc9357SAndroid Build Coastguard Worker   size_t size1 = b1.Size();
139*f6dc9357SAndroid Build Coastguard Worker   if (size1 != b2.Size())
140*f6dc9357SAndroid Build Coastguard Worker     return true;
141*f6dc9357SAndroid Build Coastguard Worker   if (size1 == 0)
142*f6dc9357SAndroid Build Coastguard Worker     return false;
143*f6dc9357SAndroid Build Coastguard Worker   return memcmp(b1, b2, size1 * sizeof(T)) != 0;
144*f6dc9357SAndroid Build Coastguard Worker }
145*f6dc9357SAndroid Build Coastguard Worker 
146*f6dc9357SAndroid Build Coastguard Worker 
147*f6dc9357SAndroid Build Coastguard Worker // typedef CBuffer<char> CCharBuffer;
148*f6dc9357SAndroid Build Coastguard Worker // typedef CBuffer<wchar_t> CWCharBuffer;
149*f6dc9357SAndroid Build Coastguard Worker typedef CBuffer<Byte> CByteBuffer;
150*f6dc9357SAndroid Build Coastguard Worker 
151*f6dc9357SAndroid Build Coastguard Worker 
152*f6dc9357SAndroid Build Coastguard Worker class CByteBuffer_Wipe: public CByteBuffer
153*f6dc9357SAndroid Build Coastguard Worker {
Z7_CLASS_NO_COPY(CByteBuffer_Wipe)154*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_NO_COPY(CByteBuffer_Wipe)
155*f6dc9357SAndroid Build Coastguard Worker public:
156*f6dc9357SAndroid Build Coastguard Worker   // CByteBuffer_Wipe(): CBuffer<Byte>() {}
157*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer_Wipe(size_t size): CBuffer<Byte>(size) {}
~CByteBuffer_Wipe()158*f6dc9357SAndroid Build Coastguard Worker   ~CByteBuffer_Wipe() { Wipe(); }
159*f6dc9357SAndroid Build Coastguard Worker };
160*f6dc9357SAndroid Build Coastguard Worker 
161*f6dc9357SAndroid Build Coastguard Worker 
162*f6dc9357SAndroid Build Coastguard Worker 
163*f6dc9357SAndroid Build Coastguard Worker template <class T> class CObjArray
164*f6dc9357SAndroid Build Coastguard Worker {
165*f6dc9357SAndroid Build Coastguard Worker protected:
166*f6dc9357SAndroid Build Coastguard Worker   T *_items;
167*f6dc9357SAndroid Build Coastguard Worker private:
168*f6dc9357SAndroid Build Coastguard Worker   // we disable copy
169*f6dc9357SAndroid Build Coastguard Worker   CObjArray(const CObjArray &buffer);
170*f6dc9357SAndroid Build Coastguard Worker   void operator=(const CObjArray &buffer);
171*f6dc9357SAndroid Build Coastguard Worker public:
Free()172*f6dc9357SAndroid Build Coastguard Worker   void Free()
173*f6dc9357SAndroid Build Coastguard Worker   {
174*f6dc9357SAndroid Build Coastguard Worker     delete []_items;
175*f6dc9357SAndroid Build Coastguard Worker     _items = NULL;
176*f6dc9357SAndroid Build Coastguard Worker   }
CObjArray(size_t size)177*f6dc9357SAndroid Build Coastguard Worker   CObjArray(size_t size): _items(NULL)
178*f6dc9357SAndroid Build Coastguard Worker   {
179*f6dc9357SAndroid Build Coastguard Worker     if (size != 0)
180*f6dc9357SAndroid Build Coastguard Worker     {
181*f6dc9357SAndroid Build Coastguard Worker       Z7_ARRAY_NEW(_items, T, size)
182*f6dc9357SAndroid Build Coastguard Worker       // _items = new T[size];
183*f6dc9357SAndroid Build Coastguard Worker     }
184*f6dc9357SAndroid Build Coastguard Worker   }
CObjArray()185*f6dc9357SAndroid Build Coastguard Worker   CObjArray(): _items(NULL) {}
~CObjArray()186*f6dc9357SAndroid Build Coastguard Worker   ~CObjArray() { delete []_items; }
187*f6dc9357SAndroid Build Coastguard Worker 
188*f6dc9357SAndroid Build Coastguard Worker   operator       T *()       { return _items; }
189*f6dc9357SAndroid Build Coastguard Worker   operator const T *() const { return _items; }
ConstData()190*f6dc9357SAndroid Build Coastguard Worker   const T* ConstData()    const { return _items; }
NonConstData()191*f6dc9357SAndroid Build Coastguard Worker         T* NonConstData() const { return _items; }
NonConstData()192*f6dc9357SAndroid Build Coastguard Worker         T* NonConstData()       { return _items; }
193*f6dc9357SAndroid Build Coastguard Worker   // const T* Data() const         { return _items; }
194*f6dc9357SAndroid Build Coastguard Worker   //       T* Data()               { return _items; }
195*f6dc9357SAndroid Build Coastguard Worker 
Alloc(size_t newSize)196*f6dc9357SAndroid Build Coastguard Worker   void Alloc(size_t newSize)
197*f6dc9357SAndroid Build Coastguard Worker   {
198*f6dc9357SAndroid Build Coastguard Worker     delete []_items;
199*f6dc9357SAndroid Build Coastguard Worker     _items = NULL;
200*f6dc9357SAndroid Build Coastguard Worker     Z7_ARRAY_NEW(_items, T, newSize)
201*f6dc9357SAndroid Build Coastguard Worker     // _items = new T[newSize];
202*f6dc9357SAndroid Build Coastguard Worker   }
203*f6dc9357SAndroid Build Coastguard Worker };
204*f6dc9357SAndroid Build Coastguard Worker 
205*f6dc9357SAndroid Build Coastguard Worker typedef CObjArray<Byte> CByteArr;
206*f6dc9357SAndroid Build Coastguard Worker typedef CObjArray<bool> CBoolArr;
207*f6dc9357SAndroid Build Coastguard Worker typedef CObjArray<int> CIntArr;
208*f6dc9357SAndroid Build Coastguard Worker typedef CObjArray<unsigned> CUIntArr;
209*f6dc9357SAndroid Build Coastguard Worker 
210*f6dc9357SAndroid Build Coastguard Worker 
211*f6dc9357SAndroid Build Coastguard Worker template <class T> class CObjArray2
212*f6dc9357SAndroid Build Coastguard Worker {
213*f6dc9357SAndroid Build Coastguard Worker   T *_items;
214*f6dc9357SAndroid Build Coastguard Worker   unsigned _size;
215*f6dc9357SAndroid Build Coastguard Worker 
216*f6dc9357SAndroid Build Coastguard Worker   // we disable copy
217*f6dc9357SAndroid Build Coastguard Worker   CObjArray2(const CObjArray2 &buffer);
218*f6dc9357SAndroid Build Coastguard Worker   void operator=(const CObjArray2 &buffer);
219*f6dc9357SAndroid Build Coastguard Worker public:
220*f6dc9357SAndroid Build Coastguard Worker 
Free()221*f6dc9357SAndroid Build Coastguard Worker   void Free()
222*f6dc9357SAndroid Build Coastguard Worker   {
223*f6dc9357SAndroid Build Coastguard Worker     delete []_items;
224*f6dc9357SAndroid Build Coastguard Worker     _items = NULL;
225*f6dc9357SAndroid Build Coastguard Worker     _size = 0;
226*f6dc9357SAndroid Build Coastguard Worker   }
CObjArray2()227*f6dc9357SAndroid Build Coastguard Worker   CObjArray2(): _items(NULL), _size(0) {}
228*f6dc9357SAndroid Build Coastguard Worker   /*
229*f6dc9357SAndroid Build Coastguard Worker   CObjArray2(const CObjArray2 &buffer): _items(NULL), _size(0)
230*f6dc9357SAndroid Build Coastguard Worker   {
231*f6dc9357SAndroid Build Coastguard Worker     size_t newSize = buffer._size;
232*f6dc9357SAndroid Build Coastguard Worker     if (newSize != 0)
233*f6dc9357SAndroid Build Coastguard Worker     {
234*f6dc9357SAndroid Build Coastguard Worker       T *newBuffer = new T[newSize];;
235*f6dc9357SAndroid Build Coastguard Worker       _items = newBuffer;
236*f6dc9357SAndroid Build Coastguard Worker       _size = newSize;
237*f6dc9357SAndroid Build Coastguard Worker       const T *src = buffer;
238*f6dc9357SAndroid Build Coastguard Worker       for (size_t i = 0; i < newSize; i++)
239*f6dc9357SAndroid Build Coastguard Worker         newBuffer[i] = src[i];
240*f6dc9357SAndroid Build Coastguard Worker     }
241*f6dc9357SAndroid Build Coastguard Worker   }
242*f6dc9357SAndroid Build Coastguard Worker   */
243*f6dc9357SAndroid Build Coastguard Worker   /*
244*f6dc9357SAndroid Build Coastguard Worker   CObjArray2(size_t size): _items(NULL), _size(0)
245*f6dc9357SAndroid Build Coastguard Worker   {
246*f6dc9357SAndroid Build Coastguard Worker     if (size != 0)
247*f6dc9357SAndroid Build Coastguard Worker     {
248*f6dc9357SAndroid Build Coastguard Worker       _items = new T[size];
249*f6dc9357SAndroid Build Coastguard Worker       _size = size;
250*f6dc9357SAndroid Build Coastguard Worker     }
251*f6dc9357SAndroid Build Coastguard Worker   }
252*f6dc9357SAndroid Build Coastguard Worker   */
253*f6dc9357SAndroid Build Coastguard Worker 
~CObjArray2()254*f6dc9357SAndroid Build Coastguard Worker   ~CObjArray2() { delete []_items; }
255*f6dc9357SAndroid Build Coastguard Worker 
256*f6dc9357SAndroid Build Coastguard Worker   operator       T *()       { return _items; }
257*f6dc9357SAndroid Build Coastguard Worker   operator const T *() const { return _items; }
258*f6dc9357SAndroid Build Coastguard Worker 
Size()259*f6dc9357SAndroid Build Coastguard Worker   unsigned Size() const { return (unsigned)_size; }
IsEmpty()260*f6dc9357SAndroid Build Coastguard Worker   bool IsEmpty() const { return _size == 0; }
261*f6dc9357SAndroid Build Coastguard Worker 
262*f6dc9357SAndroid Build Coastguard Worker   // SetSize doesn't keep old items. It allocates new array if size is not equal
SetSize(unsigned size)263*f6dc9357SAndroid Build Coastguard Worker   void SetSize(unsigned size)
264*f6dc9357SAndroid Build Coastguard Worker   {
265*f6dc9357SAndroid Build Coastguard Worker     if (size == _size)
266*f6dc9357SAndroid Build Coastguard Worker       return;
267*f6dc9357SAndroid Build Coastguard Worker     T *newBuffer = NULL;
268*f6dc9357SAndroid Build Coastguard Worker     if (size != 0)
269*f6dc9357SAndroid Build Coastguard Worker     {
270*f6dc9357SAndroid Build Coastguard Worker       Z7_ARRAY_NEW(newBuffer, T, size)
271*f6dc9357SAndroid Build Coastguard Worker       // newBuffer = new T[size];
272*f6dc9357SAndroid Build Coastguard Worker     }
273*f6dc9357SAndroid Build Coastguard Worker     delete []_items;
274*f6dc9357SAndroid Build Coastguard Worker     _items = newBuffer;
275*f6dc9357SAndroid Build Coastguard Worker     _size = size;
276*f6dc9357SAndroid Build Coastguard Worker   }
277*f6dc9357SAndroid Build Coastguard Worker 
278*f6dc9357SAndroid Build Coastguard Worker   /*
279*f6dc9357SAndroid Build Coastguard Worker   CObjArray2& operator=(const CObjArray2 &buffer)
280*f6dc9357SAndroid Build Coastguard Worker   {
281*f6dc9357SAndroid Build Coastguard Worker     Free();
282*f6dc9357SAndroid Build Coastguard Worker     size_t newSize = buffer._size;
283*f6dc9357SAndroid Build Coastguard Worker     if (newSize != 0)
284*f6dc9357SAndroid Build Coastguard Worker     {
285*f6dc9357SAndroid Build Coastguard Worker       T *newBuffer = new T[newSize];;
286*f6dc9357SAndroid Build Coastguard Worker       _items = newBuffer;
287*f6dc9357SAndroid Build Coastguard Worker       _size = newSize;
288*f6dc9357SAndroid Build Coastguard Worker       const T *src = buffer;
289*f6dc9357SAndroid Build Coastguard Worker       for (size_t i = 0; i < newSize; i++)
290*f6dc9357SAndroid Build Coastguard Worker         newBuffer[i] = src[i];
291*f6dc9357SAndroid Build Coastguard Worker     }
292*f6dc9357SAndroid Build Coastguard Worker     return *this;
293*f6dc9357SAndroid Build Coastguard Worker   }
294*f6dc9357SAndroid Build Coastguard Worker   */
295*f6dc9357SAndroid Build Coastguard Worker };
296*f6dc9357SAndroid Build Coastguard Worker 
297*f6dc9357SAndroid Build Coastguard Worker #endif
298