diff --git a/applications/test/DynamicList/Make/files b/applications/test/DynamicList/Make/files index b496842582c7553b2de334117e812adf4e13fc6c..76d78735b0c075118bc8725e731261dbe5827464 100644 --- a/applications/test/DynamicList/Make/files +++ b/applications/test/DynamicList/Make/files @@ -1,3 +1,3 @@ -Test-DynamicList.C +Test-DynamicList.cxx EXE = $(FOAM_USER_APPBIN)/Test-DynamicList diff --git a/applications/test/DynamicList/Test-DynamicList.C b/applications/test/DynamicList/Test-DynamicList.cxx similarity index 100% rename from applications/test/DynamicList/Test-DynamicList.C rename to applications/test/DynamicList/Test-DynamicList.cxx diff --git a/applications/test/DynamicList2/Make/files b/applications/test/DynamicList2/Make/files index 78b8198c6a0a2af68afbb94d319ad5ba3501664c..ceb29c77127dd4823528a64a99398a3f40abfb03 100644 --- a/applications/test/DynamicList2/Make/files +++ b/applications/test/DynamicList2/Make/files @@ -1,3 +1,3 @@ -Test-DynamicList2.C +Test-DynamicList2.cxx EXE = $(FOAM_USER_APPBIN)/Test-DynamicList2 diff --git a/applications/test/DynamicList2/Test-DynamicList2.C b/applications/test/DynamicList2/Test-DynamicList2.cxx similarity index 87% rename from applications/test/DynamicList2/Test-DynamicList2.C rename to applications/test/DynamicList2/Test-DynamicList2.cxx index e75e0d298620cb2f32bd3aaa725162387c5be529..ef47d2678342621e137dcd125712a7e658e8ef2b 100644 --- a/applications/test/DynamicList2/Test-DynamicList2.C +++ b/applications/test/DynamicList2/Test-DynamicList2.cxx @@ -52,7 +52,8 @@ void printInfo if (showSize) { Info<< " size=\"" << list.size() - << "\" capacity=\"" << list.capacity() << "\""; + << "\" capacity=\"" << list.capacity() << "\"" + << "\" min=\"" << SizeMin << "\"" ; if (list.cdata()) { Info<< " ptr=\"" << name(list.cdata()) << "\""; @@ -79,7 +80,8 @@ void printInfo if (showSize) { Info<< " size=\"" << list.size() - << "\" capacity=\"" << list.capacity() << "\""; + << "\" capacity=\"" << list.capacity() << "\"" + << "\" min=\"" << SizeMin << "\"" ; if (list.cdata()) { Info<< " ptr=\"" << name(list.cdata()) << "\""; @@ -168,6 +170,22 @@ int main(int argc, char *argv[]) printInfo("", list2); } + { + DynamicList<float, 32> list1(std::pair<label,label>(16,0)); + list1 = -1; + + Info<< "construct with specified size/capacity" << nl; + printInfo("", list1); + } + + { + DynamicList<float, 32> list1(std::pair<label,label>(8,16)); + list1 = -1; + + Info<< "construct with specified size/capacity" << nl; + printInfo("", list1); + } + Info<< "\nEnd\n"; return 0; diff --git a/applications/test/List3/Make/files b/applications/test/List3/Make/files index 640cc113d780dace56186ebe58fb2bbfda648bf0..93c443e14e2977130bc819ccf0487d6a90e33f18 100644 --- a/applications/test/List3/Make/files +++ b/applications/test/List3/Make/files @@ -1,3 +1,3 @@ -Test-List3.C +Test-List3.cxx EXE = $(FOAM_USER_APPBIN)/Test-List3 diff --git a/applications/test/List3/Test-List3.C b/applications/test/List3/Test-List3.cxx similarity index 100% rename from applications/test/List3/Test-List3.C rename to applications/test/List3/Test-List3.cxx diff --git a/applications/test/PackedList1/Make/files b/applications/test/PackedList1/Make/files index 76843f21f9f5ea23ed72461fc9f2f3ab64634670..0b2b68d6ff585033ee43a01b5137e32413f308ea 100644 --- a/applications/test/PackedList1/Make/files +++ b/applications/test/PackedList1/Make/files @@ -1,3 +1,3 @@ -Test-PackedList1.C +Test-PackedList1.cxx EXE = $(FOAM_USER_APPBIN)/Test-PackedList1 diff --git a/applications/test/PackedList1/Test-PackedList1.C b/applications/test/PackedList1/Test-PackedList1.cxx similarity index 100% rename from applications/test/PackedList1/Test-PackedList1.C rename to applications/test/PackedList1/Test-PackedList1.cxx diff --git a/applications/test/PackedList2/Make/files b/applications/test/PackedList2/Make/files index ce31f2fa8ddc928fc143ce6e268b983b432cc510..7c20add1a55be63954cb183ab45051dccaeb6b19 100644 --- a/applications/test/PackedList2/Make/files +++ b/applications/test/PackedList2/Make/files @@ -1,3 +1,3 @@ -Test-PackedList2.C +Test-PackedList2.cxx EXE = $(FOAM_USER_APPBIN)/Test-PackedList2 diff --git a/applications/test/PackedList2/Test-PackedList2.C b/applications/test/PackedList2/Test-PackedList2.cxx similarity index 100% rename from applications/test/PackedList2/Test-PackedList2.C rename to applications/test/PackedList2/Test-PackedList2.cxx diff --git a/applications/test/UIndirectList/Make/files b/applications/test/UIndirectList/Make/files index 8f705219896249f533919b8eb2ca3ec6ab6bd855..9be6c131786e04ccbd1d126757bfb354cfbfc572 100644 --- a/applications/test/UIndirectList/Make/files +++ b/applications/test/UIndirectList/Make/files @@ -1,3 +1,3 @@ -Test-UIndirectList.C +Test-UIndirectList.cxx EXE = $(FOAM_USER_APPBIN)/Test-UIndirectList diff --git a/applications/test/UIndirectList/Test-UIndirectList.C b/applications/test/UIndirectList/Test-UIndirectList.cxx similarity index 100% rename from applications/test/UIndirectList/Test-UIndirectList.C rename to applications/test/UIndirectList/Test-UIndirectList.cxx diff --git a/applications/test/bitSet2/Make/files b/applications/test/bitSet2/Make/files index ff546fa179bec6e84ff981a1105801a184644580..e3ceca9e2300521e4a625adf65fa9a18f507e048 100644 --- a/applications/test/bitSet2/Make/files +++ b/applications/test/bitSet2/Make/files @@ -1,3 +1,3 @@ -Test-bitSet2.C +Test-bitSet2.cxx EXE = $(FOAM_USER_APPBIN)/Test-bitSet2 diff --git a/applications/test/bitSet2/Test-bitSet2.C b/applications/test/bitSet2/Test-bitSet2.cxx similarity index 99% rename from applications/test/bitSet2/Test-bitSet2.C rename to applications/test/bitSet2/Test-bitSet2.cxx index fb9bc746a1893e315b7076a74800ac4609942f30..8f9f5d487e204b30a0d4975795ef29dc433edc1e 100644 --- a/applications/test/bitSet2/Test-bitSet2.C +++ b/applications/test/bitSet2/Test-bitSet2.cxx @@ -499,7 +499,7 @@ int main(int argc, char *argv[]) Info<<"bitSet "; report(list4); - list4.shrink(); + list4.shrink_to_fit(); Info<<"shrunk "; report(list4); diff --git a/src/OpenFOAM/containers/Bits/PackedList/PackedList.H b/src/OpenFOAM/containers/Bits/PackedList/PackedList.H index 5bdbbceb6a1b57054205c9955c6c7a31714c5f1b..aa6c755962367f7beedfc9d0a1bb6763ddb08b54 100644 --- a/src/OpenFOAM/containers/Bits/PackedList/PackedList.H +++ b/src/OpenFOAM/containers/Bits/PackedList/PackedList.H @@ -406,7 +406,10 @@ public: inline void clearStorage(); //- Shrink the allocated space to what is actually used. - inline void shrink(); + inline void shrink_to_fit(); + + //- Alias for shrink_to_fit() + void shrink() { this->shrink_to_fit(); } //- Swap contents with argument inline void swap(PackedList<Width>& rhs); diff --git a/src/OpenFOAM/containers/Bits/PackedList/PackedListI.H b/src/OpenFOAM/containers/Bits/PackedList/PackedListI.H index 8bdd10ddcc7bf15cf6052de2fc74de43f1801b8e..a8e7f93dd9f523524cfa86b21571b292322f5744 100644 --- a/src/OpenFOAM/containers/Bits/PackedList/PackedListI.H +++ b/src/OpenFOAM/containers/Bits/PackedList/PackedListI.H @@ -597,7 +597,7 @@ inline void Foam::PackedList<Width>::clearStorage() template<unsigned Width> -inline void Foam::PackedList<Width>::shrink() +inline void Foam::PackedList<Width>::shrink_to_fit() { // Any unneeded space allocated? const label nblocks = num_blocks(size()); diff --git a/src/OpenFOAM/containers/Lists/DynamicList/DynamicList.H b/src/OpenFOAM/containers/Lists/DynamicList/DynamicList.H index 78385c9b5bf28009b50f5c636cf9223e7cffd00d..bf8768d9bc194546587d3b8c82fa5a7baf8c0a46 100644 --- a/src/OpenFOAM/containers/Lists/DynamicList/DynamicList.H +++ b/src/OpenFOAM/containers/Lists/DynamicList/DynamicList.H @@ -120,6 +120,9 @@ public: //- Construct an empty list with given initial capacity inline explicit DynamicList(const label initialCapacity); + //- Construct with given size and capacity + inline explicit DynamicList(const std::pair<label,label>& sizing); + //- Construct with given size and value for all elements. inline DynamicList(const label len, const T& val); @@ -133,21 +136,21 @@ public: template<int AnySizeMin> inline DynamicList(const DynamicList<T, AnySizeMin>& lst); - //- Construct from UList. Size set to UList size. + //- Copy construct from UList. Size set to UList size. // Also constructs from DynamicList with different sizing parameters. inline explicit DynamicList(const UList<T>& lst); //- Copy construct subset of list inline DynamicList(const UList<T>& list, const labelUList& indices); - //- Construct from a FixedList + //- Copy construct from a FixedList template<unsigned N> inline explicit DynamicList(const FixedList<T, N>& lst); - //- Construct from an initializer list. Size set to list size. + //- Copy construct from an initializer list. Size set to list size. inline explicit DynamicList(std::initializer_list<T> lst); - //- Construct from IndirectList. Size set to addressing size. + //- Copy construct from IndirectList. Size set to addressing size. template<class Addr> inline explicit DynamicList(const IndirectListBase<T, Addr>& lst); @@ -200,7 +203,7 @@ public: //- Change the value for the list capacity directly (ADVANCED, UNSAFE) //- Does not perform any memory management or resizing. - inline void setCapacity_unsafe(const label len) noexcept; + void setCapacity_unsafe(const label len) noexcept { capacity_ = len; } //- Reserve allocation space for at least this size, allocating new //- space if required and \em retaining old content. @@ -238,12 +241,6 @@ public: // Otherwise all entries will be uninitialized. inline void resize_nocopy(const label len); - //- Same as resize() - void setSize(const label n) { this->resize(n); } - - //- Same as resize() - void setSize(const label n, const T& val) { this->resize(n, val); } - //- Clear the addressed list, i.e. set the size to zero. // Allocated size does not change inline void clear() noexcept; @@ -259,9 +256,6 @@ public: // \note when empty() it will delete any allocated memory. inline void shrink_unsafe(); - //- Calls shrink_to_fit() and returns a reference to the DynamicList. - inline DynamicList<T, SizeMin>& shrink(); - // Edit @@ -304,7 +298,7 @@ public: template<class Addr> inline void push_back(const IndirectListBase<T, Addr>& lst); - //- Move append list + //- Move append another list to the end of this list inline void push_back(List<T>&& list); //- Move append list @@ -355,10 +349,10 @@ public: //- Return non-const access to an element, resizing list if needed inline T& operator()(const label i); - //- Assignment of all addressed entries to the given value + //- Assign addressed entries to the given value inline void operator=(const T& val); - //- Assignment of all entries to zero + //- Assign addressed entries to zero inline void operator=(Foam::zero); //- Assignment to UList @@ -418,6 +412,20 @@ public: // Housekeeping + //- Alias for resize() + void setSize(const label n) { this->resize(n); } + + //- Alias for resize() + void setSize(const label n, const T& val) { this->resize(n, val); } + + //- Calls shrink_to_fit() and returns a reference to the DynamicList. + //FOAM_DEPRECATED_FOR(2025-04, "shrink_to_fit()") + DynamicList<T, SizeMin>& shrink() + { + this->shrink_to_fit(); + return *this; + } + //- Copy append an element to the end of this list. //FOAM_DEPRECATED_FOR(2022-10, "push_back()") void append(const T& val) { this->push_back(val); } diff --git a/src/OpenFOAM/containers/Lists/DynamicList/DynamicListI.H b/src/OpenFOAM/containers/Lists/DynamicList/DynamicListI.H index a3c004cd8ae094e8fca80ed0bbb6a33b98ecf9ab..17e199242d1c18c107b70ed3952ee930fe78a0c6 100644 --- a/src/OpenFOAM/containers/Lists/DynamicList/DynamicListI.H +++ b/src/OpenFOAM/containers/Lists/DynamicList/DynamicListI.H @@ -42,7 +42,7 @@ inline void Foam::DynamicList<T, SizeMin>::doAssignDynList if (capacity_ < len) { // Needs more space for the copy operation - List<T>::setAddressableSize(capacity_); // Use entire space + List<T>::setAddressableSize(capacity_); List<T>::resize_nocopy(len); capacity_ = List<T>::size(); } @@ -68,23 +68,14 @@ inline void Foam::DynamicList<T, SizeMin>::doCapacity // Addressable length, possibly truncated by new capacity const label currLen = Foam::min(List<T>::size(), newCapacity); - // Corner case... - if (List<T>::size() == newCapacity) - { - // Adjust addressable size to trigger proper resizing. - // Using (old size+1) is safe since it does not affect the 'overlap' - // of old and new addressable regions, but incurs fewew copy - // operations than extending to use the current capacity would. - List<T>::setAddressableSize(currLen+1); - } - + List<T>::setAddressableSize(capacity_); if (nocopy) { List<T>::resize_nocopy(newCapacity); } else { - List<T>::resize(newCapacity); + List<T>::resize_copy(currLen, newCapacity); } capacity_ = List<T>::size(); @@ -153,6 +144,19 @@ inline Foam::DynamicList<T, SizeMin>::DynamicList(const label initialCapacity) } +template<class T, int SizeMin> +inline Foam::DynamicList<T, SizeMin>::DynamicList +( + const std::pair<label,label>& sizing +) +: + List<T>(std::max(sizing.first, sizing.second)), + capacity_(List<T>::size()) +{ + List<T>::setAddressableSize(sizing.first); +} + + template<class T, int SizeMin> inline Foam::DynamicList<T, SizeMin>::DynamicList ( @@ -326,16 +330,6 @@ inline void Foam::DynamicList<T, SizeMin>::setCapacity_nocopy } -template<class T, int SizeMin> -inline void Foam::DynamicList<T, SizeMin>::setCapacity_unsafe -( - const label len -) noexcept -{ - capacity_ = len; -} - - template<class T, int SizeMin> inline void Foam::DynamicList<T, SizeMin>::reserve ( @@ -448,8 +442,7 @@ inline void Foam::DynamicList<T, SizeMin>::shrink_to_fit() const label currLen = List<T>::size(); if (currLen < capacity_) { - // Adjust addressable size to trigger proper resizing - List<T>::setAddressableSize(currLen+1); + List<T>::setAddressableSize(capacity_); List<T>::resize(currLen); capacity_ = List<T>::size(); } @@ -468,15 +461,6 @@ inline void Foam::DynamicList<T, SizeMin>::shrink_unsafe() } -template<class T, int SizeMin> -inline Foam::DynamicList<T, SizeMin>& -Foam::DynamicList<T, SizeMin>::shrink() -{ - this->shrink_to_fit(); - return *this; -} - - template<class T, int SizeMin> inline void Foam::DynamicList<T, SizeMin>::swap(List<T>& list) @@ -608,7 +592,7 @@ inline void Foam::DynamicList<T, SizeMin>::push_back const UList<T>& list ) { - if (this == &list) + if (FOAM_UNLIKELY(this == &list)) { FatalErrorInFunction << "Attempted push_back to self" @@ -662,8 +646,7 @@ inline void Foam::DynamicList<T, SizeMin>::push_back const label idx = this->size(); const label n = list.size(); - - resize(list + n); + resize(idx + n); auto iter = this->begin(idx); @@ -680,7 +663,7 @@ inline void Foam::DynamicList<T, SizeMin>::push_back List<T>&& list ) { - if (this == &list) + if (FOAM_UNLIKELY(this == &list)) { FatalErrorInFunction << "Attempted push_back to self" diff --git a/src/OpenFOAM/containers/Lists/List/List.C b/src/OpenFOAM/containers/Lists/List/List.C index bdf09f58c576f4757c1a79add657fcc6e93d9599..c9707ef29bcc17563e3a84a284949ab82c664647 100644 --- a/src/OpenFOAM/containers/Lists/List/List.C +++ b/src/OpenFOAM/containers/Lists/List/List.C @@ -31,31 +31,34 @@ License #include "PtrList.H" #include "contiguous.H" -// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // template<class T> -void Foam::List<T>::doResize(const label len) +void Foam::List<T>::resize_copy(const label count, const label len) { - if (len == this->size_) - { - return; - } + // Only a limited number of internal size checks. + // Caller knows what they are doing. - if (len > 0) + if (FOAM_LIKELY(len > 0)) { // With sign-check to avoid spurious -Walloc-size-larger-than - const label overlap = Foam::min(this->size_, len); + // const label oldLen = this->size_; + const label overlap = Foam::min(count, len); + // Extra safety, not currently necessary: + // const label overlap = Foam::min(Foam::min(count, oldLen), len); + + T* old = this->v_; if (overlap > 0) { // Recover overlapping content when resizing - T* old = this->v_; + this->size_ = len; this->v_ = new T[len]; // Can dispatch with - // - std::execution::parallel_unsequenced_policy - // - std::execution::unsequenced_policy + // - std::execution::par_unseq + // - std::execution::unseq std::move(old, (old + overlap), this->v_); delete[] old; @@ -63,7 +66,8 @@ void Foam::List<T>::doResize(const label len) else { // No overlapping content - delete[] this->v_; + delete[] old; + this->size_ = len; this->v_ = new T[len]; } @@ -71,7 +75,7 @@ void Foam::List<T>::doResize(const label len) else { // Or only #ifdef FULLDEBUG - if (len < 0) + if (FOAM_UNLIKELY(len < 0)) { FatalErrorInFunction << "bad size " << len @@ -91,14 +95,17 @@ Foam::List<T>::List(const label len) : UList<T>(nullptr, len) { - if (len < 0) + if (FOAM_UNLIKELY(len < 0)) { FatalErrorInFunction << "bad size " << len << abort(FatalError); } - doAlloc(); + if (len > 0) + { + doAlloc(); + } } @@ -107,14 +114,14 @@ Foam::List<T>::List(const label len, const T& val) : UList<T>(nullptr, len) { - if (len < 0) + if (FOAM_UNLIKELY(len < 0)) { FatalErrorInFunction << "bad size " << len << abort(FatalError); } - if (len) + if (len > 0) { doAlloc(); UList<T>::operator=(val); @@ -127,14 +134,14 @@ Foam::List<T>::List(const label len, Foam::zero) : UList<T>(nullptr, len) { - if (len < 0) + if (FOAM_UNLIKELY(len < 0)) { FatalErrorInFunction << "bad size " << len << abort(FatalError); } - if (len) + if (len > 0) { doAlloc(); UList<T>::operator=(Foam::zero{}); @@ -206,10 +213,8 @@ Foam::List<T>::List(List<T>& list, bool reuse) this->v_ = list.v_; list.v_ = nullptr; list.size_ = 0; - return; } - - if (this->size_) + else if (this->size_ > 0) { doAlloc(); UList<T>::deepCopy(list); @@ -316,7 +321,13 @@ template<class T> void Foam::List<T>::resize(const label len, const T& val) { const label oldLen = this->size_; - this->doResize(len); + + if (oldLen == len) + { + return; + } + + this->resize_copy(oldLen, len); // Fill trailing part with new values if (oldLen < this->size_) diff --git a/src/OpenFOAM/containers/Lists/List/List.H b/src/OpenFOAM/containers/Lists/List/List.H index 8f2d96a99f3960498263487ac9337b882db1de8e..5c9d7d1c8f3ce11b8d91003aa7298d758db384bf 100644 --- a/src/OpenFOAM/containers/Lists/List/List.H +++ b/src/OpenFOAM/containers/Lists/List/List.H @@ -93,10 +93,6 @@ class List template<class ListType, class ListIndices> inline void copyList(const ListType& list, const ListIndices& indices); - //- Change allocation size of List, retaining old contents. - // Backend for resize - void doResize(const label len); - //- Construct given begin/end iterators and number of elements // Since the size is provided, the end iterator is actually ignored. template<class InputIterator> @@ -118,6 +114,16 @@ class List void setCapacity_nocopy(const label len) { resize_nocopy(len); } +protected: + + // Protected Member Functions + + //- Low-level resizing (backend for resize). + //- Change allocation size of list, retaining the first count contents. + // \note Only uses a limited number of internal checks. + void resize_copy(const label count, const label len); + + public: // Related types diff --git a/src/OpenFOAM/containers/Lists/List/ListI.H b/src/OpenFOAM/containers/Lists/List/ListI.H index bdb510f837466821b8cf2edee15643103e28bd91..228df08392b4184c30a4ee614e7c7888e99db7d9 100644 --- a/src/OpenFOAM/containers/Lists/List/ListI.H +++ b/src/OpenFOAM/containers/Lists/List/ListI.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation - Copyright (C) 2017-2023 OpenCFD Ltd. + Copyright (C) 2017-2025 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -102,7 +102,7 @@ inline Foam::List<T>::List : UList<T>(nullptr, len) { - if (this->size_) + if (len > 0) { doAlloc(); @@ -149,9 +149,9 @@ namespace Foam { // Template specialization for bool. Fills new entries with false template<> - inline void List<bool>::resize(const label newLen) + inline void List<bool>::resize(const label len) { - this->resize(newLen, false); + this->resize(len, false); } } @@ -159,7 +159,10 @@ namespace Foam template<class T> inline void Foam::List<T>::resize(const label len) { - this->doResize(len); + if (this->size_ != len) + { + this->resize_copy(this->size_, len); + } } @@ -269,7 +272,6 @@ inline void Foam::List<T>::push_back(const IndirectListBase<T, Addr>& list) const label idx = this->size(); const label n = list.size(); - resize(idx + n); auto iter = this->begin(idx); diff --git a/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynList.H b/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynList.H index ee33bbef2d2391be473f95be6a97172937a3b6e6..f55ee7e022c4391659438ccb348c2a2e2096aed0 100644 --- a/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynList.H +++ b/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynList.H @@ -76,9 +76,12 @@ public: //- Default construct inline constexpr PtrDynList() noexcept; - //- Construct with given capacity. + //- Construct with given initial capacity inline explicit PtrDynList(const label len); + //- Construct with given size and capacity + inline explicit PtrDynList(const std::pair<label,label>& sizing); + //- Copy construct using 'clone()' method on each element inline PtrDynList(const PtrDynList<T, SizeMin>& list); @@ -107,6 +110,10 @@ public: //- Size of the underlying storage. label capacity() const noexcept { return capacity_; } + //- Change the value for the list capacity directly (ADVANCED, UNSAFE) + //- Does not perform any memory management or resizing. + void setCapacity_unsafe(const label len) noexcept { capacity_ = len; } + //- Reserve allocation space for at least this size. inline void reserve(const label len); @@ -138,8 +145,8 @@ public: // \note when empty() it will delete any allocated memory. inline void shrink_unsafe(); - //- Calls shrink_to_fit() - void shrink() { shrink_to_fit(); } + //- Alias for shrink_to_fit() + void shrink() { this->shrink_to_fit(); } // Edit diff --git a/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynListI.H b/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynListI.H index fccedeccfbde5895f9c64c5a736771f139f188f5..79763cf3985565900368d55c6a9a50d2bbfd5b3c 100644 --- a/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynListI.H +++ b/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynListI.H @@ -49,6 +49,19 @@ inline Foam::PtrDynList<T, SizeMin>::PtrDynList(const label len) } +template<class T, int SizeMin> +inline Foam::PtrDynList<T, SizeMin>::PtrDynList +( + const std::pair<label,label>& sizing +) +: + PtrList<T>(std::max(sizing.first, sizing.second)), + capacity_(PtrList<T>::size()) +{ + PtrList<T>::setAddressableSize(sizing.first); +} + + template<class T, int SizeMin> inline Foam::PtrDynList<T, SizeMin>::PtrDynList ( @@ -220,8 +233,7 @@ inline void Foam::PtrDynList<T, SizeMin>::shrink_to_fit() const label currLen = PtrList<T>::size(); if (currLen < capacity_) { - // Adjust addressable size to trigger proper resizing - PtrList<T>::setAddressableSize(currLen+1); + PtrList<T>::setAddressableSize(capacity_); PtrList<T>::resize(currLen); capacity_ = PtrList<T>::size(); } diff --git a/src/OpenFOAM/containers/PtrLists/PtrList/PtrList.H b/src/OpenFOAM/containers/PtrLists/PtrList/PtrList.H index 72c83892780397f6805d5bfb2817d332ffd87132..89e4a9688ab6d2a26a864630847a2345df234cb7 100644 --- a/src/OpenFOAM/containers/PtrLists/PtrList/PtrList.H +++ b/src/OpenFOAM/containers/PtrLists/PtrList/PtrList.H @@ -249,7 +249,7 @@ public: } //- Same as resize() - void setSize(const label newLen) { this->resize(newLen); } + void setSize(const label n) { this->resize(n); } //- Move append an element to the end of the list //FOAM_DEPRECATED_FOR(2022-10, "push_back()") diff --git a/src/OpenFOAM/fields/Fields/DynamicField/DynamicField.H b/src/OpenFOAM/fields/Fields/DynamicField/DynamicField.H index 5f73c83e117d2889b10e25575bca5f85d7eab7aa..7451c5ffdef10aac2d3d07060572a6a178e42a4b 100644 --- a/src/OpenFOAM/fields/Fields/DynamicField/DynamicField.H +++ b/src/OpenFOAM/fields/Fields/DynamicField/DynamicField.H @@ -29,6 +29,7 @@ Class Description Dynamically sized Field. + Similar to DynamicList, but inheriting from a Field instead of a List. SourceFiles DynamicFieldI.H @@ -95,15 +96,6 @@ class DynamicField public: - // Static Member Functions - - //- Return a null DynamicField (reference to a nullObject). - static const DynamicField<T, SizeMin>& null() noexcept - { - return NullObjectRef<DynamicField<T, SizeMin>>(); - } - - // Constructors //- Default construct, an empty field without allocation. @@ -112,11 +104,14 @@ public: //- Construct empty field with given initial capacity inline explicit DynamicField(const label initialCapacity); + //- Construct with given size and capacity + inline explicit DynamicField(const std::pair<label,label>& sizing); + //- Construct given size and initial value inline DynamicField(const label len, const T& val); //- Construct given size and initial value of zero - inline DynamicField(const label len, const Foam::zero); + inline DynamicField(const label len, Foam::zero); //- Copy construct inline DynamicField(const DynamicField<T, SizeMin>& list); @@ -222,7 +217,7 @@ public: //- Change the value for the list capacity directly (ADVANCED, UNSAFE) //- Does not perform any memory management or resizing. - inline void setCapacity_unsafe(const label len) noexcept; + void setCapacity_unsafe(const label len) noexcept { capacity_ = len; } //- Reserve allocation space for at least this size, allocating new //- space if required and \em retaining old content. @@ -248,21 +243,18 @@ public: // setting values (as per List usage). inline void resize(const label len); - //- Alter addressable size and fill new space with constant value + //- Alter addressable size and fill \em new entries with constant value inline void resize(const label len, const T& val); + //- Alter addressable size and set val for \em all addressed entries + inline void resize_fill(const label len, const T& val); + //- Alter addressable list size, allocating new space if required //- \em without necessarily recovering old content. // If no reallocation is required, the contents remain untouched. // Otherwise all entries will be uninitialized. inline void resize_nocopy(const label len); - //- Alias for resize() - void setSize(const label n) { this->resize(n); } - - //- Alias for resize() - void setSize(const label n, const T& val) { this->resize(n, val); } - //- Clear the addressed list, i.e. set the size to zero. // Allocated size does not change inline void clear() noexcept; @@ -278,9 +270,6 @@ public: // \note when empty() it will delete any allocated memory. inline void shrink_unsafe(); - //- Calls shrink_to_fit() and returns a reference to the DynamicField. - inline DynamicField<T, SizeMin>& shrink(); - // Edit @@ -289,11 +278,11 @@ public: //- Swap content, independent of sizing parameter template<int AnySizeMin> - inline void swap(DynamicField<T, AnySizeMin>& other); + inline void swap(DynamicField<T, AnySizeMin>& other) noexcept; //- Swap content with DynamicList, independent of sizing parameter template<int AnySizeMin> - inline void swap(DynamicList<T, AnySizeMin>& other); + inline void swap(DynamicList<T, AnySizeMin>& other) noexcept; //- Transfer the parameter contents into this inline void transfer(List<T>& list); @@ -311,7 +300,7 @@ public: template<class... Args> inline T& emplace_back(Args&&... args); - //- Copy append an element at the end of the list + //- Copy append an element to the end of the list inline void push_back(const T& val); //- Move append an element @@ -340,7 +329,7 @@ public: inline void operator=(const T& val); //- Assign addressed entries to zero - inline void operator=(const Foam::zero); + inline void operator=(Foam::zero); //- Copy assignment inline void operator=(const UList<T>& list); @@ -392,6 +381,20 @@ public: // Housekeeping + //- Alias for resize() + void setSize(const label n) { this->resize(n); } + + //- Alias for resize() + void setSize(const label n, const T& val) { this->resize(n, val); } + + //- Calls shrink_to_fit() and returns a reference to the DynamicField. + //FOAM_DEPRECATED_FOR(2025-04, "shrink_to_fit()") + DynamicField<T, SizeMin>& shrink() + { + this->shrink_to_fit(); + return *this; + } + //- Append an element at the end of the list //FOAM_DEPRECATED_FOR(2022-10, "push_back()") void append(const T& val) { this->push_back(val); } diff --git a/src/OpenFOAM/fields/Fields/DynamicField/DynamicFieldI.H b/src/OpenFOAM/fields/Fields/DynamicField/DynamicFieldI.H index 18012d91f2bd88363e5a0df23900fa3e3aeb7217..1b5b6fd69d1fdd4e0c2b998afe7f4448f1dd1b62 100644 --- a/src/OpenFOAM/fields/Fields/DynamicField/DynamicFieldI.H +++ b/src/OpenFOAM/fields/Fields/DynamicField/DynamicFieldI.H @@ -40,7 +40,7 @@ inline void Foam::DynamicField<T, SizeMin>::doAssignDynList if (capacity_ < len) { // Needs more space for the copy operation - List<T>::setAddressableSize(capacity_); // Use entire space + List<T>::setAddressableSize(capacity_); List<T>::resize_nocopy(len); capacity_ = List<T>::size(); } @@ -66,19 +66,14 @@ inline void Foam::DynamicField<T, SizeMin>::doCapacity // Addressable length, possibly truncated by new capacity const label currLen = Foam::min(List<T>::size(), newCapacity); - // Corner case - see comments in DynamicList doCapacity - if (List<T>::size() == newCapacity) - { - List<T>::setAddressableSize(currLen+1); - } - + List<T>::setAddressableSize(capacity_); if (nocopy) { List<T>::resize_nocopy(newCapacity); } else { - List<T>::resize(newCapacity); + List<T>::resize_copy(currLen, newCapacity); } capacity_ = List<T>::size(); @@ -147,6 +142,19 @@ inline Foam::DynamicField<T, SizeMin>::DynamicField(const label initialCapacity) } +template<class T, int SizeMin> +inline Foam::DynamicField<T, SizeMin>::DynamicField +( + const std::pair<label,label>& sizing +) +: + Field<T>(std::max(sizing.first, sizing.second)), + capacity_(Field<T>::size()) +{ + List<T>::setAddressableSize(sizing.first); +} + + template<class T, int SizeMin> inline Foam::DynamicField<T, SizeMin>::DynamicField ( @@ -163,7 +171,7 @@ template<class T, int SizeMin> inline Foam::DynamicField<T, SizeMin>::DynamicField ( const label len, - const Foam::zero + Foam::zero ) : Field<T>(len, Foam::zero{}), @@ -423,16 +431,6 @@ inline void Foam::DynamicField<T, SizeMin>::setCapacity_nocopy } -template<class T, int SizeMin> -inline void Foam::DynamicField<T, SizeMin>::setCapacity_unsafe -( - const label len -) noexcept -{ - capacity_ = len; -} - - template<class T, int SizeMin> inline void Foam::DynamicField<T, SizeMin>::reserve ( @@ -491,6 +489,18 @@ inline void Foam::DynamicField<T, SizeMin>::resize_nocopy } +template<class T, int SizeMin> +inline void Foam::DynamicField<T, SizeMin>::resize_fill +( + const label len, + const T& val +) +{ + this->doResize(true, len); // nocopy = true + UList<T>::operator=(val); +} + + template<class T, int SizeMin> inline void Foam::DynamicField<T, SizeMin>::resize ( @@ -534,8 +544,7 @@ inline void Foam::DynamicField<T, SizeMin>::shrink_to_fit() if (currLen < capacity_) { - // Adjust addressable size to trigger proper resizing - List<T>::setAddressableSize(currLen+1); + List<T>::setAddressableSize(capacity_); List<T>::resize(currLen); capacity_ = List<T>::size(); } @@ -554,15 +563,6 @@ inline void Foam::DynamicField<T, SizeMin>::shrink_unsafe() } -template<class T, int SizeMin> -inline Foam::DynamicField<T, SizeMin>& -Foam::DynamicField<T, SizeMin>::shrink() -{ - this->shrink_to_fit(); - return *this; -} - - template<class T, int SizeMin> inline void Foam::DynamicField<T, SizeMin>::swap(List<T>& list) @@ -592,7 +592,7 @@ template<int AnySizeMin> inline void Foam::DynamicField<T, SizeMin>::swap ( DynamicField<T, AnySizeMin>& other -) +) noexcept { if ( @@ -616,7 +616,7 @@ template<int AnySizeMin> inline void Foam::DynamicField<T, SizeMin>::swap ( DynamicList<T, AnySizeMin>& other -) +) noexcept { if ( @@ -822,7 +822,7 @@ inline void Foam::DynamicField<T, SizeMin>::operator= template<class T, int SizeMin> inline void Foam::DynamicField<T, SizeMin>::operator= ( - const Foam::zero + Foam::zero ) { UList<T>::operator=(Foam::zero{});