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>
9 class SmartPtrBase_sidtt
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 
~SmartPtrBase_sidtt()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 
tellBegin()49 	virtual T* tellBegin()  { return bufBegin; }
tellLength()50 	virtual ulint_smartpt tellLength()  { return bufLen; }
tellPos()51 	virtual ulint_smartpt tellPos()  { return (ulint_smartpt)(pBufCurrent-bufBegin); }
52 
checkIndex(ulint_smartpt index)53 	virtual bool checkIndex(ulint_smartpt index)
54 	{
55 		return ((pBufCurrent+index)<bufEnd);
56 	}
57 
reset()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 
good()71 	virtual bool good()
72 	{
73 		return (pBufCurrent<bufEnd);
74 	}
75 
fail()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>
194 class SmartPtr_sidtt : public SmartPtrBase_sidtt<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 
SmartPtr_sidtt()205 	SmartPtr_sidtt()
206 		: SmartPtrBase_sidtt<T>(0,0)
207 	{
208 	}
209 
setBuffer(T * buffer,ulint_smartpt bufferLen)210 	void setBuffer(T* buffer, ulint_smartpt bufferLen)
211 	{
212 		if ( bufferLen >= 1 )
213 		{
214 			this->pBufCurrent = ( this->bufBegin = buffer );
215 			this->bufEnd = this->bufBegin + 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 */
229