mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: DynamicField: extend to be like DynamicList.
This commit is contained in:
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|||||||
@ -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>&
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|||||||
Reference in New Issue
Block a user