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