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