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 
00027 
00028 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00029 inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField()
00030 :
00031     Field<T>(0),
00032     capacity_(Field<T>::size())
00033 {}
00034 
00035 
00036 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00037 inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField
00038 (
00039     const label nElem
00040 )
00041 :
00042     Field<T>(nElem),
00043     capacity_(Field<T>::size())
00044 {
00045     
00046     Field<T>::size(0);
00047 }
00048 
00049 
00050 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00051 inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField
00052 (
00053     const UList<T>& lst
00054 )
00055 :
00056     Field<T>(lst),
00057     capacity_(Field<T>::size())
00058 {}
00059 
00060 
00061 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00062 inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField
00063 (
00064     const Xfer<List<T> >& lst
00065 )
00066 :
00067     Field<T>(lst),
00068     capacity_(Field<T>::size())
00069 {}
00070 
00071 
00072 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00073 inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField
00074 (
00075     const UList<T>& mapF,
00076     const labelList& mapAddressing
00077 )
00078 :
00079     Field<T>(mapF, mapAddressing),
00080     capacity_(Field<T>::size())
00081 {}
00082 
00083 
00084 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00085 inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField
00086 (
00087     const UList<T>& mapF,
00088     const labelListList& mapAddressing,
00089     const scalarListList& weights
00090 )
00091 :
00092     Field<T>(mapF, mapAddressing, weights),
00093     capacity_(Field<T>::size())
00094 {}
00095 
00096 
00097 
00098 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00099 inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField
00100 (
00101     const UList<T>& mapF,
00102     const FieldMapper& map
00103 )
00104 :
00105     Field<T>(mapF, map),
00106     capacity_(Field<T>::size())
00107 {}
00108 
00109 
00110 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00111 inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField
00112 (
00113     const DynamicField<T, SizeInc, SizeMult, SizeDiv>& lst
00114 )
00115 :
00116     Field<T>(lst),
00117     capacity_(lst.capacity())
00118 {}
00119 
00120 
00121 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00122 inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField
00123 (
00124     const Xfer<DynamicField<T, SizeInc, SizeMult, SizeDiv> >& lst
00125 )
00126 :
00127     Field<T>(lst),
00128     capacity_(Field<T>::size())
00129 {}
00130 
00131 
00132 
00133 
00134 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00135 inline Foam::label Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::capacity()
00136 const
00137 {
00138     return capacity_;
00139 }
00140 
00141 
00142 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00143 inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::setCapacity
00144 (
00145     const label nElem
00146 )
00147 {
00148     label nextFree = Field<T>::size();
00149     capacity_ = nElem;
00150 
00151     if (nextFree > capacity_)
00152     {
00153         
00154         nextFree = capacity_;
00155     }
00156     
00157 
00158     Field<T>::setSize(capacity_);
00159     Field<T>::size(nextFree);
00160 }
00161 
00162 
00163 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00164 inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::reserve
00165 (
00166     const label nElem
00167 )
00168 {
00169     
00170     if (nElem > capacity_)
00171     {
00172 
00173 
00174 
00175 
00176 
00177 
00178 
00179 
00180 
00181 
00182 
00183 
00184         {
00185             capacity_ = max
00186             (
00187                 nElem,
00188                 label(SizeInc + capacity_ * SizeMult / SizeDiv)
00189             );
00190         }
00191 
00192         
00193         label nextFree = Field<T>::size();
00194         Field<T>::setSize(capacity_);
00195         Field<T>::size(nextFree);
00196     }
00197 }
00198 
00199 
00200 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00201 inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::setSize
00202 (
00203     const label nElem
00204 )
00205 {
00206     
00207     if (nElem > capacity_)
00208     {
00209 
00210 
00211 
00212 
00213 
00214 
00215 
00216 
00217 
00218 
00219 
00220 
00221         {
00222             capacity_ = max
00223             (
00224                 nElem,
00225                 label(SizeInc + capacity_ * SizeMult / SizeDiv)
00226             );
00227         }
00228 
00229         Field<T>::setSize(capacity_);
00230     }
00231 
00232     
00233     Field<T>::size(nElem);
00234 }
00235 
00236 
00237 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00238 inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::setSize
00239 (
00240     const label nElem,
00241     const T& t
00242 )
00243 {
00244     label nextFree = Field<T>::size();
00245     setSize(nElem);
00246 
00247     
00248     while (nextFree < nElem)
00249     {
00250         this->operator[](nextFree++) = t;
00251     }
00252 }
00253 
00254 
00255 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00256 inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::resize
00257 (
00258     const label nElem
00259 )
00260 {
00261     this->setSize(nElem);
00262 }
00263 
00264 
00265 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00266 inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::resize
00267 (
00268     const label nElem,
00269     const T& t
00270 )
00271 {
00272     this->setSize(nElem, t);
00273 }
00274 
00275 
00276 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00277 inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::clear()
00278 {
00279     Field<T>::size(0);
00280 }
00281 
00282 
00283 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00284 inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::clearStorage()
00285 {
00286     Field<T>::clear();
00287     capacity_ = 0;
00288 }
00289 
00290 
00291 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00292 inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>&
00293 Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::shrink()
00294 {
00295     label nextFree = Field<T>::size();
00296     if (capacity_ > nextFree)
00297     {
00298         
00299         Field<T>::size(capacity_);
00300 
00301         
00302         capacity_ = nextFree;
00303         Field<T>::setSize(capacity_);
00304         Field<T>::size(nextFree);
00305     }
00306     return *this;
00307 }
00308 
00309 
00310 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00311 inline Foam::Xfer<Foam::List<T> >
00312 Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::xfer()
00313 {
00314     return xferMoveTo< List<T> >(*this);
00315 }
00316 
00317 
00318 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00319 inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>&
00320 Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::append
00321 (
00322     const T& t
00323 )
00324 {
00325     const label elemI = List<T>::size();
00326     setSize(elemI + 1);
00327 
00328     this->operator[](elemI) = t;
00329     return *this;
00330 }
00331 
00332 
00333 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00334 inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>&
00335 Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::append
00336 (
00337     const UList<T>& lst
00338 )
00339 {
00340     if (this == &lst)
00341     {
00342         FatalErrorIn
00343         (
00344             "DynamicField<T, SizeInc, SizeMult, SizeDiv>::append"
00345             "(const UList<T>&)"
00346         )   << "attempted appending to self" << abort(FatalError);
00347     }
00348 
00349     label nextFree = List<T>::size();
00350     setSize(nextFree + lst.size());
00351 
00352     forAll(lst, elemI)
00353     {
00354         this->operator[](nextFree++) = lst[elemI];
00355     }
00356     return *this;
00357 }
00358 
00359 
00360 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00361 inline T Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::remove()
00362 {
00363     const label elemI = List<T>::size() - 1;
00364 
00365     if (elemI < 0)
00366     {
00367         FatalErrorIn
00368         (
00369             "Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::remove()"
00370         )   << "List is empty" << abort(FatalError);
00371     }
00372 
00373     const T& val = List<T>::operator[](elemI);
00374 
00375     List<T>::size(elemI);
00376 
00377     return val;
00378 }
00379 
00380 
00381 
00382 
00383 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00384 inline T& Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::operator()
00385 (
00386     const label elemI
00387 )
00388 {
00389     if (elemI >= Field<T>::size())
00390     {
00391         setSize(elemI + 1);
00392     }
00393 
00394     return this->operator[](elemI);
00395 }
00396 
00397 
00398 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00399 inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::operator=
00400 (
00401     const T& t
00402 )
00403 {
00404     UList<T>::operator=(t);
00405 }
00406 
00407 
00408 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00409 inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::operator=
00410 (
00411     const DynamicField<T, SizeInc, SizeMult, SizeDiv>& lst
00412 )
00413 {
00414     if (this == &lst)
00415     {
00416         FatalErrorIn
00417         (
00418             "DynamicField<T, SizeInc, SizeMult, SizeDiv>::operator="
00419             "(const DynamicField<T, SizeInc, SizeMult, SizeDiv>&)"
00420         )   << "attempted assignment to self" << abort(FatalError);
00421     }
00422 
00423     if (capacity_ >= lst.size())
00424     {
00425         
00426         Field<T>::size(lst.size());
00427         Field<T>::operator=(lst);
00428     }
00429     else
00430     {
00431         
00432         Field<T>::size(capacity_);
00433 
00434         Field<T>::operator=(lst);
00435         capacity_ = Field<T>::size();
00436     }
00437 }
00438 
00439 
00440 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
00441 inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::operator=
00442 (
00443     const UList<T>& lst
00444 )
00445 {
00446     if (capacity_ >= lst.size())
00447     {
00448         
00449         Field<T>::size(lst.size());
00450         Field<T>::operator=(lst);
00451     }
00452     else
00453     {
00454         
00455         Field<T>::size(capacity_);
00456 
00457         Field<T>::operator=(lst);
00458         capacity_ = Field<T>::size();
00459     }
00460 }
00461 
00462 
00463