Source code
Revision control
Copy as Markdown
Other Tools
// Common/DynamicBuffer.h↩
↩
#ifndef __COMMON_DYNAMIC_BUFFER_H↩
#define __COMMON_DYNAMIC_BUFFER_H↩
↩
template <class T> class CDynamicBuffer↩
{↩
T *_items;↩
size_t _size;↩
size_t _pos;↩
↩
CDynamicBuffer(const CDynamicBuffer &buffer);↩
void operator=(const CDynamicBuffer &buffer);↩
↩
void Grow(size_t size)↩
{↩
size_t delta = _size >= 64 ? _size : 64;↩
if (delta < size)↩
delta = size;↩
size_t newCap = _size + delta;↩
if (newCap < delta)↩
{↩
newCap = _size + size;↩
if (newCap < size)↩
throw 20120116;↩
}↩
↩
T *newBuffer = new T[newCap];↩
if (_pos != 0)↩
memcpy(newBuffer, _items, _pos * sizeof(T));↩
delete []_items;↩
_items = newBuffer;↩
_size = newCap;↩
}↩
↩
public:↩
CDynamicBuffer(): _items(0), _size(0), _pos(0) {}↩
// operator T *() { return _items; }↩
operator const T *() const { return _items; }↩
~CDynamicBuffer() { delete []_items; }↩
↩
T *GetCurPtrAndGrow(size_t addSize)↩
{↩
size_t rem = _size - _pos;↩
if (rem < addSize)↩
Grow(addSize - rem);↩
T *res = _items + _pos;↩
_pos += addSize;↩
return res;↩
}↩
↩
void AddData(const T *data, size_t size)↩
{↩
memcpy(GetCurPtrAndGrow(size), data, size * sizeof(T));↩
}↩
↩
const size_t GetPos() const { return _pos; }↩
↩
// void Empty() { _pos = 0; }↩
};↩
↩
typedef CDynamicBuffer<unsigned char> CByteDynamicBuffer;↩
↩
#endif↩