00001
00006
00007
00008
00009
00010
00011
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());
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) {
00144 m_rbuf.DestructRange(i_size,mi_nuse-i_size);
00145 mi_nuse = i_size;
00146
00147 } else if (i_size > mi_nuse) {
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) {
00164 m_rbuf.DestructRange(i_size,mi_nuse-i_size);
00165 mi_nuse = i_size;
00166
00167 } else if (i_size > mi_nuse) {
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);
00184 assert(i_ind <= mi_nuse);
00185
00186 if (mi_nuse+1 > Capacity()) IncreaseCapacity(mi_nuse+1);
00187
00188 if (i_ind == mi_nuse) {
00189 m_rbuf.Construct(mi_nuse,rhs);
00190 } else {
00191 m_rbuf.Construct(mi_nuse,m_rbuf[mi_nuse-1]);
00192 m_rbuf.ShiftRight(i_ind,mi_nuse-2);
00193 m_rbuf[i_ind] = rhs;
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);
00209 assert(i_ind < mi_nuse);
00210
00211 m_rbuf.ShiftLeft(i_ind+1,mi_nuse-1);
00212 m_rbuf.Destruct(mi_nuse-1);
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());
00237 m_rbuf.DestructRange(0,mi_nuse);
00238 m_rbuf.Resize(0);
00239 m_rbuf.Grab(rhs.m_rbuf);
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();
00333 CTBrawBuffer<T> old_rbuf(m_rbuf,true);
00334
00335 m_rbuf.Resize(i_cap);
00336
00337 for (CTBint i = 0; i < i_size; i++) {
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