libsidplayfp
2.6.0
Main Page
Classes
Files
Examples
File List
src
sidtune
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>
14
class
SmartPtrBase_sidtt
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::EventCallback
Definition
EventCallback.h:36
libsidplayfp::SmartPtrBase_sidtt
Definition
SmartPtr.h:15
libsidplayfp::SmartPtr_sidtt
Definition
SmartPtr.h:193
Generated on Tue Jan 9 2024 00:00:00 for libsidplayfp by
1.10.0