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