libsidplayfp  2.0.2
SmartPtr.h
1 /* Simple smart pointer class. */
2 
3 #ifndef SMARTPTR_H
4 #define SMARTPTR_H
5 
6 #include "sidcxx11.h"
7 
8 namespace libsidplayfp
9 {
10 
11 typedef unsigned long int ulint_smartpt;
12 
13 template<class T>
15 {
16 public:
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 
179 protected:
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 
191 template<class T>
192 class SmartPtr_sidtt final : public SmartPtrBase_sidtt<T>
193 {
194 public:
195  SmartPtr_sidtt(T* buffer, ulint_smartpt bufferLen, bool bufOwner = false) :
196  SmartPtrBase_sidtt<T>(buffer, bufferLen, bufOwner)
197  {}
198 
199  SmartPtr_sidtt() :
200  SmartPtrBase_sidtt<T>(0, 0)
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 */
libsidplayfp::SmartPtr_sidtt
Definition: SidTuneBase.h:43
libsidplayfp::SmartPtrBase_sidtt
Definition: SmartPtr.h:15