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

CTBvector.cxx

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 <assert.h>
00015 
00016 #include "CTB.hxx"
00017 #include "CTB_Trace.hxx"
00018 #include "CTBnum.hxx"
00019 #include "CTBosFill.hxx"
00020 #include "CTBexceptionIndexRange.hxx"
00021 #include "CTBvector.hxx"
00022 
00051 //------------------------------------------+-----------------------------------
00053 
00054 template <class T>
00055 CTBvector<T>::CTBvector(CTBint i_size)
00056   : m_rbuf(i_size),
00057     mi_nuse(0)
00058 {
00059   CTB_Trace("CTBvector(CTBint)");
00060 
00061   m_rbuf.ConstructRange(0,i_size);
00062   mi_nuse = i_size;
00063 }
00064 
00065 //------------------------------------------+-----------------------------------
00067 
00068 template <class T>
00069 CTBvector<T>::CTBvector(CTBint i_size, const T& def)
00070   : m_rbuf(i_size),
00071     mi_nuse(0)
00072 {
00073   CTB_Trace("CTBvector(CTBint,const T&)");
00074 
00075   m_rbuf.ConstructRange(0,i_size,def);
00076   mi_nuse = i_size;
00077 }
00078 
00079 //------------------------------------------+-----------------------------------
00081 
00082 template <class T>
00083 CTBvector<T>::CTBvector(const CTBvector<T>& rhs)
00084   : m_rbuf(rhs.mi_nuse),
00085     mi_nuse(0)
00086 {
00087   CTB_Trace("CTBvector(const CTBvector&)");
00088 
00089   m_rbuf.ConstructRange(0,rhs.mi_nuse, (const T*) rhs);
00090   mi_nuse = rhs.mi_nuse;
00091 }
00092 
00093 //------------------------------------------+-----------------------------------
00095 
00096 template <class T>
00097 CTBvector<T>::~CTBvector()
00098 {
00099   CTB_Trace("~CTBvector()");
00100 
00101   assert(mi_nuse <= m_rbuf.Capacity());     // !?! size <= capacity
00102   m_rbuf.DestructRange(0,mi_nuse);
00103 }
00104 
00105 //------------------------------------------+-----------------------------------
00107 
00111 template <class T>
00112 T& CTBvector<T>::At(CTBint i_ind)
00113 {
00114   CTB_Trace("CTBvector::At(CTBint)");
00115   if (i_ind < 0 || i_ind >= mi_nuse) 
00116     throw CTBexceptionIndexRange(i_ind,mi_nuse,"CTBvector::At()");
00117   return m_rbuf[i_ind];
00118 }
00119 
00120 //------------------------------------------+-----------------------------------
00122 
00126 template <class T>
00127 const T& CTBvector<T>::At(CTBint i_ind) const
00128 {
00129   CTB_Trace("CTBvector::At(CTBint)");
00130   if (i_ind < 0 || i_ind >= mi_nuse) 
00131     throw CTBexceptionIndexRange(i_ind,mi_nuse,"CTBvector::At()");
00132   return m_rbuf[i_ind];
00133 }
00134 
00135 //------------------------------------------+-----------------------------------
00137 
00138 template <class T>
00139 void CTBvector<T>::Resize(CTBint i_size)
00140 {
00141   CTB_Trace("CTBvector::Resize(CTBint)");
00142 
00143   if (i_size < mi_nuse) {                   // downsize
00144     m_rbuf.DestructRange(i_size,mi_nuse-i_size);
00145     mi_nuse = i_size;
00146 
00147   } else if (i_size > mi_nuse) {            // upsize
00148     if (i_size > Capacity()) ChangeCapacity(i_size);
00149     m_rbuf.ConstructRange(mi_nuse,i_size-mi_nuse);
00150     mi_nuse = i_size;
00151   }
00152   return;
00153 }
00154 
00155 //------------------------------------------+-----------------------------------
00157 
00158 template <class T>
00159 void CTBvector<T>::Resize(CTBint i_size, const T& def)
00160 {
00161   CTB_Trace("CTBvector::Resize(CTBint,const T&)");
00162 
00163   if (i_size < mi_nuse) {                   // downsize
00164     m_rbuf.DestructRange(i_size,mi_nuse-i_size);
00165     mi_nuse = i_size;
00166 
00167   } else if (i_size > mi_nuse) {            // upsize
00168     if (i_size > Capacity()) ChangeCapacity(i_size);
00169     m_rbuf.ConstructRange(mi_nuse,i_size-mi_nuse,def);
00170     mi_nuse = i_size;
00171   }
00172   return;
00173 }
00174 
00175 //------------------------------------------+-----------------------------------
00177 
00178 template <class T>
00179 void CTBvector<T>::Insert(CTBint i_ind, const T& rhs)
00180 {
00181   CTB_Trace("CTBvector::Insert(CTBint,const T&)");
00182 
00183   assert(i_ind >= 0);                       // !?! valid index
00184   assert(i_ind <= mi_nuse);                 // !?! valid or beyond-the-end
00185 
00186   if (mi_nuse+1 > Capacity()) IncreaseCapacity(mi_nuse+1); // double if needed
00187   
00188   if (i_ind == mi_nuse) {                   // insert at tail
00189     m_rbuf.Construct(mi_nuse,rhs);
00190   } else {                                  // insert elsewhere
00191     m_rbuf.Construct(mi_nuse,m_rbuf[mi_nuse-1]); // new last element
00192     m_rbuf.ShiftRight(i_ind,mi_nuse-2);     // shift stuff inbetween
00193     m_rbuf[i_ind] = rhs;                    // finally insert
00194   }
00195   
00196   mi_nuse += 1;
00197   return;
00198 }
00199 
00200 //------------------------------------------+-----------------------------------
00202 
00203 template <class T>
00204 void CTBvector<T>::Delete(CTBint i_ind)
00205 {
00206   CTB_Trace("CTBvector::Delete(CTBint)");
00207 
00208   assert(i_ind >= 0);                       // !?! valid index
00209   assert(i_ind < mi_nuse);
00210 
00211   m_rbuf.ShiftLeft(i_ind+1,mi_nuse-1);      // shift stuff left
00212   m_rbuf.Destruct(mi_nuse-1);               // destruct last element
00213   mi_nuse -= 1;
00214   return;
00215 }
00216 
00217 //------------------------------------------+-----------------------------------
00219 
00220 template <class T>
00221 void CTBvector<T>::IncreaseCapacity(CTBint i_cap)
00222 {
00223   if (i_cap > Capacity()) ChangeCapacity(CTBmax(i_cap,CTBmax(4,2*Capacity())));
00224   return;
00225 }
00226 
00227 //------------------------------------------+-----------------------------------
00229 
00233 template <class T>
00234 void CTBvector<T>::Grab(CTBvector<T>& rhs)
00235 {
00236   assert(mi_nuse <= m_rbuf.Capacity());     // !?! size <= capacity
00237   m_rbuf.DestructRange(0,mi_nuse);          // destroy old stuff
00238   m_rbuf.Resize(0);                         // drop old buffer
00239   m_rbuf.Grab(rhs.m_rbuf);                  // finally grab rhs
00240   mi_nuse     = rhs.mi_nuse;
00241   rhs.mi_nuse = 0;
00242   return;
00243 }
00244 
00245 //------------------------------------------+-----------------------------------
00247 
00248 template <class T>
00249 void CTBvector<T>::Dump(int i_indent, ostream& os, const char* p_text) const
00250 {
00251   CTBosFill bl(i_indent);
00252   
00253   os << bl << "--CTBvector<T> ";
00254   if (p_text) os << p_text;
00255   os << " @ " << this << endl;
00256   os << bl << "  mi_nuse:       " << mi_nuse << endl;
00257   m_rbuf.Dump(i_indent+2,os);
00258   return;
00259 }
00260 
00261 //------------------------------------------+-----------------------------------
00263 
00264 template <class T>
00265 CTBvector<T>& CTBvector<T>::operator=(const T& rhs)
00266 {
00267   CTB_Trace("CTBvector::operator=(const T&)");
00268 
00269   m_rbuf.Copy(0,mi_nuse,rhs);
00270   return *this;
00271 }
00272 
00273 //------------------------------------------+-----------------------------------
00275 
00284 template <class T>
00285 CTBvector<T>& CTBvector<T>::operator=(const CTBvector<T>& rhs)
00286 {
00287   CTB_Trace("CTBvector::operator=(const CTBvector&)");
00288   CTBint i_size = rhs.Size();
00289 
00290   m_rbuf.DestructRange(0,mi_nuse);
00291   mi_nuse = 0;
00292   
00293   EnsureCapacity(i_size);
00294 
00295   m_rbuf.ConstructRange(0,i_size,(const T*) rhs);
00296   mi_nuse = i_size;
00297   return *this;
00298 }
00299 
00300 //------------------------------------------+-----------------------------------
00302  
00303 template <class T>
00304 CTBvector<T>& CTBvector<T>::operator=(const CTBvectorCDsc<T>& rhs)
00305 {
00306   CTB_Trace("CTBvector::operator=(const CTBvectorCDsc&)");
00307   CTBint i_size = rhs.Size();
00308    T*    p_ele;
00309 
00310   m_rbuf.DestructRange(0,mi_nuse);
00311   mi_nuse = 0;
00312   
00313   EnsureCapacity(i_size);
00314 
00315   p_ele = m_rbuf;
00316   for (CTBint i = 0; i < i_size; i++)  {
00317     m_rbuf.Construct(p_ele,rhs(i));
00318     p_ele += 1;
00319   }
00320   
00321   mi_nuse = i_size;
00322   return *this;
00323 }
00324 
00325 //------------------------------------------+-----------------------------------
00327 
00328 template <class T>
00329 void CTBvector<T>::ChangeCapacity(CTBint i_cap)
00330 {
00331   CTB_Trace("CTBvector::ChangeCapacity(CTBint)");
00332   CTBint i_size = Size();                   // vector size
00333   CTBrawBuffer<T> old_rbuf(m_rbuf,true);    // grab old rawbuffer
00334 
00335   m_rbuf.Resize(i_cap);                     // new buffer
00336 
00337   for (CTBint i = 0; i < i_size; i++) {     // copy and release elements
00338     m_rbuf.GrabConstruct(i,old_rbuf[i]);
00339     old_rbuf.Destruct(i);
00340   }
00341   return;
00342 }
00343 
00344 //------------------------------------------+-----------------------------------
00345 #if (defined(CTB__NoInline) || defined(CTBvector__NoInline))
00346 #define inline
00347 #include "CTBvector.icc"
00348 #undef  inline
00349 #endif

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