xref: /aosp_15_r20/external/lzma/CPP/Common/MyBuffer2.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Common/MyBuffer2.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_COMMON_MY_BUFFER2_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_COMMON_MY_BUFFER2_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../C/Alloc.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "MyTypes.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker class CMidBuffer
11*f6dc9357SAndroid Build Coastguard Worker {
12*f6dc9357SAndroid Build Coastguard Worker   Byte *_data;
13*f6dc9357SAndroid Build Coastguard Worker   size_t _size;
14*f6dc9357SAndroid Build Coastguard Worker 
Z7_CLASS_NO_COPY(CMidBuffer)15*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_NO_COPY(CMidBuffer)
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker public:
18*f6dc9357SAndroid Build Coastguard Worker   CMidBuffer(): _data(NULL), _size(0) {}
~CMidBuffer()19*f6dc9357SAndroid Build Coastguard Worker   ~CMidBuffer() { ::MidFree(_data); }
20*f6dc9357SAndroid Build Coastguard Worker 
Free()21*f6dc9357SAndroid Build Coastguard Worker   void Free() { ::MidFree(_data); _data = NULL; _size = 0; }
22*f6dc9357SAndroid Build Coastguard Worker 
IsAllocated()23*f6dc9357SAndroid Build Coastguard Worker   bool IsAllocated() const { return _data != NULL; }
24*f6dc9357SAndroid Build Coastguard Worker   operator       Byte *()       { return _data; }
25*f6dc9357SAndroid Build Coastguard Worker   operator const Byte *() const { return _data; }
Size()26*f6dc9357SAndroid Build Coastguard Worker   size_t Size() const { return _size; }
27*f6dc9357SAndroid Build Coastguard Worker 
Alloc(size_t size)28*f6dc9357SAndroid Build Coastguard Worker   void Alloc(size_t size)
29*f6dc9357SAndroid Build Coastguard Worker   {
30*f6dc9357SAndroid Build Coastguard Worker     if (!_data || size != _size)
31*f6dc9357SAndroid Build Coastguard Worker     {
32*f6dc9357SAndroid Build Coastguard Worker       ::MidFree(_data);
33*f6dc9357SAndroid Build Coastguard Worker       _size = 0;
34*f6dc9357SAndroid Build Coastguard Worker       _data = NULL;
35*f6dc9357SAndroid Build Coastguard Worker       _data = (Byte *)::MidAlloc(size);
36*f6dc9357SAndroid Build Coastguard Worker       if (_data)
37*f6dc9357SAndroid Build Coastguard Worker         _size = size;
38*f6dc9357SAndroid Build Coastguard Worker     }
39*f6dc9357SAndroid Build Coastguard Worker   }
40*f6dc9357SAndroid Build Coastguard Worker 
AllocAtLeast(size_t size)41*f6dc9357SAndroid Build Coastguard Worker   void AllocAtLeast(size_t size)
42*f6dc9357SAndroid Build Coastguard Worker   {
43*f6dc9357SAndroid Build Coastguard Worker     if (!_data || size > _size)
44*f6dc9357SAndroid Build Coastguard Worker     {
45*f6dc9357SAndroid Build Coastguard Worker       ::MidFree(_data);
46*f6dc9357SAndroid Build Coastguard Worker       const size_t kMinSize = (size_t)1 << 16;
47*f6dc9357SAndroid Build Coastguard Worker       if (size < kMinSize)
48*f6dc9357SAndroid Build Coastguard Worker         size = kMinSize;
49*f6dc9357SAndroid Build Coastguard Worker       _size = 0;
50*f6dc9357SAndroid Build Coastguard Worker       _data = NULL;
51*f6dc9357SAndroid Build Coastguard Worker       _data = (Byte *)::MidAlloc(size);
52*f6dc9357SAndroid Build Coastguard Worker       if (_data)
53*f6dc9357SAndroid Build Coastguard Worker         _size = size;
54*f6dc9357SAndroid Build Coastguard Worker     }
55*f6dc9357SAndroid Build Coastguard Worker   }
56*f6dc9357SAndroid Build Coastguard Worker };
57*f6dc9357SAndroid Build Coastguard Worker 
58*f6dc9357SAndroid Build Coastguard Worker 
59*f6dc9357SAndroid Build Coastguard Worker class CAlignedBuffer1
60*f6dc9357SAndroid Build Coastguard Worker {
61*f6dc9357SAndroid Build Coastguard Worker   Byte *_data;
62*f6dc9357SAndroid Build Coastguard Worker 
Z7_CLASS_NO_COPY(CAlignedBuffer1)63*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_NO_COPY(CAlignedBuffer1)
64*f6dc9357SAndroid Build Coastguard Worker 
65*f6dc9357SAndroid Build Coastguard Worker public:
66*f6dc9357SAndroid Build Coastguard Worker   ~CAlignedBuffer1()
67*f6dc9357SAndroid Build Coastguard Worker   {
68*f6dc9357SAndroid Build Coastguard Worker     z7_AlignedFree(_data);
69*f6dc9357SAndroid Build Coastguard Worker   }
70*f6dc9357SAndroid Build Coastguard Worker 
CAlignedBuffer1(size_t size)71*f6dc9357SAndroid Build Coastguard Worker   CAlignedBuffer1(size_t size)
72*f6dc9357SAndroid Build Coastguard Worker   {
73*f6dc9357SAndroid Build Coastguard Worker     _data = NULL;
74*f6dc9357SAndroid Build Coastguard Worker     _data = (Byte *)z7_AlignedAlloc(size);
75*f6dc9357SAndroid Build Coastguard Worker     if (!_data)
76*f6dc9357SAndroid Build Coastguard Worker       throw 1;
77*f6dc9357SAndroid Build Coastguard Worker   }
78*f6dc9357SAndroid Build Coastguard Worker 
79*f6dc9357SAndroid Build Coastguard Worker   operator       Byte *()       { return _data; }
80*f6dc9357SAndroid Build Coastguard Worker   operator const Byte *() const { return _data; }
81*f6dc9357SAndroid Build Coastguard Worker };
82*f6dc9357SAndroid Build Coastguard Worker 
83*f6dc9357SAndroid Build Coastguard Worker 
84*f6dc9357SAndroid Build Coastguard Worker class CAlignedBuffer
85*f6dc9357SAndroid Build Coastguard Worker {
86*f6dc9357SAndroid Build Coastguard Worker   Byte *_data;
87*f6dc9357SAndroid Build Coastguard Worker   size_t _size;
88*f6dc9357SAndroid Build Coastguard Worker 
Z7_CLASS_NO_COPY(CAlignedBuffer)89*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_NO_COPY(CAlignedBuffer)
90*f6dc9357SAndroid Build Coastguard Worker 
91*f6dc9357SAndroid Build Coastguard Worker public:
92*f6dc9357SAndroid Build Coastguard Worker   CAlignedBuffer(): _data(NULL), _size(0) {}
~CAlignedBuffer()93*f6dc9357SAndroid Build Coastguard Worker   ~CAlignedBuffer()
94*f6dc9357SAndroid Build Coastguard Worker   {
95*f6dc9357SAndroid Build Coastguard Worker     z7_AlignedFree(_data);
96*f6dc9357SAndroid Build Coastguard Worker   }
97*f6dc9357SAndroid Build Coastguard Worker 
98*f6dc9357SAndroid Build Coastguard Worker   /*
99*f6dc9357SAndroid Build Coastguard Worker   CAlignedBuffer(size_t size): _size(0)
100*f6dc9357SAndroid Build Coastguard Worker   {
101*f6dc9357SAndroid Build Coastguard Worker     _data = NULL;
102*f6dc9357SAndroid Build Coastguard Worker     _data = (Byte *)z7_AlignedAlloc(size);
103*f6dc9357SAndroid Build Coastguard Worker     if (!_data)
104*f6dc9357SAndroid Build Coastguard Worker       throw 1;
105*f6dc9357SAndroid Build Coastguard Worker     _size = size;
106*f6dc9357SAndroid Build Coastguard Worker   }
107*f6dc9357SAndroid Build Coastguard Worker   */
108*f6dc9357SAndroid Build Coastguard Worker 
Free()109*f6dc9357SAndroid Build Coastguard Worker   void Free()
110*f6dc9357SAndroid Build Coastguard Worker   {
111*f6dc9357SAndroid Build Coastguard Worker     z7_AlignedFree(_data);
112*f6dc9357SAndroid Build Coastguard Worker     _data = NULL;
113*f6dc9357SAndroid Build Coastguard Worker     _size = 0;
114*f6dc9357SAndroid Build Coastguard Worker   }
115*f6dc9357SAndroid Build Coastguard Worker 
IsAllocated()116*f6dc9357SAndroid Build Coastguard Worker   bool IsAllocated() const { return _data != NULL; }
117*f6dc9357SAndroid Build Coastguard Worker   operator       Byte *()       { return _data; }
118*f6dc9357SAndroid Build Coastguard Worker   operator const Byte *() const { return _data; }
Size()119*f6dc9357SAndroid Build Coastguard Worker   size_t Size() const { return _size; }
120*f6dc9357SAndroid Build Coastguard Worker 
Alloc(size_t size)121*f6dc9357SAndroid Build Coastguard Worker   void Alloc(size_t size)
122*f6dc9357SAndroid Build Coastguard Worker   {
123*f6dc9357SAndroid Build Coastguard Worker     if (!_data || size != _size)
124*f6dc9357SAndroid Build Coastguard Worker     {
125*f6dc9357SAndroid Build Coastguard Worker       z7_AlignedFree(_data);
126*f6dc9357SAndroid Build Coastguard Worker       _size = 0;
127*f6dc9357SAndroid Build Coastguard Worker       _data = NULL;
128*f6dc9357SAndroid Build Coastguard Worker       _data = (Byte *)z7_AlignedAlloc(size);
129*f6dc9357SAndroid Build Coastguard Worker       if (_data)
130*f6dc9357SAndroid Build Coastguard Worker         _size = size;
131*f6dc9357SAndroid Build Coastguard Worker     }
132*f6dc9357SAndroid Build Coastguard Worker   }
133*f6dc9357SAndroid Build Coastguard Worker 
AllocAtLeast(size_t size)134*f6dc9357SAndroid Build Coastguard Worker   void AllocAtLeast(size_t size)
135*f6dc9357SAndroid Build Coastguard Worker   {
136*f6dc9357SAndroid Build Coastguard Worker     if (!_data || size > _size)
137*f6dc9357SAndroid Build Coastguard Worker     {
138*f6dc9357SAndroid Build Coastguard Worker       z7_AlignedFree(_data);
139*f6dc9357SAndroid Build Coastguard Worker       _size = 0;
140*f6dc9357SAndroid Build Coastguard Worker       _data = NULL;
141*f6dc9357SAndroid Build Coastguard Worker       _data = (Byte *)z7_AlignedAlloc(size);
142*f6dc9357SAndroid Build Coastguard Worker       if (_data)
143*f6dc9357SAndroid Build Coastguard Worker         _size = size;
144*f6dc9357SAndroid Build Coastguard Worker     }
145*f6dc9357SAndroid Build Coastguard Worker   }
146*f6dc9357SAndroid Build Coastguard Worker 
147*f6dc9357SAndroid Build Coastguard Worker   // (size <= size_max)
AllocAtLeast_max(size_t size,size_t size_max)148*f6dc9357SAndroid Build Coastguard Worker   void AllocAtLeast_max(size_t size, size_t size_max)
149*f6dc9357SAndroid Build Coastguard Worker   {
150*f6dc9357SAndroid Build Coastguard Worker     if (!_data || size > _size)
151*f6dc9357SAndroid Build Coastguard Worker     {
152*f6dc9357SAndroid Build Coastguard Worker       z7_AlignedFree(_data);
153*f6dc9357SAndroid Build Coastguard Worker       _size = 0;
154*f6dc9357SAndroid Build Coastguard Worker       _data = NULL;
155*f6dc9357SAndroid Build Coastguard Worker       if (size_max < size) size_max = size; // optional check
156*f6dc9357SAndroid Build Coastguard Worker       const size_t delta = size / 2;
157*f6dc9357SAndroid Build Coastguard Worker       size += delta;
158*f6dc9357SAndroid Build Coastguard Worker       if (size < delta || size > size_max)
159*f6dc9357SAndroid Build Coastguard Worker         size = size_max;
160*f6dc9357SAndroid Build Coastguard Worker       _data = (Byte *)z7_AlignedAlloc(size);
161*f6dc9357SAndroid Build Coastguard Worker       if (_data)
162*f6dc9357SAndroid Build Coastguard Worker         _size = size;
163*f6dc9357SAndroid Build Coastguard Worker     }
164*f6dc9357SAndroid Build Coastguard Worker   }
165*f6dc9357SAndroid Build Coastguard Worker };
166*f6dc9357SAndroid Build Coastguard Worker 
167*f6dc9357SAndroid Build Coastguard Worker /*
168*f6dc9357SAndroid Build Coastguard Worker   CMidAlignedBuffer must return aligned pointer.
169*f6dc9357SAndroid Build Coastguard Worker    - in Windows it uses CMidBuffer(): MidAlloc() : VirtualAlloc()
170*f6dc9357SAndroid Build Coastguard Worker        VirtualAlloc(): Memory allocated is automatically initialized to zero.
171*f6dc9357SAndroid Build Coastguard Worker        MidAlloc(0) returns NULL
172*f6dc9357SAndroid Build Coastguard Worker    - in non-Windows systems it uses g_AlignedAlloc.
173*f6dc9357SAndroid Build Coastguard Worker      g_AlignedAlloc::Alloc(size = 0) can return non NULL.
174*f6dc9357SAndroid Build Coastguard Worker */
175*f6dc9357SAndroid Build Coastguard Worker 
176*f6dc9357SAndroid Build Coastguard Worker typedef
177*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
178*f6dc9357SAndroid Build Coastguard Worker   CMidBuffer
179*f6dc9357SAndroid Build Coastguard Worker #else
180*f6dc9357SAndroid Build Coastguard Worker   CAlignedBuffer
181*f6dc9357SAndroid Build Coastguard Worker #endif
182*f6dc9357SAndroid Build Coastguard Worker   CMidAlignedBuffer;
183*f6dc9357SAndroid Build Coastguard Worker 
184*f6dc9357SAndroid Build Coastguard Worker 
185*f6dc9357SAndroid Build Coastguard Worker #endif
186