diff --git a/src/OpenFOAM/containers/Lists/DynamicList/DynamicList.H b/src/OpenFOAM/containers/Lists/DynamicList/DynamicList.H index d6553dcfabe4c01522a8fa3805239c1c27cd77c2..2738b414b08c8de07b0bd1d9e09d4942f7402efe 100644 --- a/src/OpenFOAM/containers/Lists/DynamicList/DynamicList.H +++ b/src/OpenFOAM/containers/Lists/DynamicList/DynamicList.H @@ -182,9 +182,14 @@ public: //- Assignment of all addressed entries to the given value inline void operator=(const T&); - //- Assignment from List<T>. Also handles assignment from DynamicList. - inline void operator=(const UList<T>&); + //- Assignment from DynamicList + inline void operator= + ( + const DynamicList<T, SizeInc, SizeMult, SizeDiv>& + ); + //- Assignment from List<T>. + inline void operator=(const UList<T>&); // IOstream operators diff --git a/src/OpenFOAM/containers/Lists/DynamicList/DynamicListI.H b/src/OpenFOAM/containers/Lists/DynamicList/DynamicListI.H index f1e7d40dd60dbd5b1860d79be57c16452ec3a24c..c573a5df5e66bf2ceb5a3d4cbed6a66cc82a146a 100644 --- a/src/OpenFOAM/containers/Lists/DynamicList/DynamicListI.H +++ b/src/OpenFOAM/containers/Lists/DynamicList/DynamicListI.H @@ -334,13 +334,36 @@ inline void Foam::DynamicList<T, SizeInc, SizeMult, SizeDiv>::operator= ( const UList<T>& lst ) +{ + if (capacity_ >= lst.size()) + { + // can copy w/o reallocating, match initial size to avoid reallocation + List<T>::size(lst.size()); + List<T>::operator=(lst); + } + else + { + // make everything available for the copy operation + List<T>::size(capacity_); + + List<T>::operator=(lst); + capacity_ = List<T>::size(); + } +} + + +template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv> +inline void Foam::DynamicList<T, SizeInc, SizeMult, SizeDiv>::operator= +( + const DynamicList<T, SizeInc, SizeMult, SizeDiv>& lst +) { if (this == &lst) { FatalErrorIn ( "DynamicList<T, SizeInc, SizeMult, SizeDiv>::operator=" - "(const UList<T>&)" + "(const DynamicList<T, SizeInc, SizeMult, SizeDiv>&)" ) << "attempted assignment to self" << abort(FatalError); }