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