00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #define NO_DEBUG
00027 #ifndef VDKARRAY_H
00028 #define VDKARRAY_H
00029
00030
00031
00032
00033
00034
00072 template <class T> class VDKArray
00073 {
00074
00075 private:
00076
00077
00078
00079
00083 T& At(int ndx)
00084 {
00085 return start[ndx-1];
00086 }
00087 protected:
00088 int xDim;
00089 T* start;
00090 public:
00095 VDKArray(int n = 0):xDim(n),start(n ? new T[n]: (T*) NULL)
00096 {
00097 }
00101 VDKArray(const VDKArray&);
00105 VDKArray& operator=(const VDKArray&);
00109 virtual ~VDKArray()
00110 {
00111 if(start)
00112 delete[] start;
00113 }
00117 int size()
00118 {
00119 return xDim ;
00120 }
00124 void resize(int);
00125
00126
00138 T& operator[](int ndx)
00139 {
00140 return start[ndx];
00141 }
00142 const T& operator[](int ndx) const
00143 {
00144 return start[ndx];
00145 }
00146
00154 VDKArray<T>& Heapsort();
00158 virtual int operator==(VDKArray<T>& m);
00159 };
00160
00161
00162
00163 template <class T>
00164 VDKArray<T>::VDKArray(const VDKArray<T> &v)
00165 {
00166 xDim = v.xDim;
00167 start = new T[xDim];
00168 for(register int i = 0;i < xDim; i++) start[i] = v.start[i];
00169 }
00170
00171 template <class T>
00172 void VDKArray<T>::resize(int ns)
00173 {
00174 T* temp = new T[ns];
00175 T* pstart = start,*ptemp = temp;
00176
00177 int s = (ns > xDim) ? xDim : ns;
00178
00179 for(register int i = 0;i < s; i++) *ptemp++ = *pstart++;
00180
00181 delete[] start;
00182 start = temp;
00183 xDim = ns;
00184 }
00185
00186 template <class T>
00187 VDKArray<T>& VDKArray<T>::operator=(const VDKArray<T>&v)
00188 {
00189
00190 if(this !=&v)
00191 {
00192 if(start) delete[] start;
00193 xDim = v.xDim;
00194 start=new T[xDim];
00195 for(register int i = 0;i < xDim; i++)
00196 start[i] = v.start[i];
00197 }
00198 return *this;
00199 }
00200
00201 template <class T> int
00202 VDKArray<T>::operator==(VDKArray<T>& m)
00203 {
00204 if(xDim != m.xDim) return 0;
00205 register int i;
00206 for(i = 0;
00207 (i < xDim) &&
00208 ((*this)[i] == m[i]); i++) ;
00209 return i == xDim ? 1 : 0 ;
00210 }
00211
00212
00213
00214 template <class T>
00215 VDKArray<T>& VDKArray<T>::Heapsort()
00216 {
00217 unsigned int n = size();
00218 unsigned int i,ir,j,l;
00219 T rra;
00220 if(n<2) return *this;
00221 l = (n >> 1)+1;
00222 ir=n;
00223 for(;;)
00224 {
00225 if (l > 1) rra = At(--l);
00226 else
00227 {
00228 rra = At(ir); At(ir) = At(1);
00229 if(--ir == 1)
00230 {
00231 At(1) = rra; break;
00232 }
00233 }
00234 i = l; j = l+l;
00235 while(j <= ir)
00236 {
00237 if(j < ir && At(j) < At(j+1) ) j++;
00238 if(rra < At(j))
00239 {
00240 At(i) = At(j); i = j; j <<= 1;
00241 }
00242 else j = ir+1;
00243 }
00244 At(i) = rra;
00245 }
00246 return *this;
00247 }
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258 #endif
00259
00260
00261
00262
00263