// Common/DynamicBuffer.h | |
#ifndef __COMMON_DYNAMIC_BUFFER_H | |
#define __COMMON_DYNAMIC_BUFFER_H | |
#include "Buffer.h" | |
template <class T> class CDynamicBuffer: public CBuffer<T> | |
{ | |
void GrowLength(size_t size) | |
{ | |
size_t delta; | |
if (this->_capacity > 64) | |
delta = this->_capacity / 4; | |
else if (this->_capacity > 8) | |
delta = 16; | |
else | |
delta = 4; | |
delta = MyMax(delta, size); | |
size_t newCap = this->_capacity + delta; | |
if (newCap < delta) | |
newCap = this->_capacity + size; | |
SetCapacity(newCap); | |
} | |
public: | |
CDynamicBuffer(): CBuffer<T>() {}; | |
CDynamicBuffer(const CDynamicBuffer &buffer): CBuffer<T>(buffer) {}; | |
CDynamicBuffer(size_t size): CBuffer<T>(size) {}; | |
CDynamicBuffer& operator=(const CDynamicBuffer &buffer) | |
{ | |
this->Free(); | |
if (buffer._capacity > 0) | |
{ | |
SetCapacity(buffer._capacity); | |
memmove(this->_items, buffer._items, buffer._capacity * sizeof(T)); | |
} | |
return *this; | |
} | |
void EnsureCapacity(size_t capacity) | |
{ | |
if (this->_capacity < capacity) | |
GrowLength(capacity - this->_capacity); | |
} | |
}; | |
typedef CDynamicBuffer<char> CCharDynamicBuffer; | |
typedef CDynamicBuffer<wchar_t> CWCharDynamicBuffer; | |
typedef CDynamicBuffer<unsigned char> CByteDynamicBuffer; | |
#endif |