| // 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 |