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