Buffer.h revision baa3858d3f5d128a5c8466b700098109edcad5f2
1// Common/Buffer.h 2 3#ifndef __COMMON_BUFFER_H 4#define __COMMON_BUFFER_H 5 6#include "Defs.h" 7 8template <class T> class CBuffer 9{ 10protected: 11 size_t _capacity; 12 T *_items; 13public: 14 void Free() 15 { 16 delete []_items; 17 _items = 0; 18 _capacity = 0; 19 } 20 CBuffer(): _capacity(0), _items(0) {}; 21 CBuffer(const CBuffer &buffer): _capacity(0), _items(0) { *this = buffer; } 22 CBuffer(size_t size): _items(0), _capacity(0) { SetCapacity(size); } 23 virtual ~CBuffer() { delete []_items; } 24 operator T *() { return _items; }; 25 operator const T *() const { return _items; }; 26 size_t GetCapacity() const { return _capacity; } 27 void SetCapacity(size_t newCapacity) 28 { 29 if (newCapacity == _capacity) 30 return; 31 T *newBuffer; 32 if (newCapacity > 0) 33 { 34 newBuffer = new T[newCapacity]; 35 if (_capacity > 0) 36 memmove(newBuffer, _items, MyMin(_capacity, newCapacity) * sizeof(T)); 37 } 38 else 39 newBuffer = 0; 40 delete []_items; 41 _items = newBuffer; 42 _capacity = newCapacity; 43 } 44 CBuffer& operator=(const CBuffer &buffer) 45 { 46 Free(); 47 if (buffer._capacity > 0) 48 { 49 SetCapacity(buffer._capacity); 50 memmove(_items, buffer._items, buffer._capacity * sizeof(T)); 51 } 52 return *this; 53 } 54}; 55 56template <class T> 57bool operator==(const CBuffer<T>& b1, const CBuffer<T>& b2) 58{ 59 if (b1.GetCapacity() != b2.GetCapacity()) 60 return false; 61 for (size_t i = 0; i < b1.GetCapacity(); i++) 62 if (b1[i] != b2[i]) 63 return false; 64 return true; 65} 66 67template <class T> 68bool operator!=(const CBuffer<T>& b1, const CBuffer<T>& b2) 69{ 70 return !(b1 == b2); 71} 72 73typedef CBuffer<char> CCharBuffer; 74typedef CBuffer<wchar_t> CWCharBuffer; 75typedef CBuffer<unsigned char> CByteBuffer; 76 77#endif 78