libsidplayfp 2.15.0
SmartPtr.h
1/* Simple smart pointer class. */
2
3#ifndef SMARTPTR_H
4#define SMARTPTR_H
5
6#include "sidcxx11.h"
7
8namespace libsidplayfp
9{
10
11using ulint_smartpt = unsigned long int;
12
13template<class T>
15{
16public:
17 SmartPtrBase_sidtt(T* buffer, ulint_smartpt bufferLen, bool bufOwner = false) :
18 bufBegin(nullptr),
19 bufEnd(nullptr),
20 pBufCurrent(nullptr),
21 bufLen(0),
22 status(false),
23 doFree(bufOwner),
24 dummy(0)
25 {
26 if ((buffer != nullptr) && (bufferLen != 0))
27 {
28 bufBegin = buffer;
29 pBufCurrent = buffer;
30 bufEnd = bufBegin + bufferLen;
31 bufLen = bufferLen;
32 status = true;
33 }
34 }
35
36 virtual ~SmartPtrBase_sidtt()
37 {
38 if (doFree && (bufBegin != nullptr))
39 {
40 delete[] bufBegin;
41 }
42 }
43
44 /* --- public member functions --- */
45
46 virtual T* tellBegin() const { return bufBegin; }
47 virtual ulint_smartpt tellLength() const { return bufLen; }
48 virtual ulint_smartpt tellPos() const { return static_cast<ulint_smartpt>(pBufCurrent - bufBegin); }
49
50 virtual bool checkIndex(ulint_smartpt index) const
51 {
52 return (pBufCurrent + index) < bufEnd;
53 }
54
55 virtual bool reset()
56 {
57 if (bufLen)
58 {
59 pBufCurrent = bufBegin;
60 status = true;
61 }
62 else
63 {
64 status = false;
65 }
66 return status;
67 }
68
69 virtual bool good() const
70 {
71 return pBufCurrent < bufEnd;
72 }
73
74 virtual bool fail() const
75 {
76 return pBufCurrent == bufEnd;
77 }
78
79 virtual void operator ++()
80 {
81 if (good())
82 {
83 pBufCurrent++;
84 }
85 else
86 {
87 status = false;
88 }
89 }
90
91 virtual void operator ++(int)
92 {
93 if (good())
94 {
95 pBufCurrent++;
96 }
97 else
98 {
99 status = false;
100 }
101 }
102
103 virtual void operator --()
104 {
105 if (!fail())
106 {
107 pBufCurrent--;
108 }
109 else
110 {
111 status = false;
112 }
113 }
114
115 virtual void operator --(int)
116 {
117 if (!fail())
118 {
119 pBufCurrent--;
120 }
121 else
122 {
123 status = false;
124 }
125 }
126
127 virtual void operator +=(ulint_smartpt offset)
128 {
129 if (checkIndex(offset))
130 {
131 pBufCurrent += offset;
132 }
133 else
134 {
135 status = false;
136 }
137 }
138
139 virtual void operator -=(ulint_smartpt offset)
140 {
141 if ((pBufCurrent-offset) >= bufBegin)
142 {
143 pBufCurrent -= offset;
144 }
145 else
146 {
147 status = false;
148 }
149 }
150
151 virtual T operator*()
152 {
153 if (good())
154 {
155 return *pBufCurrent;
156 }
157 else
158 {
159 status = false;
160 return dummy;
161 }
162 }
163
164 virtual T& operator [](ulint_smartpt index)
165 {
166 if (checkIndex(index))
167 {
168 return pBufCurrent[index];
169 }
170 else
171 {
172 status = false;
173 return dummy;
174 }
175 }
176
177 virtual operator bool() { return status; }
178
179protected:
180 T* bufBegin;
181 T* bufEnd;
182 T* pBufCurrent;
183 ulint_smartpt bufLen;
184 bool status;
185
186 const bool doFree;
187 const T dummy;
188};
189
190
191template<class T>
192class SmartPtr_sidtt final : public SmartPtrBase_sidtt<T>
193{
194public:
195 SmartPtr_sidtt(T* buffer, ulint_smartpt bufferLen, bool bufOwner = false) :
196 SmartPtrBase_sidtt<T>(buffer, bufferLen, bufOwner)
197 {}
198
201 {}
202
203 void setBuffer(T* buffer, ulint_smartpt bufferLen)
204 {
205 if ((buffer != nullptr) && (bufferLen != 0))
206 {
207 this->bufBegin = buffer;
208 this->pBufCurrent = buffer;
209 this->bufEnd = buffer + bufferLen;
210 this->bufLen = bufferLen;
211 this->status = true;
212 }
213 else
214 {
215 this->bufBegin = nullptr;
216 this->pBufCurrent = nullptr;
217 this->bufEnd = nullptr;
218 this->bufLen = 0;
219 this->status = false;
220 }
221 }
222};
223
224}
225
226#endif /* SMARTPTR_H */
Definition SmartPtr.h:15
Definition SmartPtr.h:193