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