00001
00002
00003 #ifndef SMARTPTR_H
00004 #define SMARTPTR_H
00005
00006 typedef unsigned long int ulint_smartpt;
00007
00008 template <class T>
00009 class SmartPtrBase_sidtt
00010 {
00011 public:
00012
00013
00014 SmartPtrBase_sidtt(T* buffer, ulint_smartpt bufferLen, bool bufOwner = false) : dummy(0)
00015 {
00016 doFree = bufOwner;
00017 if ( bufferLen )
00018 {
00019 bufBegin = buffer;
00020 pBufCurrent = buffer;
00021 bufEnd = bufBegin + bufferLen;
00022 bufLen = bufferLen;
00023 status = true;
00024 }
00025 else
00026 {
00027 bufBegin = 0;
00028 pBufCurrent = 0;
00029 bufEnd = 0;
00030 bufLen = 0;
00031 status = false;
00032 }
00033 }
00034
00035
00036
00037 virtual ~SmartPtrBase_sidtt()
00038 {
00039 if ( doFree && bufBegin )
00040 {
00041 #ifndef SID_HAVE_BAD_COMPILER
00042 delete[] bufBegin;
00043 #else
00044 delete[] (void*)bufBegin;
00045 #endif
00046 }
00047 }
00048
00049
00050
00051 virtual T* tellBegin() const { return bufBegin; }
00052 virtual ulint_smartpt tellLength() const { return bufLen; }
00053 virtual ulint_smartpt tellPos() const { return (ulint_smartpt)(pBufCurrent-bufBegin); }
00054
00055 virtual bool checkIndex(ulint_smartpt index)
00056 {
00057 return ((pBufCurrent+index)<bufEnd);
00058 }
00059
00060 virtual bool reset()
00061 {
00062 if ( bufLen )
00063 {
00064 pBufCurrent = bufBegin;
00065 return (status = true);
00066 }
00067 else
00068 {
00069 return (status = false);
00070 }
00071 }
00072
00073 virtual bool good()
00074 {
00075 return (pBufCurrent<bufEnd);
00076 }
00077
00078 virtual bool fail()
00079 {
00080 return (pBufCurrent==bufEnd);
00081 }
00082
00083 virtual void operator ++()
00084 {
00085 if ( good() )
00086 {
00087 pBufCurrent++;
00088 }
00089 else
00090 {
00091 status = false;
00092 }
00093 }
00094
00095 virtual void operator ++(int)
00096 {
00097 if ( good() )
00098 {
00099 pBufCurrent++;
00100 }
00101 else
00102 {
00103 status = false;
00104 }
00105 }
00106
00107 virtual void operator --()
00108 {
00109 if ( !fail() )
00110 {
00111 pBufCurrent--;
00112 }
00113 else
00114 {
00115 status = false;
00116 }
00117 }
00118
00119 virtual void operator --(int)
00120 {
00121 if ( !fail() )
00122 {
00123 pBufCurrent--;
00124 }
00125 else
00126 {
00127 status = false;
00128 }
00129 }
00130
00131 virtual void operator +=(ulint_smartpt offset)
00132 {
00133 if (checkIndex(offset))
00134 {
00135 pBufCurrent += offset;
00136 }
00137 else
00138 {
00139 status = false;
00140 }
00141 }
00142
00143 virtual void operator -=(ulint_smartpt offset)
00144 {
00145 if ((pBufCurrent-offset) >= bufBegin)
00146 {
00147 pBufCurrent -= offset;
00148 }
00149 else
00150 {
00151 status = false;
00152 }
00153 }
00154
00155 virtual T operator*()
00156 {
00157 if ( good() )
00158 {
00159 return *pBufCurrent;
00160 }
00161 else
00162 {
00163 status = false;
00164 return dummy;
00165 }
00166 }
00167
00168 virtual T& operator [](ulint_smartpt index)
00169 {
00170 if (checkIndex(index))
00171 {
00172 return pBufCurrent[index];
00173 }
00174 else
00175 {
00176 status = false;
00177 return dummy;
00178 }
00179 }
00180
00181 virtual operator bool() { return status; }
00182
00183 protected:
00184 T* bufBegin;
00185 T* bufEnd;
00186 T* pBufCurrent;
00187 ulint_smartpt bufLen;
00188 bool status;
00189 bool doFree;
00190 T dummy;
00191 };
00192
00193
00194 template <class T>
00195 class SmartPtr_sidtt : public SmartPtrBase_sidtt<T>
00196 {
00197 public:
00198
00199
00200 SmartPtr_sidtt(T* buffer, ulint_smartpt bufferLen, bool bufOwner = false)
00201 : SmartPtrBase_sidtt<T>(buffer, bufferLen, bufOwner)
00202 {
00203 }
00204
00205 SmartPtr_sidtt()
00206 : SmartPtrBase_sidtt<T>(0,0)
00207 {
00208 }
00209
00210 void setBuffer(T* buffer, ulint_smartpt bufferLen)
00211 {
00212 if ( bufferLen )
00213 {
00214 this->bufBegin = buffer;
00215 this->pBufCurrent = buffer;
00216 this->bufEnd = buffer + bufferLen;
00217 this->bufLen = bufferLen;
00218 this->status = true;
00219 }
00220 else
00221 {
00222 this->bufBegin = 0;
00223 this->pBufCurrent = 0;
00224 this->bufEnd = 0;
00225 this->bufLen = 0;
00226 this->status = false;
00227 }
00228 }
00229 };
00230
00231 #endif