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