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