1 // Common/Buffer.h 2 3 #ifndef __COMMON_BUFFER_H 4 #define __COMMON_BUFFER_H 5 6 #include "Defs.h" 7 8 template <class T> class CBuffer 9 { 10 protected: 11 size_t _capacity; 12 T *_items; 13 public: Free()14 void Free() 15 { 16 delete []_items; 17 _items = 0; 18 _capacity = 0; 19 } CBuffer()20 CBuffer(): _capacity(0), _items(0) {}; CBuffer(const CBuffer & buffer)21 CBuffer(const CBuffer &buffer): _capacity(0), _items(0) { *this = buffer; } CBuffer(size_t size)22 CBuffer(size_t size): _items(0), _capacity(0) { SetCapacity(size); } ~CBuffer()23 virtual ~CBuffer() { delete []_items; } 24 operator T *() { return _items; }; 25 operator const T *() const { return _items; }; GetCapacity()26 size_t GetCapacity() const { return _capacity; } SetCapacity(size_t newCapacity)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 56 template <class T> 57 bool 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 67 template <class T> 68 bool operator!=(const CBuffer<T>& b1, const CBuffer<T>& b2) 69 { 70 return !(b1 == b2); 71 } 72 73 typedef CBuffer<char> CCharBuffer; 74 typedef CBuffer<wchar_t> CWCharBuffer; 75 typedef CBuffer<unsigned char> CByteBuffer; 76 77 #endif 78