00001
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "CTBnum.hxx"
00015 #include "CTBosFill.hxx"
00016 #include "CTBexceptionIndexRange.hxx"
00017 #include "CTBexceptionConformity.hxx"
00018
00037
00039
00040 template <class T>
00041 inline CTBvectorCDsc<T>::CTBvectorCDsc()
00042 : mp_data(0),
00043 mi_size(0),
00044 mi_stride(0)
00045 {}
00046
00047
00049
00056 template <class T>
00057 inline CTBvectorCDsc<T>::CTBvectorCDsc(const T* p_data, CTBint i_size,
00058 CTBint i_stride)
00059 : mp_data(i_size > 0 ? (T*) p_data : 0),
00060 mi_size(i_size),
00061 mi_stride(i_stride)
00062 {}
00063
00064
00066
00072 template <class T>
00073 inline CTBvectorCDsc<T>::CTBvectorCDsc(const T* p_data, CTBrange ran)
00074 {
00075 mp_data = (T*)p_data + ran.Begin();
00076 if (ran.End() >= ran.Begin()) {
00077 mi_size = ran.End()-ran.Begin()+1;
00078 mi_stride = 1;
00079 } else {
00080 mi_size = ran.Begin()-ran.End()+1;
00081 mi_stride = -1;
00082 }
00083 }
00084
00085
00087
00094 template <class T>
00095 inline CTBvectorCDsc<T>::CTBvectorCDsc(const T* p_data, CTBint i_stride,
00096 CTBrange ran)
00097 {
00098 mp_data = (T*)p_data + i_stride*ran.Begin();
00099 if (ran.End() >= ran.Begin()) {
00100 mi_size = ran.End()-ran.Begin()+1;
00101 mi_stride = i_stride;
00102 } else {
00103 mi_size = ran.Begin()-ran.End()+1;
00104 mi_stride = -i_stride;
00105 }
00106 }
00107
00108
00110
00111 template <class T>
00112 inline const T* CTBvectorCDsc<T>::Data() const
00113 {
00114 return mp_data;
00115 }
00116
00117
00119
00120 template <class T>
00121 inline CTBint CTBvectorCDsc<T>::Size() const
00122 {
00123 return mi_size;
00124 }
00125
00126
00128
00129 template <class T>
00130 inline CTBint CTBvectorCDsc<T>::Stride() const
00131 {
00132 return mi_stride;
00133 }
00134
00135
00137
00138 template <class T>
00139 inline void CTBvectorCDsc<T>::Dump(int i_indent, ostream& os,
00140 const char* p_text) const
00141 {
00142 CTBosFill bl(i_indent);
00143
00144 os << bl << "--CTBvectorCDsc<T> ";
00145 if (p_text) os << p_text;
00146 os << " @ " << this << endl;
00147 os << bl << " mp_data: " << (void*) mp_data << endl;
00148 os << bl << " mi_size: " << mi_size << endl;
00149 os << bl << " mi_stride: " << mi_stride << endl;
00150 return;
00151 }
00152
00153
00155
00156 template <class T>
00157 inline const T& CTBvectorCDsc<T>::operator[](CTBint i_ind) const
00158 {
00159 #ifdef CTB__IndexCheck
00160 CTBindexRangeCheck(i_ind,mi_size,"CTBvectorCDsc::operator[]");
00161 #endif
00162 return mp_data[mi_stride*i_ind];
00163 }
00164
00165
00167
00168 template <class T>
00169 inline const T& CTBvectorCDsc<T>::operator()(CTBint i_ind) const
00170 {
00171 #ifdef CTB__IndexCheck
00172 CTBindexRangeCheck(i_ind,mi_size,"CTBvectorCDsc::operator()");
00173 #endif
00174 return mp_data[mi_stride*i_ind];
00175 }
00176
00177
00179
00180 template <class T>
00181 inline bool CTBvectorCDsc<T>::operator!() const
00182 {
00183 return mi_size == 0;
00184 }
00185
00186
00188
00189 template <class T>
00190 inline CTBvectorCDsc<T>::operator void* () const
00191 {
00192 return mp_data;
00193 }
00194
00195
00201 template <class T>
00202 inline ostream& operator<<(ostream& os, CTBvectorCDsc<T> obj)
00203 {
00204 int i_width = os.width();
00205
00206 os << setw(0) << "{";
00207 for (CTBint i = 0; i < obj.Size(); i++) {
00208 if (i > 0) os << ",";
00209 os << setw(i_width) << obj(i);
00210 }
00211 os << "}";
00212 return os;
00213 }
00214
00215
00235
00237
00243 template <class T>
00244 inline CTBvectorDsc<T>::CTBvectorDsc()
00245 : CTBvectorCDsc<T>()
00246 {}
00247
00248
00250
00257 template <class T>
00258 inline CTBvectorDsc<T>::CTBvectorDsc(T* p_data, CTBint i_size, CTBint i_stride)
00259 : CTBvectorCDsc<T>(p_data,i_size,i_stride)
00260 {}
00261
00262
00264
00265 template <class T>
00266 inline CTBvectorDsc<T>::CTBvectorDsc(T* p_data, CTBrange ran)
00267 : CTBvectorCDsc<T>(p_data,ran)
00268 {}
00269
00270
00272
00279 template <class T>
00280 inline CTBvectorDsc<T>::CTBvectorDsc(T* p_data, CTBint i_stride, CTBrange ran)
00281 : CTBvectorCDsc<T>(p_data,i_stride,ran)
00282 {}
00283
00284
00286
00287 template <class T>
00288 inline T* CTBvectorDsc<T>::Data() const
00289 {
00290 return mp_data;
00291 }
00292
00293
00295
00296 template <class T>
00297 inline T& CTBvectorDsc<T>::operator[](CTBint i_ind) const
00298 {
00299 #ifdef CTB__IndexCheck
00300 CTBindexRangeCheck(i_ind,mi_size,"CTBvectorCDsc::operator[]");
00301 #endif
00302 return mp_data[mi_stride*i_ind];
00303 }
00304
00305
00307
00308 template <class T>
00309 inline T& CTBvectorDsc<T>::operator()(CTBint i_ind) const
00310 {
00311 #ifdef CTB__IndexCheck
00312 CTBindexRangeCheck(i_ind,mi_size,"CTBvectorCDsc::operator()");
00313 #endif
00314 return mp_data[mi_stride*i_ind];
00315 }
00316
00317
00319
00320 template <class T>
00321 const CTBvectorDsc<T>& CTBvectorDsc<T>::operator=(const T& rhs) const
00322 {
00323 T* po = mp_data;
00324
00325 for (CTBint i = 0; i < mi_size; i++) {
00326 *po = rhs;
00327 po += mi_stride;
00328 }
00329 return *this;
00330 }
00331
00332
00333
00334
00335
00336
00337
00338
00339
00341
00342 template <class T>
00343 const CTBvectorDsc<T>& CTBvectorDsc<T>::operator=(
00344 const CTBvectorDsc<T>& rhs) const
00345 {
00346 return operator=((const CTBvectorCDsc<T>) rhs);
00347 }
00348
00349
00351
00352 template <class T>
00353 const CTBvectorDsc<T>& CTBvectorDsc<T>::operator=(
00354 const CTBvectorCDsc<T>& rhs) const
00355 {
00356 CTBint i_size = CTBmin(mi_size,rhs.Size());
00357 T* po = mp_data;
00358 const T* p1 = rhs.Data();
00359 CTBint i_so = mi_stride;
00360 CTBint i_s1 = rhs.Stride();
00361
00362 #ifdef CTB__ConformityCheck
00363 if (mi_size != rhs.Size())
00364 throw CTBexceptionConformity(mi_size,rhs.Size(),
00365 "CTBvectorDsc::operator=(CTBvectorDsc&)");
00366 #endif
00367
00368 for (CTBint i = 0; i < i_size; i++) {
00369 *po = *p1;
00370 po += i_so;
00371 p1 += i_s1;
00372 }
00373 return *this;
00374 }
00375
00376
00377
00378
00379
00380