ENH: DynamicField: extend to be like DynamicList.

This commit is contained in:
mattijs
2010-10-29 16:37:37 +01:00
parent 5a85cab9e2
commit 13f86d8b68
4 changed files with 565 additions and 254 deletions

View File

@ -2,16 +2,16 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. \\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it OpenFOAM is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by under the terms of the GNU General Public License as published by the
the Free Software Foundation, either version 3 of the License, or Free Software Foundation; either version 2 of the License, or (at your
(at your option) any later version. option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
@ -19,15 +19,16 @@ License
for more details. for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Description Description
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "point.H"
#include "DynamicField.H" #include "DynamicField.H"
#include "IOstreams.H" #include "IOstreams.H"
#include "labelField.H"
using namespace Foam; using namespace Foam;
@ -36,44 +37,62 @@ using namespace Foam;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
{ DynamicField<point, 0, 10, 11> testField;
DynamicField<label> dl(10); DynamicField<point, 0, 10, 11> testField2;
Pout<< "null construct dl:" << dl << endl;
dl.append(3);
dl.append(2);
dl.append(1);
Pout<< "appending : dl:" << dl << endl;
dl[2] *= 10; testField.setSize(5);
Pout<< "assigning : dl:" << dl << endl; testField2.setSize(5);
}
{ testField[0] = testField2[0] = vector(1.0, 4.5, 6.3);
DynamicField<label> dl(IStringStream("(1 2 3)")()); testField[1] = testField2[1] = vector(5.2, 2.3, 3.5);
Pout<< "reading : dl:" << dl << endl; testField[2] = testField2[2] = vector(7.5, 4.7, 7.7);
} testField[3] = testField2[3] = vector(2.8, 8.2, 2.3);
testField[4] = testField2[4] = vector(6.1, 1.7, 8.8);
{ Info << "testField:" << testField << endl;
labelField lf(3);
lf[0] = 1;
lf[1] = 2;
lf[2] = 3;
DynamicField<label> dl;
dl = lf;
Pout<< "assigning from labelField : dl:" << dl << endl;
}
{ testField.append(vector(0.5, 4.8, 6.2));
labelField lf(3);
lf[0] = 1;
lf[1] = 2;
lf[2] = 3;
DynamicField<label> dl(lf);
Pout<< "constructing from labelField dl:" << dl << endl;
}
Info << "testField after appending:" << testField << endl;
Info<< "\nEnd\n"; testField.append(vector(2.7, 2.3, 6.1));
Info << "testField after appending:" << testField << endl;
vector elem = testField.remove();
Info << "removed element:" << elem << endl;
Info << "testField:" << testField << endl;
testField.append(vector(3.0, 1.3, 9.2));
Info << "testField:" << testField << endl;
testField.setSize(10, vector(1.5, 0.6, -1.0));
Info << "testField after setSize:" << testField << endl;
testField.append(testField2);
Info << "testField after appending testField2:" << testField << endl;
testField = testField2;
Info << "testField after assignment:" << testField << endl;
testField += testField2;
Info << "testField after field algebra:" << testField << endl;
testField.clear();
testField.append(vector(3.0, 1.3, 9.2));
Info << "testField after clear and append:" << testField << endl;
testField.clearStorage();
Info << "testField after clearStorage:" << testField << endl;
return 0; return 0;
} }

View File

@ -25,87 +25,53 @@ License
#include "DynamicField.H" #include "DynamicField.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
namespace Foam template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
{ Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField(Istream& is)
// * * * * * * * * * * * * * * * Static Members * * * * * * * * * * * * * * //
template<class Type>
const char* const DynamicField<Type>::typeName("DynamicField");
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class Type>
DynamicField<Type>::DynamicField(Istream& is)
: :
Field<Type>(is), Field<T>(is),
capacity_(Field<Type>::size()) capacity_(Field<T>::size())
{} {}
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
tmp<DynamicField<Type> > DynamicField<Type>::clone() const Foam::tmp<Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv> >
Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::clone() const
{ {
return tmp<DynamicField<Type> >(new DynamicField<Type>(*this)); return tmp<DynamicField<T, SizeInc, SizeMult, SizeDiv> >
(
new DynamicField<T, SizeInc, SizeMult, SizeDiv>(*this)
);
} }
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class Type>
void DynamicField<Type>::setSize(const label nElem)
{
// allocate more capacity?
if (nElem > capacity_)
{
capacity_ = max(nElem, label(1 + capacity_*2));
Field<Type>::setSize(capacity_);
}
// adjust addressed size
Field<Type>::size(nElem);
}
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
// * * * * * * * * * * * * * * * IOstream Operator * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * IOstream Operator * * * * * * * * * * * * * //
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
Ostream& operator<<(Ostream& os, const DynamicField<Type>& f) Foam::Ostream& Foam::operator<<
(
Ostream& os,
const DynamicField<T, SizeInc, SizeMult, SizeDiv>& lst
)
{ {
os << static_cast<const Field<Type>&>(f); os << static_cast<const Field<T>&>(lst);
return os; return os;
} }
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
Ostream& operator<<(Ostream& os, const tmp<DynamicField<Type> >& tf) Foam::Istream& Foam::operator>>
(
Istream& is,
DynamicField<T, SizeInc, SizeMult, SizeDiv>& lst
)
{ {
os << tf(); is >> static_cast<Field<T>&>(lst);
tf.clear(); lst.capacity_ = lst.Field<T>::size();
return os;
}
template<class Type>
Istream& operator>>(Istream& is, DynamicField<Type>& lst)
{
is >> static_cast<Field<Type>&>(lst);
lst.capacity_ = lst.Field<Type>::size();
return is; return is;
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* // // ************************************************************************* //

View File

@ -25,9 +25,10 @@ Class
Foam::DynamicField Foam::DynamicField
Description Description
Dynamically sized Field. WIP. Dynamically sized Field.
SourceFiles SourceFiles
DynamicFieldI.H
DynamicField.C DynamicField.C
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
@ -44,89 +45,78 @@ namespace Foam
// Forward declaration of friend functions and operators // Forward declaration of friend functions and operators
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
class DynamicField; class DynamicField;
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
Ostream& operator<<(Ostream&, const DynamicField<Type>&); Ostream& operator<<
(
template<class Type> Ostream&,
Ostream& operator<<(Ostream&, const tmp<DynamicField<Type> >&); const DynamicField<T, SizeInc, SizeMult, SizeDiv>&
);
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
Istream& operator>>(Istream&, DynamicField<Type>&); Istream& operator>>
(
Istream&,
DynamicField<T, SizeInc, SizeMult, SizeDiv>&
);
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
Class DynamicField Declaration Class DynamicField Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
template<class Type> template<class T, unsigned SizeInc=0, unsigned SizeMult=2, unsigned SizeDiv=1>
class DynamicField class DynamicField
: :
public Field<Type> public Field<T>
{ {
// Private data // Private data
//- The capacity (allocated size) of the underlying field. //- The capacity (allocated size) of the underlying field.
label capacity_; label capacity_;
//- Construct given size and initial value
DynamicField(const label, const Type&);
//- Construct as copy of tmp<DynamicField>
# ifdef ConstructFromTmp
DynamicField(const tmp<DynamicField<Type> >&);
# endif
//- Construct from a dictionary entry
DynamicField(const word&, const dictionary&, const label);
public: public:
// Static data members
static const char* const typeName;
// Static Member Functions // Static Member Functions
//- Return a null field //- Return a null field
inline static const DynamicField<Type>& null() inline static const DynamicField<T, SizeInc, SizeMult, SizeDiv>& null()
{ {
return *reinterpret_cast< DynamicField<Type>* >(0); return *reinterpret_cast
<
DynamicField<T, SizeInc, SizeMult, SizeDiv>*
>(0);
} }
// Constructors // Constructors
//- Construct null //- Construct null
// Used for temporary fields which are initialised after construction inline DynamicField();
DynamicField();
//- Construct given size //- Construct given size.
// Used for temporary fields which are initialised after construction
explicit inline DynamicField(const label); explicit inline DynamicField(const label);
//- Construct as copy of a UList\<Type\> //- Construct from UList. Size set to UList size.
explicit inline DynamicField(const UList<Type>&); // Also constructs from DynamicField with different sizing parameters.
explicit inline DynamicField(const UList<T>&);
//- Construct by transferring the List contents //- Construct by transferring the parameter contents
explicit inline DynamicField(const Xfer<List<Type> >&); explicit inline DynamicField(const Xfer<List<T> >&);
//- Construct by 1 to 1 mapping from the given field //- Construct by 1 to 1 mapping from the given field
inline DynamicField inline DynamicField
( (
const UList<Type>& mapF, const UList<T>& mapF,
const labelList& mapAddressing const labelList& mapAddressing
); );
//- Construct by interpolative mapping from the given field //- Construct by interpolative mapping from the given field
inline DynamicField inline DynamicField
( (
const UList<Type>& mapF, const UList<T>& mapF,
const labelListList& mapAddressing, const labelListList& mapAddressing,
const scalarListList& weights const scalarListList& weights
); );
@ -134,59 +124,129 @@ public:
//- Construct by mapping from the given field //- Construct by mapping from the given field
inline DynamicField inline DynamicField
( (
const UList<Type>& mapF, const UList<T>& mapF,
const FieldMapper& map const FieldMapper& map
); );
//- Construct as copy //- Construct copy
inline DynamicField(const DynamicField<Type>&); inline DynamicField(const DynamicField<T, SizeInc, SizeMult, SizeDiv>&);
//- Construct as copy or re-use as specified.
inline DynamicField(DynamicField<Type>&, bool reUse);
//- Construct by transferring the Field contents //- Construct by transferring the Field contents
inline DynamicField(const Xfer<DynamicField<Type> >&); inline DynamicField
(
const Xfer<DynamicField<T, SizeInc, SizeMult, SizeDiv> >&
);
//- Construct from Istream //- Construct from Istream. Size set to size of list read.
inline DynamicField(Istream&); explicit DynamicField(Istream&);
//- Clone //- Clone
tmp<DynamicField<Type> > clone() const; tmp<DynamicField<T, SizeInc, SizeMult, SizeDiv> > clone() const;
// Member Functions // Member Functions
//- Size of the underlying storage. // Access
inline label capacity() const;
//- Append an element at the end of the list //- Size of the underlying storage.
inline void append(const Type&); inline label capacity() const;
//- Alter the addressed list size. // Edit
// New space will be allocated if required.
// Use this to resize the list prior to using the operator[] for
// setting values (as per List usage).
void setSize(const label nElem);
// Member operators //- Alter the size of the underlying storage.
// The addressed size will be truncated if needed to fit, but will
// remain otherwise untouched.
// Use this or reserve() in combination with append().
inline void setCapacity(const label);
inline void operator=(const DynamicField<Type>&); //- Alter the addressed list size.
inline void operator=(const UList<Type>&); // New space will be allocated if required.
inline void operator=(const tmp<DynamicField<Type> >&); // Use this to resize the list prior to using the operator[] for
// setting values (as per List usage).
inline void setSize(const label);
//- Return element of Field. //- Alter the addressed list size and fill new space with a
using Field<Type>::operator[]; // constant.
inline void setSize(const label, const T&);
// IOstream operators //- Alter the addressed list size.
// New space will be allocated if required.
// Use this to resize the list prior to using the operator[] for
// setting values (as per List usage).
inline void resize(const label);
friend Ostream& operator<< <Type> //- Alter the addressed list size and fill new space with a
(Ostream&, const DynamicField<Type>&); // constant.
inline void resize(const label, const T&);
friend Ostream& operator<< <Type> //- Reserve allocation space for at least this size.
(Ostream&, const tmp<DynamicField<Type> >&); // Never shrinks the allocated size, use setCapacity() for that.
inline void reserve(const label);
friend Istream& operator>> <Type> //- Clear the addressed list, i.e. set the size to zero.
(Istream&, DynamicField<Type>&); // Allocated size does not change
inline void clear();
//- Clear the list and delete storage.
inline void clearStorage();
//- Shrink the allocated space to the number of elements used.
// Returns a reference to the DynamicField.
inline DynamicField<T, SizeInc, SizeMult, SizeDiv>& shrink();
//- Transfer contents to the Xfer container as a plain List
inline Xfer<List<T> > xfer();
// Member Operators
//- Append an element at the end of the list
inline DynamicField<T, SizeInc, SizeMult, SizeDiv>& append
(
const T&
);
//- Append a List at the end of this list
inline DynamicField<T, SizeInc, SizeMult, SizeDiv>& append
(
const UList<T>&
);
//- Remove and return the top element
inline T remove();
//- Return non-const access to an element, resizing list if
// necessary
inline T& operator()(const label);
//- Assignment of all addressed entries to the given value
inline void operator=(const T&);
//- Assignment from DynamicField
inline void operator=
(
const DynamicField<T, SizeInc, SizeMult, SizeDiv>&
);
//- Assignment from UList
inline void operator=(const UList<T>&);
// IOstream operators
// Write DynamicField to Ostream.
friend Ostream& operator<< <T, SizeInc, SizeMult, SizeDiv>
(
Ostream&,
const DynamicField<T, SizeInc, SizeMult, SizeDiv>&
);
//- Read from Istream, discarding contents of existing DynamicField.
friend Istream& operator>> <T, SizeInc, SizeMult, SizeDiv>
(
Istream&,
DynamicField<T, SizeInc, SizeMult, SizeDiv>&
);
}; };

View File

@ -23,175 +23,441 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "DynamicField.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
Foam::DynamicField<Type>::DynamicField() inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField()
: :
Field<Type>(), Field<T>(0),
capacity_(0) capacity_(Field<T>::size())
{} {}
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
Foam::DynamicField<Type>::DynamicField(const label size) inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField
(
const label nElem
)
: :
Field<Type>(size), Field<T>(nElem),
capacity_(Field<Type>::size()) capacity_(Field<T>::size())
{ {
Field<Type>::size(0); // we could also enforce SizeInc granularity when (!SizeMult || !SizeDiv)
Field<T>::size(0);
} }
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
inline Foam::DynamicField<Type>::DynamicField inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField
( (
const UList<Type>& lst const UList<T>& lst
) )
: :
Field<Type>(lst), Field<T>(lst),
capacity_(Field<Type>::size()) capacity_(Field<T>::size())
{} {}
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
inline Foam::DynamicField<Type>::DynamicField inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField
( (
const Xfer<List<Type> >& lst const Xfer<List<T> >& lst
) )
: :
Field<Type>(lst), Field<T>(lst),
capacity_(Field<Type>::size()) capacity_(Field<T>::size())
{} {}
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
Foam::DynamicField<Type>::DynamicField inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField
( (
const UList<Type>& mapF, const UList<T>& mapF,
const labelList& mapAddressing const labelList& mapAddressing
) )
: :
Field<Type>(mapF, mapAddressing), Field<T>(mapF, mapAddressing),
capacity_(Field<Type>::size()) capacity_(Field<T>::size())
{} {}
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
Foam::DynamicField<Type>::DynamicField inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField
( (
const UList<Type>& mapF, const UList<T>& mapF,
const labelListList& mapAddressing, const labelListList& mapAddressing,
const scalarListList& weights const scalarListList& weights
) )
: :
Field<Type>(mapF, mapAddressing, weights), Field<T>(mapF, mapAddressing, weights),
capacity_(Field<Type>::size()) capacity_(Field<T>::size())
{} {}
//- Construct by mapping from the given field //- Construct by mapping from the given field
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
Foam::DynamicField<Type>::DynamicField inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField
( (
const UList<Type>& mapF, const UList<T>& mapF,
const FieldMapper& map const FieldMapper& map
) )
: :
DynamicField<Type>(mapF, map), Field<T>(mapF, map),
capacity_(Field<Type>::size()) capacity_(Field<T>::size())
{} {}
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
Foam::DynamicField<Type>::DynamicField(const DynamicField<Type>& f) inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField
(
const DynamicField<T, SizeInc, SizeMult, SizeDiv>& lst
)
: :
Field<Type>(f), Field<T>(lst),
capacity_(Field<Type>::size()) capacity_(lst.capacity())
{} {}
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
Foam::DynamicField<Type>::DynamicField(DynamicField<Type>& f, bool reUse) inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::DynamicField
(
const Xfer<DynamicField<T, SizeInc, SizeMult, SizeDiv> >& lst
)
: :
Field<Type>(f, reUse), Field<T>(lst),
capacity_(Field<Type>::size()) capacity_(Field<T>::size())
{}
template<class Type>
Foam::DynamicField<Type>::DynamicField(const Xfer<DynamicField<Type> >& f)
:
Field<Type>(f),
capacity_(Field<Type>::size())
{} {}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
Foam::label Foam::DynamicField<Type>::capacity() const inline Foam::label Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::capacity()
const
{ {
return capacity_; return capacity_;
} }
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
void Foam::DynamicField<Type>::append(const Type& t) inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::setCapacity
(
const label nElem
)
{ {
label elemI = Field<Type>::size(); label nextFree = Field<T>::size();
capacity_ = nElem;
if (nextFree > capacity_)
{
// truncate addressed sizes too
nextFree = capacity_;
}
// we could also enforce SizeInc granularity when (!SizeMult || !SizeDiv)
Field<T>::setSize(capacity_);
Field<T>::size(nextFree);
}
template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::reserve
(
const label nElem
)
{
// allocate more capacity?
if (nElem > capacity_)
{
// TODO: convince the compiler that division by zero does not occur
// if (SizeInc && (!SizeMult || !SizeDiv))
// {
// // resize with SizeInc as the granularity
// capacity_ = nElem;
// unsigned pad = SizeInc - (capacity_ % SizeInc);
// if (pad != SizeInc)
// {
// capacity_ += pad;
// }
// }
// else
{
capacity_ = max
(
nElem,
label(SizeInc + capacity_ * SizeMult / SizeDiv)
);
}
// adjust allocated size, leave addressed size untouched
label nextFree = Field<T>::size();
Field<T>::setSize(capacity_);
Field<T>::size(nextFree);
}
}
template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::setSize
(
const label nElem
)
{
// allocate more capacity?
if (nElem > capacity_)
{
// TODO: convince the compiler that division by zero does not occur
// if (SizeInc && (!SizeMult || !SizeDiv))
// {
// // resize with SizeInc as the granularity
// capacity_ = nElem;
// unsigned pad = SizeInc - (capacity_ % SizeInc);
// if (pad != SizeInc)
// {
// capacity_ += pad;
// }
// }
// else
{
capacity_ = max
(
nElem,
label(SizeInc + capacity_ * SizeMult / SizeDiv)
);
}
Field<T>::setSize(capacity_);
}
// adjust addressed size
Field<T>::size(nElem);
}
template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::setSize
(
const label nElem,
const T& t
)
{
label nextFree = Field<T>::size();
setSize(nElem);
// set new elements to constant value
while (nextFree < nElem)
{
this->operator[](nextFree++) = t;
}
}
template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::resize
(
const label nElem
)
{
this->setSize(nElem);
}
template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::resize
(
const label nElem,
const T& t
)
{
this->setSize(nElem, t);
}
template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::clear()
{
Field<T>::size(0);
}
template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::clearStorage()
{
Field<T>::clear();
capacity_ = 0;
}
template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>&
Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::shrink()
{
label nextFree = Field<T>::size();
if (capacity_ > nextFree)
{
// use the full list when resizing
Field<T>::size(capacity_);
// the new size
capacity_ = nextFree;
Field<T>::setSize(capacity_);
Field<T>::size(nextFree);
}
return *this;
}
template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
inline Foam::Xfer<Foam::List<T> >
Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::xfer()
{
return xferMoveTo< List<T> >(*this);
}
template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>&
Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::append
(
const T& t
)
{
const label elemI = List<T>::size();
setSize(elemI + 1); setSize(elemI + 1);
this->operator[](elemI) = t; this->operator[](elemI) = t;
return *this;
}
template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
inline Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>&
Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::append
(
const UList<T>& lst
)
{
if (this == &lst)
{
FatalErrorIn
(
"DynamicField<T, SizeInc, SizeMult, SizeDiv>::append"
"(const UList<T>&)"
) << "attempted appending to self" << abort(FatalError);
}
label nextFree = List<T>::size();
setSize(nextFree + lst.size());
forAll(lst, elemI)
{
this->operator[](nextFree++) = lst[elemI];
}
return *this;
}
template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
inline T Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::remove()
{
const label elemI = List<T>::size() - 1;
if (elemI < 0)
{
FatalErrorIn
(
"Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::remove()"
) << "List is empty" << abort(FatalError);
}
const T& val = List<T>::operator[](elemI);
List<T>::size(elemI);
return val;
} }
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
void Foam::DynamicField<Type>::operator=(const DynamicField<Type>& rhs) inline T& Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::operator()
(
const label elemI
)
{ {
if (this == &rhs) if (elemI >= Field<T>::size())
{ {
FatalErrorIn("DynamicField<Type>::operator=(const DynamicField<Type>&)") setSize(elemI + 1);
<< "attempted assignment to self"
<< abort(FatalError);
} }
Field<Type>::operator=(rhs); return this->operator[](elemI);
capacity_ = Field<Type>::size();
} }
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
void Foam::DynamicField<Type>::operator=(const UList<Type>& rhs) inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::operator=
(
const T& t
)
{ {
Field<Type>::operator=(rhs); UList<T>::operator=(t);
capacity_ = Field<Type>::size();
} }
template<class Type> template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
void Foam::DynamicField<Type>::operator=(const tmp<DynamicField>& rhs) inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::operator=
(
const DynamicField<T, SizeInc, SizeMult, SizeDiv>& lst
)
{ {
if (this == &(rhs())) if (this == &lst)
{ {
FatalErrorIn("DynamicField<Type>::operator=(const tmp<DynamicField>&)") FatalErrorIn
<< "attempted assignment to self" (
<< abort(FatalError); "DynamicField<T, SizeInc, SizeMult, SizeDiv>::operator="
"(const DynamicField<T, SizeInc, SizeMult, SizeDiv>&)"
) << "attempted assignment to self" << abort(FatalError);
} }
// This is dodgy stuff, don't try it at home. if (capacity_ >= lst.size())
DynamicField* fieldPtr = rhs.ptr(); {
List<Type>::transfer(*fieldPtr); // can copy w/o reallocating, match initial size to avoid reallocation
delete fieldPtr; Field<T>::size(lst.size());
capacity_ = Field<Type>::size(); Field<T>::operator=(lst);
}
else
{
// make everything available for the copy operation
Field<T>::size(capacity_);
Field<T>::operator=(lst);
capacity_ = Field<T>::size();
}
} }
// * * * * * * * * * * * * * * * IOstream Operator * * * * * * * * * * * * * // template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
inline void Foam::DynamicField<T, SizeInc, SizeMult, SizeDiv>::operator=
(
const UList<T>& lst
)
{
if (capacity_ >= lst.size())
{
// can copy w/o reallocating, match initial size to avoid reallocation
Field<T>::size(lst.size());
Field<T>::operator=(lst);
}
else
{
// make everything available for the copy operation
Field<T>::size(capacity_);
Field<T>::operator=(lst);
capacity_ = Field<T>::size();
}
}
// ************************************************************************* // // ************************************************************************* //