65 lines
1.3 KiB
C++
65 lines
1.3 KiB
C++
// 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
|