Main Page   Modules   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages   Examples  

CTBvectorDsc.icc

Go to the documentation of this file.
00001 
00006 /*----------------------------------------------------------------------------*/
00007 /* C Tool Box: Designed and implemented by:                                   */
00008 /*    Walter F.J. Mueller   Gesellschaft fuer Schwerionenforschung (GSI)      */
00009 /*                          Planckstrasse 1, D-64291 Darmstadt, Germany       */
00010 /*                  Email:  W.F.J.Mueller@gsi.de                              */
00011 /*                  WWW:    http://www-kp3.gsi.de/www/kp3/people/mueller.html */
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;                           // note: != 0 only if mi_size > 0 
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 // Note:
00333 //  1. the return type must be const CTBvectorDsc because the method ist const !
00334 //     if not, one gets a warning like
00335 //       warning: conversion from `const CTBvectorDsc<int>' 
00336 //                to `CTBvectorDsc<int> &' discards const
00337 //     for the return statement !
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 // Note:
00377 //  1. a declaration of operator=(const CTBvectorCDsc<T>& rhs) alone does not
00378 //     work because a Dsc is *not* converted automatically to a CDsc in the
00379 //     resolution of an assignment. So one has to explicitely declare two
00380 //     assignment operators, one for Dsc and one for CDsc.

Generated at Fri Oct 24 18:11:30 2003 for CTBbase by doxygen1.2.9-20010812 written by Dimitri van Heesch, © 1997-2001