// Common/Buffer.h | |
#ifndef __COMMON_BUFFER_H | |
#define __COMMON_BUFFER_H | |
#include "Defs.h" | |
template <class T> class CBuffer | |
{ | |
protected: | |
size_t _capacity; | |
T *_items; | |
public: | |
void Free() | |
{ | |
delete []_items; | |
_items = 0; | |
_capacity = 0; | |
} | |
CBuffer(): _capacity(0), _items(0) {}; | |
CBuffer(const CBuffer &buffer): _capacity(0), _items(0) { *this = buffer; } | |
CBuffer(size_t size): _items(0), _capacity(0) { SetCapacity(size); } | |
virtual ~CBuffer() { delete []_items; } | |
operator T *() { return _items; }; | |
operator const T *() const { return _items; }; | |
size_t GetCapacity() const { return _capacity; } | |
void SetCapacity(size_t newCapacity) | |
{ | |
if (newCapacity == _capacity) | |
return; | |
T *newBuffer; | |
if (newCapacity > 0) | |
{ | |
newBuffer = new T[newCapacity]; | |
if (_capacity > 0) | |
memmove(newBuffer, _items, MyMin(_capacity, newCapacity) * sizeof(T)); | |
} | |
else | |
newBuffer = 0; | |
delete []_items; | |
_items = newBuffer; | |
_capacity = newCapacity; | |
} | |
CBuffer& operator=(const CBuffer &buffer) | |
{ | |
Free(); | |
if (buffer._capacity > 0) | |
{ | |
SetCapacity(buffer._capacity); | |
memmove(_items, buffer._items, buffer._capacity * sizeof(T)); | |
} | |
return *this; | |
} | |
}; | |
template <class T> | |
bool operator==(const CBuffer<T>& b1, const CBuffer<T>& b2) | |
{ | |
if (b1.GetCapacity() != b2.GetCapacity()) | |
return false; | |
for (size_t i = 0; i < b1.GetCapacity(); i++) | |
if (b1[i] != b2[i]) | |
return false; | |
return true; | |
} | |
template <class T> | |
bool operator!=(const CBuffer<T>& b1, const CBuffer<T>& b2) | |
{ | |
return !(b1 == b2); | |
} | |
typedef CBuffer<char> CCharBuffer; | |
typedef CBuffer<wchar_t> CWCharBuffer; | |
typedef CBuffer<unsigned char> CByteBuffer; | |
#endif |