1 // Common/DynamicBuffer.h 2 3 #ifndef __COMMON_DYNAMIC_BUFFER_H 4 #define __COMMON_DYNAMIC_BUFFER_H 5 6 #include "Buffer.h" 7 8 template <class T> class CDynamicBuffer: public CBuffer<T> 9 { GrowLength(size_t size)10 void GrowLength(size_t size) 11 { 12 size_t delta; 13 if (this->_capacity > 64) 14 delta = this->_capacity / 4; 15 else if (this->_capacity > 8) 16 delta = 16; 17 else 18 delta = 4; 19 delta = MyMax(delta, size); 20 size_t newCap = this->_capacity + delta; 21 if (newCap < delta) 22 newCap = this->_capacity + size; 23 SetCapacity(newCap); 24 } 25 public: CDynamicBuffer()26 CDynamicBuffer(): CBuffer<T>() {}; CDynamicBuffer(const CDynamicBuffer & buffer)27 CDynamicBuffer(const CDynamicBuffer &buffer): CBuffer<T>(buffer) {}; CDynamicBuffer(size_t size)28 CDynamicBuffer(size_t size): CBuffer<T>(size) {}; 29 CDynamicBuffer& operator=(const CDynamicBuffer &buffer) 30 { 31 this->Free(); 32 if (buffer._capacity > 0) 33 { 34 SetCapacity(buffer._capacity); 35 memmove(this->_items, buffer._items, buffer._capacity * sizeof(T)); 36 } 37 return *this; 38 } EnsureCapacity(size_t capacity)39 void EnsureCapacity(size_t capacity) 40 { 41 if (this->_capacity < capacity) 42 GrowLength(capacity - this->_capacity); 43 } 44 }; 45 46 typedef CDynamicBuffer<char> CCharDynamicBuffer; 47 typedef CDynamicBuffer<wchar_t> CWCharDynamicBuffer; 48 typedef CDynamicBuffer<unsigned char> CByteDynamicBuffer; 49 50 #endif 51