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/FixedList/Make/files b/applications/test/FixedList/Make/files index dcfee8af1336cc99e79854ade7681f5e876d0788..cd58141078e0cdd7c160ce02dd111d46dddeeece 100644 --- a/applications/test/FixedList/Make/files +++ b/applications/test/FixedList/Make/files @@ -1,3 +1,3 @@ -Test-FixedList.C +Test-FixedList.cxx EXE = $(FOAM_USER_APPBIN)/Test-FixedList diff --git a/applications/test/FixedList/Test-FixedList.C b/applications/test/FixedList/Test-FixedList.cxx similarity index 99% rename from applications/test/FixedList/Test-FixedList.C rename to applications/test/FixedList/Test-FixedList.cxx index e77190a7939bc27aea2e450d6eb43194c5809a06..5f8a1034417f88090e01ab3a399f78b242ac8320 100644 --- a/applications/test/FixedList/Test-FixedList.C +++ b/applications/test/FixedList/Test-FixedList.cxx @@ -41,7 +41,6 @@ See also #include "List.H" #include "IPstream.H" #include "OPstream.H" -#include <numeric> using namespace Foam; diff --git a/applications/test/List/Test-List.cxx b/applications/test/List/Test-List.cxx index 96571f642cb20f150f421d4ee93900107e259229..0962997830c331e3e484ff43bf1229f2cdafb312 100644 --- a/applications/test/List/Test-List.cxx +++ b/applications/test/List/Test-List.cxx @@ -54,7 +54,6 @@ See also #include "ListPolicy.H" #include <list> -#include <numeric> #include <functional> // see issue #2083 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/ListRead1/Make/files b/applications/test/ListRead1/Make/files index da3cc22d1962fa8303d13600119efa9870f42b42..8631d227f0e188e7af88720e7b34cac258cf322b 100644 --- a/applications/test/ListRead1/Make/files +++ b/applications/test/ListRead1/Make/files @@ -1,3 +1,3 @@ -Test-ListRead1.C +Test-ListRead1.cxx EXE = $(FOAM_USER_APPBIN)/Test-ListRead1 diff --git a/applications/test/ListRead1/Test-ListRead1.C b/applications/test/ListRead1/Test-ListRead1.C index d7417235b4e9ea2924b070379b8587dc3f18d0bf..aac211e2da60cd8dc5a7d109d9fdca6764bdcfd7 100644 --- a/applications/test/ListRead1/Test-ListRead1.C +++ b/applications/test/ListRead1/Test-ListRead1.C @@ -50,7 +50,6 @@ Description #include "ListPolicy.H" #include <list> -#include <numeric> #include <functional> using namespace Foam; 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/SubField/Make/files b/applications/test/SubField/Make/files index 406ae41531279ee083d341ce1ec3b6e2fa93c298..9e8f8ac4bbc2f7f27c937e06d0e07e0eaacaf5d1 100644 --- a/applications/test/SubField/Make/files +++ b/applications/test/SubField/Make/files @@ -1,3 +1,3 @@ -Test-SubField.C +Test-SubField.cxx EXE = $(FOAM_USER_APPBIN)/Test-SubField diff --git a/applications/test/SubField/Test-SubField.C b/applications/test/SubField/Test-SubField.cxx similarity index 99% rename from applications/test/SubField/Test-SubField.C rename to applications/test/SubField/Test-SubField.cxx index bed02ecacb5dff791c2421f72477fb14c13cc74e..17a41f14f3867df1188539e6bde4ec99ed417ea8 100644 --- a/applications/test/SubField/Test-SubField.C +++ b/applications/test/SubField/Test-SubField.cxx @@ -38,7 +38,6 @@ Description #include "SubField.H" #include "labelRange.H" #include "ListOps.H" -#include <numeric> using namespace Foam; 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/applications/test/charList/Make/files b/applications/test/charList/Make/files index e7b5eba75bff23b7fbb6041ab6ecfc7114db62a2..f3f0e233d57d18e4601ea2109d44dac624e232ef 100644 --- a/applications/test/charList/Make/files +++ b/applications/test/charList/Make/files @@ -1,3 +1,3 @@ -Test-charList.C +Test-charList.cxx EXE = $(FOAM_USER_APPBIN)/Test-charList diff --git a/applications/test/charList/Test-charList.C b/applications/test/charList/Test-charList.cxx similarity index 99% rename from applications/test/charList/Test-charList.C rename to applications/test/charList/Test-charList.cxx index 32e98110930af22b61102122663d509fae88c4a1..8a480a287b5669e2b3d92d915d840871d9c4d849 100644 --- a/applications/test/charList/Test-charList.C +++ b/applications/test/charList/Test-charList.cxx @@ -43,8 +43,6 @@ Description #include "SubList.H" #include "FlatOutput.H" -#include <numeric> - using namespace Foam; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/applications/test/checkIOspeed/Test-checkIOspeed.cxx b/applications/test/checkIOspeed/Test-checkIOspeed.cxx index a92159dde3ba84d029ba5e679318013763f104f9..5db748b01c64e7bd00792a0ccf41e7e525db1046 100644 --- a/applications/test/checkIOspeed/Test-checkIOspeed.cxx +++ b/applications/test/checkIOspeed/Test-checkIOspeed.cxx @@ -50,8 +50,6 @@ Description #include "SliceStreamRepo.H" #endif -#include <numeric> - using namespace Foam; diff --git a/applications/utilities/mesh/manipulation/stitchMesh/stitchMesh.C b/applications/utilities/mesh/manipulation/stitchMesh/stitchMesh.C index 8f0ea89dc24bc7791ab81c707594d777f10e2f0b..b009297bde07b80d27d6864e7adf8a8e4faada33 100644 --- a/applications/utilities/mesh/manipulation/stitchMesh/stitchMesh.C +++ b/applications/utilities/mesh/manipulation/stitchMesh/stitchMesh.C @@ -73,7 +73,6 @@ Description #include "perfectInterface.H" #include "IOobjectList.H" #include "ReadFields.H" -#include <numeric> // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 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/Lists/List/SubList.H b/src/OpenFOAM/containers/Lists/List/SubList.H index 2cd0e10c18eb734c9285b352c306a78710e2f34a..ba7d320c6701112e47cc24cbab0353397583e299 100644 --- a/src/OpenFOAM/containers/Lists/List/SubList.H +++ b/src/OpenFOAM/containers/Lists/List/SubList.H @@ -172,7 +172,11 @@ public: // Member Operators //- Allow cast to a const List\<T\>& - inline operator const Foam::List<T>&() const; + FOAM_DEPRECATED_STRICTER(2025-04, "dereference as SubList, not List?") + operator const Foam::List<T>&() const + { + return *reinterpret_cast<const List<T>*>(this); + } //- Copy assign entries (deep copy) from given sub-list. //- Sizes must match! diff --git a/src/OpenFOAM/containers/Lists/List/SubListI.H b/src/OpenFOAM/containers/Lists/List/SubListI.H index 1bec82958eb085c33df3481bd387add74000828b..567fa32f2513e395c4f60393151cc48043e16f01 100644 --- a/src/OpenFOAM/containers/Lists/List/SubListI.H +++ b/src/OpenFOAM/containers/Lists/List/SubListI.H @@ -214,13 +214,6 @@ inline Foam::UList<T>& Foam::SubList<T>::reset // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // -template<class T> -inline Foam::SubList<T>::operator const Foam::List<T>&() const -{ - return *reinterpret_cast<const List<T>*>(this); -} - - template<class T> inline void Foam::SubList<T>::operator=(const SubList<T>& list) { diff --git a/src/OpenFOAM/containers/Lists/List/UList.H b/src/OpenFOAM/containers/Lists/List/UList.H index 2af60648ff3ab49591265dfbbde211ecf75bd1fc..0c54fe8a597100696b179a19e7f8975945190733 100644 --- a/src/OpenFOAM/containers/Lists/List/UList.H +++ b/src/OpenFOAM/containers/Lists/List/UList.H @@ -427,7 +427,7 @@ public: //- Allow cast to a const List<T>&. // \note Marked as "strictly" deprecated. // Currently (2025-04) code still depends on this cast. - FOAM_DEPRECATED_STRICTER(2025-04, "dereference as UList, not List") + FOAM_DEPRECATED_STRICTER(2025-04, "dereference as UList, not List?") operator const Foam::List<T>&() const { return *reinterpret_cast<const List<T>*>(this); 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/expressions/value/exprValue.H b/src/OpenFOAM/expressions/value/exprValue.H index 97e057614dde8112ec700cf37e21310f953b29eb..c65fcb93f1625e65faf66e3d94a221b5b754717d 100644 --- a/src/OpenFOAM/expressions/value/exprValue.H +++ b/src/OpenFOAM/expressions/value/exprValue.H @@ -308,7 +308,7 @@ public: void operator=(const exprValue& rhs) { deepCopy(rhs); } //- Assign from zero. Changes value but not type - void operator=(const Foam::zero) { fill_zero(); } + void operator=(Foam::zero) { fill_zero(); } // Low-level access diff --git a/src/OpenFOAM/expressions/value/exprValueFieldTag.H b/src/OpenFOAM/expressions/value/exprValueFieldTag.H index 07f8666e496809b17708de0b37f5c473d1b2605d..b1c3295c4a977eaf782a4f5e7cb4d242c41a8d46 100644 --- a/src/OpenFOAM/expressions/value/exprValueFieldTag.H +++ b/src/OpenFOAM/expressions/value/exprValueFieldTag.H @@ -214,7 +214,7 @@ public: // Member Operators //- Assign from zero. Changes value but not type - void operator=(const Foam::zero) { value_ = Foam::zero{}; } + void operator=(Foam::zero) { value_ = Foam::zero{}; } //- Compare (uniformity,value) for equality bool operator==(const exprValueFieldTag&) const; diff --git a/src/OpenFOAM/fields/DimensionedFields/DimensionedField/DimensionedFieldFunctions.C b/src/OpenFOAM/fields/DimensionedFields/DimensionedField/DimensionedFieldFunctions.C index 362c5a355e6b6616afef5a7b5c050eeae184ed90..6328e7c06251cea9ba045ba9409978ed9fc19a1f 100644 --- a/src/OpenFOAM/fields/DimensionedFields/DimensionedField/DimensionedFieldFunctions.C +++ b/src/OpenFOAM/fields/DimensionedFields/DimensionedField/DimensionedFieldFunctions.C @@ -331,7 +331,7 @@ void clamp ( DimensionedField<Type, GeoMesh>& result, const DimensionedField<Type, GeoMesh>& f1, - const Foam::zero_one + Foam::zero_one ) { const MinMax<Type> range(Foam::zero_one{}); @@ -345,7 +345,7 @@ tmp<DimensionedField<Type, GeoMesh>> clamp ( const DimensionedField<Type, GeoMesh>& f1, - const Foam::zero_one + Foam::zero_one ) { auto tres = @@ -367,7 +367,7 @@ tmp<DimensionedField<Type, GeoMesh>> clamp ( const tmp<DimensionedField<Type, GeoMesh>>& tf1, - const Foam::zero_one + Foam::zero_one ) { const auto& f1 = tf1(); diff --git a/src/OpenFOAM/fields/DimensionedFields/DimensionedField/DimensionedFieldFunctions.H b/src/OpenFOAM/fields/DimensionedFields/DimensionedField/DimensionedFieldFunctions.H index 32ce17fcf04d5609f954ec0eedeaaca4e8c2438c..b6ad90506ca0278114e74ffd913e59c4b0d62429 100644 --- a/src/OpenFOAM/fields/DimensionedFields/DimensionedField/DimensionedFieldFunctions.H +++ b/src/OpenFOAM/fields/DimensionedFields/DimensionedField/DimensionedFieldFunctions.H @@ -149,7 +149,7 @@ void clamp ( DimensionedField<Type, GeoMesh>& result, const DimensionedField<Type, GeoMesh>& f1, - const Foam::zero_one + Foam::zero_one ); template<class Type, class GeoMesh> @@ -157,7 +157,7 @@ tmp<DimensionedField<Type, GeoMesh>> clamp ( const DimensionedField<Type, GeoMesh>& f1, - const Foam::zero_one + Foam::zero_one ); template<class Type, class GeoMesh> @@ -165,7 +165,7 @@ tmp<DimensionedField<Type, GeoMesh>> clamp ( const tmp<DimensionedField<Type, GeoMesh>>& tf1, - const Foam::zero_one + Foam::zero_one ); BINARY_TYPE_FUNCTION_FS(Type, Type, MinMax<Type>, clamp) diff --git a/src/OpenFOAM/fields/FieldFields/FieldField/FieldField.C b/src/OpenFOAM/fields/FieldFields/FieldField/FieldField.C index 1cd6a54c6b2d67c444d87b9b2de88605036f1ff0..7b21f1d7ea5b4e883894dd38103bbcc6b09f585f 100644 --- a/src/OpenFOAM/fields/FieldFields/FieldField/FieldField.C +++ b/src/OpenFOAM/fields/FieldFields/FieldField/FieldField.C @@ -458,7 +458,7 @@ void FieldField<Field, Type>::operator=(const Type& val) template<template<class> class Field, class Type> -void FieldField<Field, Type>::operator=(const Foam::zero) +void FieldField<Field, Type>::operator=(Foam::zero) { forAll(*this, i) { diff --git a/src/OpenFOAM/fields/FieldFields/FieldField/FieldField.H b/src/OpenFOAM/fields/FieldFields/FieldField/FieldField.H index f1c9fda937f710a6d9561aed34bd4c97183dfb96..6924b0b32bc190081a67cfeb5787eff8ca71eab8 100644 --- a/src/OpenFOAM/fields/FieldFields/FieldField/FieldField.H +++ b/src/OpenFOAM/fields/FieldFields/FieldField/FieldField.H @@ -197,7 +197,7 @@ public: void operator=(const Type& val); //- Assign uniform zero - void operator=(const Foam::zero); + void operator=(Foam::zero); void operator+=(const FieldField<Field, Type>&); void operator+=(const tmp<FieldField<Field, Type>>&); 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{}); diff --git a/src/OpenFOAM/fields/Fields/Field/Field.H b/src/OpenFOAM/fields/Fields/Field/Field.H index 3441a50e0b5949f53be62a8a2ffbf717804afd3b..c49292a0663df63ff250d603f31374e7d1aa1316 100644 --- a/src/OpenFOAM/fields/Fields/Field/Field.H +++ b/src/OpenFOAM/fields/Fields/Field/Field.H @@ -145,16 +145,16 @@ public: inline Field(const label len, const Type& val); //- Construct given size and initial values of zero - inline Field(const label len, const Foam::zero); + inline Field(const label len, Foam::zero); //- Construct with length=1, copying the value as the only content - inline Field(const Foam::one, const Type& val); + inline Field(Foam::one, const Type& val); //- Construct with length=1, moving the value as the only content - inline Field(const Foam::one, Type&& val); + inline Field(Foam::one, Type&& val); //- Construct with length=1, initializing content to zero - inline Field(const Foam::one, const Foam::zero); + inline Field(Foam::one, Foam::zero); //- Copy construct inline Field(const Field<Type>& fld); @@ -276,7 +276,7 @@ public: //- and assign its contents to this. The behaviour largely as //- described in assign(): // - For MUST_READ and key not found: FatalIOError. - // - For LAZY_READ and key not found: initialise field with Zero. + // - For LAZY_READ and key not found: initialise field with zero. // - For NO_READ and key not found: simply size the field. // . Field @@ -508,7 +508,7 @@ public: inline void operator=(const Type& val); //- Assign entries to zero - inline void operator=(const Foam::zero); + inline void operator=(Foam::zero); template<class Form, class Cmpt, direction nCmpt> void operator=(const VectorSpace<Form,Cmpt,nCmpt>&); diff --git a/src/OpenFOAM/fields/Fields/Field/FieldI.H b/src/OpenFOAM/fields/Fields/Field/FieldI.H index 4c34df88b14066e42446c1107f78a9df31cb342e..6d1bf437dd2f5ac3a6ef5340a90ab01e3c05dbb7 100644 --- a/src/OpenFOAM/fields/Fields/Field/FieldI.H +++ b/src/OpenFOAM/fields/Fields/Field/FieldI.H @@ -29,8 +29,6 @@ License template<class Type> inline constexpr Foam::Field<Type>::Field() noexcept -: - List<Type>() {} @@ -49,28 +47,28 @@ inline Foam::Field<Type>::Field(const label len, const Type& val) template<class Type> -inline Foam::Field<Type>::Field(const label len, const Foam::zero) +inline Foam::Field<Type>::Field(const label len, Foam::zero) : List<Type>(len, Foam::zero{}) {} template<class Type> -inline Foam::Field<Type>::Field(const Foam::one, const Type& val) +inline Foam::Field<Type>::Field(Foam::one, const Type& val) : List<Type>(Foam::one{}, val) {} template<class Type> -inline Foam::Field<Type>::Field(const Foam::one, Type&& val) +inline Foam::Field<Type>::Field(Foam::one, Type&& val) : List<Type>(Foam::one{}, std::move(val)) {} template<class Type> -inline Foam::Field<Type>::Field(const Foam::one, const Foam::zero) +inline Foam::Field<Type>::Field(Foam::one, Foam::zero) : List<Type>(Foam::one{}, Foam::zero{}) {} @@ -209,7 +207,7 @@ inline void Foam::Field<Type>::operator=(const Type& val) template<class Type> -inline void Foam::Field<Type>::operator=(const Foam::zero) +inline void Foam::Field<Type>::operator=(Foam::zero) { List<Type>::operator=(Foam::zero{}); } diff --git a/src/OpenFOAM/fields/Fields/Field/SubField.H b/src/OpenFOAM/fields/Fields/Field/SubField.H index 15e09522a716b967a844219611f0c80bb27d3702..be237c924ecebc7380ee6615de1084b41ef8949e 100644 --- a/src/OpenFOAM/fields/Fields/Field/SubField.H +++ b/src/OpenFOAM/fields/Fields/Field/SubField.H @@ -136,7 +136,13 @@ public: // Member Operators //- Allow cast to a const Field\<Type\>& - inline operator const Foam::Field<Type>&() const; + // \note Marked as "strictly" deprecated. + // Currently (2025-04) code still depends on this cast. + FOAM_DEPRECATED_STRICTER(2025-04, "dereference as SubField, not Field?") + operator const Foam::Field<Type>&() const + { + return *reinterpret_cast<const Field<Type>*>(this); + } //- Copy assign via UList operator. Takes linear time. inline void operator=(const SubField<Type>&); @@ -148,7 +154,7 @@ public: inline void operator=(const Type& val); //- Assign all entries to zero - inline void operator=(const Foam::zero); + inline void operator=(Foam::zero); //- Copy assign via UList operator. Takes linear time. template<class Form, direction Ncmpts> diff --git a/src/OpenFOAM/fields/Fields/Field/SubFieldI.H b/src/OpenFOAM/fields/Fields/Field/SubFieldI.H index 235f981da7eedd6b7d1a921440bd2936f2fbc0da..0aff687982e89326b344bc71e413b41358a970ab 100644 --- a/src/OpenFOAM/fields/Fields/Field/SubFieldI.H +++ b/src/OpenFOAM/fields/Fields/Field/SubFieldI.H @@ -125,13 +125,6 @@ inline Foam::tmp<Foam::Field<Type>> Foam::SubField<Type>::T() const // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // -template<class Type> -inline Foam::SubField<Type>::operator const Foam::Field<Type>&() const -{ - return *reinterpret_cast<const Field<Type>*>(this); -} - - template<class Type> inline void Foam::SubField<Type>::operator=(const SubField<Type>& rhs) { @@ -154,7 +147,7 @@ inline void Foam::SubField<Type>::operator=(const Type& val) template<class Type> -inline void Foam::SubField<Type>::operator=(const Foam::zero) +inline void Foam::SubField<Type>::operator=(Foam::zero) { SubList<Type>::operator=(Foam::zero{}); } diff --git a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricFieldFunctions.C b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricFieldFunctions.C index 506942bb9157849e5681b6aaa1bea207f9643b6c..3336a347217ec57fac66856ee0e048a7914241f9 100644 --- a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricFieldFunctions.C +++ b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricFieldFunctions.C @@ -524,7 +524,7 @@ void clamp ( GeometricField<Type, PatchField, GeoMesh>& result, const GeometricField<Type, PatchField, GeoMesh>& f1, - const Foam::zero_one + Foam::zero_one ) { const MinMax<Type> range(Foam::zero_one{}); @@ -544,7 +544,7 @@ tmp<GeometricField<Type, PatchField, GeoMesh>> clamp ( const GeometricField<Type, PatchField, GeoMesh>& f1, - const Foam::zero_one + Foam::zero_one ) { auto tres = @@ -566,7 +566,7 @@ tmp<GeometricField<Type, PatchField, GeoMesh>> clamp ( const tmp<GeometricField<Type, PatchField, GeoMesh>>& tf1, - const Foam::zero_one + Foam::zero_one ) { const auto& f1 = tf1(); diff --git a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricFieldFunctions.H b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricFieldFunctions.H index 5aab42aae0e15aab843e0b3ee1f08128d541bf01..92fe6c87aad79df87e940fc2d4ae7392895c7965 100644 --- a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricFieldFunctions.H +++ b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricFieldFunctions.H @@ -287,7 +287,7 @@ void clamp ( GeometricField<Type, PatchField, GeoMesh>& result, const GeometricField<Type, PatchField, GeoMesh>& f1, - const Foam::zero_one + Foam::zero_one ); template<class Type, template<class> class PatchField, class GeoMesh> @@ -295,7 +295,7 @@ tmp<GeometricField<Type, PatchField, GeoMesh>> clamp ( const GeometricField<Type, PatchField, GeoMesh>& f1, - const Foam::zero_one + Foam::zero_one ); template<class Type, template<class> class PatchField, class GeoMesh> @@ -303,7 +303,7 @@ tmp<GeometricField<Type, PatchField, GeoMesh>> clamp ( const tmp<GeometricField<Type, PatchField, GeoMesh>>& tf1, - const Foam::zero_one + Foam::zero_one ); BINARY_TYPE_FUNCTION_FS(Type, Type, MinMax<Type>, clamp) diff --git a/src/OpenFOAM/include/stdFoam.H b/src/OpenFOAM/include/stdFoam.H index 24cf6c14b305d7d632ad9632470005fdd4e3ad13..5878f8e7907a2b316543cef0772b3e9284f2e2dc 100644 --- a/src/OpenFOAM/include/stdFoam.H +++ b/src/OpenFOAM/include/stdFoam.H @@ -24,7 +24,7 @@ License along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. Description - Includes some standard C++ headers, defines global macros and templates + Includes some common C++ headers, defines global macros and templates used in multiple places by OpenFOAM. \*---------------------------------------------------------------------------*/ @@ -36,6 +36,7 @@ Description #include <initializer_list> #include <iterator> // for std::begin, std::end, ... #include <memory> +#include <numeric> // for std::iota, std::reduce, ... #include <type_traits> #include <utility> diff --git a/src/OpenFOAM/matrices/DiagonalMatrix/DiagonalMatrix.H b/src/OpenFOAM/matrices/DiagonalMatrix/DiagonalMatrix.H index 60e985a25e1c93a85caaa23d0fd9f60b9059e527..017a6adf67346aae9486a76fc86a242508e62e76 100644 --- a/src/OpenFOAM/matrices/DiagonalMatrix/DiagonalMatrix.H +++ b/src/OpenFOAM/matrices/DiagonalMatrix/DiagonalMatrix.H @@ -43,7 +43,6 @@ SourceFiles #define Foam_DiagonalMatrix_H #include "List.H" -#include <numeric> // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/OpenFOAM/matrices/SquareMatrix/SquareMatrix.H b/src/OpenFOAM/matrices/SquareMatrix/SquareMatrix.H index 0ef3cd52a113002bd457eb6bd4caf4300b1c4d54..96f6e53f112afd6a67450545e666291e0f01cd16 100644 --- a/src/OpenFOAM/matrices/SquareMatrix/SquareMatrix.H +++ b/src/OpenFOAM/matrices/SquareMatrix/SquareMatrix.H @@ -45,7 +45,6 @@ SourceFiles #include "Matrix.H" #include "Identity.H" -#include <numeric> // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C index 5e472755d6768ab141ddaf62d50f673f5fe15b3b..fafaabee1309b7abb812f9c24e3869873211ad21 100644 --- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C +++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C @@ -239,7 +239,7 @@ void Foam::GAMGSolver::Vcycle coarseCorrFields[leveli], const_cast<solveScalarField&> ( - ACf.operator const solveScalarField&() + static_cast<const solveScalarField&>(ACf) ), matrixLevels_[leveli], interfaceLevelsBouCoeffs_[leveli], @@ -346,11 +346,10 @@ void Foam::GAMGSolver::Vcycle scratch1, coarseCorrFields[leveli].size() ); - solveScalarField& ACfRef = - const_cast<solveScalarField&> - ( - ACf.operator const solveScalarField&() - ); + auto& ACfRef = const_cast<solveScalarField&> + ( + static_cast<const solveScalarField&>(ACf) + ); if (interpolateCorrection_) { diff --git a/src/OpenFOAM/meshes/boundBox/boundBox.H b/src/OpenFOAM/meshes/boundBox/boundBox.H index 554c93285cf9cf2fb70605df23685665f7f25bb8..109a53ff792376f59490ff32ea1f288ddea1c383 100644 --- a/src/OpenFOAM/meshes/boundBox/boundBox.H +++ b/src/OpenFOAM/meshes/boundBox/boundBox.H @@ -164,7 +164,7 @@ public: inline explicit boundBox(const point& p); //- Construct a 0/1 unit bounding box - inline explicit boundBox(const Foam::zero_one); + inline explicit boundBox(Foam::zero_one); //- Construct from bound box min/max points inline boundBox(const point& min, const point& max); @@ -295,7 +295,7 @@ public: inline void reset(); //- Reset to a 0/1 unit bounding box - inline void reset(const Foam::zero_one); + inline void reset(Foam::zero_one); //- Reset min/max to be identical to the specified point inline void reset(const point& pt); diff --git a/src/OpenFOAM/meshes/boundBox/boundBoxI.H b/src/OpenFOAM/meshes/boundBox/boundBoxI.H index 4b900ae1c536be2af8ce8ddba5eb84e021cc6578..147944fe860d149a1f8e0cbdb5e6f6ac6b08f8c3 100644 --- a/src/OpenFOAM/meshes/boundBox/boundBoxI.H +++ b/src/OpenFOAM/meshes/boundBox/boundBoxI.H @@ -112,7 +112,7 @@ inline Foam::boundBox::boundBox() {} -inline Foam::boundBox::boundBox(const Foam::zero_one) +inline Foam::boundBox::boundBox(Foam::zero_one) : min_(point::zero), max_(point::one) @@ -306,7 +306,7 @@ inline void Foam::boundBox::reset() } -inline void Foam::boundBox::reset(const Foam::zero_one) +inline void Foam::boundBox::reset(Foam::zero_one) { min_ = point::zero; max_ = point::one; diff --git a/src/OpenFOAM/meshes/ijkMesh/IjkField.H b/src/OpenFOAM/meshes/ijkMesh/IjkField.H index f7e0b2844956ee8b4fb2518ee44b6d3cf2b42205..8ce84d24823533047360dfe232a9d9c0a94bfd36 100644 --- a/src/OpenFOAM/meshes/ijkMesh/IjkField.H +++ b/src/OpenFOAM/meshes/ijkMesh/IjkField.H @@ -81,7 +81,7 @@ public: inline IjkField(const labelVector& ijk, const Type& val); //- Construct with sizing information and initial values of zero - inline IjkField(const labelVector& ijk, const Foam::zero); + inline IjkField(const labelVector& ijk, Foam::zero); //- Copy construct from components inline IjkField(const labelVector& ijk, const UList<Type>& list); @@ -118,7 +118,7 @@ public: //- Clear dimensions and field inline void clear(); - //- Change dimensions. Fill new values with Zero + //- Change dimensions. Fill new values with zero void resize(const labelVector& newSizes); //- Change dimensions diff --git a/src/OpenFOAM/meshes/ijkMesh/IjkFieldI.H b/src/OpenFOAM/meshes/ijkMesh/IjkFieldI.H index 45c9afade783bb514bd11defacf9f4ae465eac15..97c44b22b0ab10f281bb3ea4259314719c1b182c 100644 --- a/src/OpenFOAM/meshes/ijkMesh/IjkFieldI.H +++ b/src/OpenFOAM/meshes/ijkMesh/IjkFieldI.H @@ -75,7 +75,7 @@ template<class Type> inline Foam::IjkField<Type>::IjkField ( const labelVector& ijk, - const Foam::zero + Foam::zero ) : Field<Type>(cmptProduct(ijk), Foam::zero{}), @@ -101,7 +101,7 @@ inline Foam::IjkField<Type>::IjkField << nl << nl; #endif - Field<Type>::resize(ijk_.size(), Zero); + Field<Type>::resize(ijk_.size(), Foam::zero{}); } } @@ -124,7 +124,7 @@ inline Foam::IjkField<Type>::IjkField << nl << nl; #endif - Field<Type>::resize(ijk_.size(), Zero); + Field<Type>::resize(ijk_.size(), Foam::zero{}); } } diff --git a/src/OpenFOAM/meshes/polyMesh/syncTools/syncToolsTemplates.C b/src/OpenFOAM/meshes/polyMesh/syncTools/syncToolsTemplates.C index a0a55385e4575ea40cc4fca743261d1a8153e3ec..f1b20cb1a3577996d8ebf7f83cdc71a48dd9062a 100644 --- a/src/OpenFOAM/meshes/polyMesh/syncTools/syncToolsTemplates.C +++ b/src/OpenFOAM/meshes/polyMesh/syncTools/syncToolsTemplates.C @@ -1134,8 +1134,12 @@ void Foam::syncTools::syncBoundaryFaceList pp.size(), pp.start()-boundaryOffset ); - const List<T>& fakeList = recvFld; - top(procPatch, const_cast<List<T>&>(fakeList)); + + auto& fakeList = const_cast<List<T>&> + ( + static_cast<const List<T>&>(recvFld) + ); + top(procPatch, fakeList); SubList<T> patchValues ( diff --git a/src/OpenFOAM/meshes/treeBoundBox/treeBoundBox.H b/src/OpenFOAM/meshes/treeBoundBox/treeBoundBox.H index a30a872250ad83a993da6e9631683b642fdeec41..26d24f1f49758a4163d5e5dd56460c2446cdb252 100644 --- a/src/OpenFOAM/meshes/treeBoundBox/treeBoundBox.H +++ b/src/OpenFOAM/meshes/treeBoundBox/treeBoundBox.H @@ -202,7 +202,7 @@ public: // Constructors //- Construct a 0/1 unit bounding box - inline explicit treeBoundBox(const Foam::zero_one); + inline explicit treeBoundBox(Foam::zero_one); //- Construct a bounding box containing a single initial point inline explicit treeBoundBox(const point& p); diff --git a/src/OpenFOAM/meshes/treeBoundBox/treeBoundBoxI.H b/src/OpenFOAM/meshes/treeBoundBox/treeBoundBoxI.H index 08bff3acfa2f875b5f5208fe20689fc8fd3b54a8..5315c4570246f863308fa5f42f023a97fbdc63b6 100644 --- a/src/OpenFOAM/meshes/treeBoundBox/treeBoundBoxI.H +++ b/src/OpenFOAM/meshes/treeBoundBox/treeBoundBoxI.H @@ -31,9 +31,9 @@ License // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -inline Foam::treeBoundBox::treeBoundBox(const Foam::zero_one) +inline Foam::treeBoundBox::treeBoundBox(Foam::zero_one) : - boundBox(zero_one{}) + boundBox(Foam::zero_one{}) {} diff --git a/src/OpenFOAM/primitives/Scalar/scalarImpl.H b/src/OpenFOAM/primitives/Scalar/scalarImpl.H index 0d1564dde5600894b06ac07b521ba82bd5ffc1f9..cde30b8c7fddc72db482d1b9e36c9f102edd9a11 100644 --- a/src/OpenFOAM/primitives/Scalar/scalarImpl.H +++ b/src/OpenFOAM/primitives/Scalar/scalarImpl.H @@ -292,7 +292,7 @@ inline bool notEqual(const Scalar a, const Scalar b) //- Clamp scalar value to a 0-1 range -inline Scalar clamp(const Scalar val, const Foam::zero_one) +inline Scalar clamp(const Scalar val, Foam::zero_one) { return (val < 0) ? 0 : (1 < val) ? 1 : val; } diff --git a/src/OpenFOAM/primitives/ranges/MinMax/MinMaxOps.H b/src/OpenFOAM/primitives/ranges/MinMax/MinMaxOps.H index 71e3632bfc63866ac62794d69fcb601b80c23632..26464e0d16c2c920b2a96dd3d9a6822b5cfb8842 100644 --- a/src/OpenFOAM/primitives/ranges/MinMax/MinMaxOps.H +++ b/src/OpenFOAM/primitives/ranges/MinMax/MinMaxOps.H @@ -84,7 +84,7 @@ struct clampOp {} //- Construct as 0-1 min/max range - clampOp(const Foam::zero_one) + clampOp(Foam::zero_one) : clampOp(MinMax<T>(Foam::zero_one{})) {} diff --git a/src/conversion/vtk/adaptor/foamVtkToolsI.H b/src/conversion/vtk/adaptor/foamVtkToolsI.H index aa2da4eeb2105174e28ffe8eb60b7d26db483990..435845f3b7666d9bd00893ecaea61674829189dd 100644 --- a/src/conversion/vtk/adaptor/foamVtkToolsI.H +++ b/src/conversion/vtk/adaptor/foamVtkToolsI.H @@ -25,8 +25,6 @@ License \*---------------------------------------------------------------------------*/ -#include <numeric> - // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // inline Foam::UList<uint8_t> Foam::vtk::Tools::asUList diff --git a/src/fileFormats/ensight/part/faces/ensightFaces.C b/src/fileFormats/ensight/part/faces/ensightFaces.C index 4b41a67fd20e7061e6219766928903aa0917fc28..393182e285121e7a4073c3d14b93dc2cff146392 100644 --- a/src/fileFormats/ensight/part/faces/ensightFaces.C +++ b/src/fileFormats/ensight/part/faces/ensightFaces.C @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2016-2022 OpenCFD Ltd. + Copyright (C) 2016-2025 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -193,22 +193,22 @@ void Foam::ensightFaces::sort() if (!sub.empty()) { SubList<label> ids(sub, addressing()); - labelList order(Foam::sortedOrder(ids)); + const labelList order(Foam::sortedOrder(ids)); - ids = reorder<labelList>(order, ids); + ids = UIndirectList<label>(ids, order).list(); // Sort flip map as well if (!flipMap_.empty()) { SubList<bool> flips(flipMap_, sub); - flips = reorder<boolList>(order, flips); + flips = UIndirectList<bool>(flips, order).list(); } // Sort face ordering as well if (!faceOrder_.empty()) { SubList<label> faceOrder(faceOrder_, sub); - faceOrder = reorder<labelList>(order, faceOrder); + faceOrder = UIndirectList<label>(faceOrder, order).list(); } } }