mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
Merge branch 'improved-list-sizing' into 'develop'
ENH: refine handling of DynamicList/DynamicField resizing See merge request Development/openfoam!737
This commit is contained in:
@ -1,3 +1,3 @@
|
|||||||
Test-DynamicList.C
|
Test-DynamicList.cxx
|
||||||
|
|
||||||
EXE = $(FOAM_USER_APPBIN)/Test-DynamicList
|
EXE = $(FOAM_USER_APPBIN)/Test-DynamicList
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
Test-DynamicList2.C
|
Test-DynamicList2.cxx
|
||||||
|
|
||||||
EXE = $(FOAM_USER_APPBIN)/Test-DynamicList2
|
EXE = $(FOAM_USER_APPBIN)/Test-DynamicList2
|
||||||
|
|||||||
@ -52,7 +52,8 @@ void printInfo
|
|||||||
if (showSize)
|
if (showSize)
|
||||||
{
|
{
|
||||||
Info<< " size=\"" << list.size()
|
Info<< " size=\"" << list.size()
|
||||||
<< "\" capacity=\"" << list.capacity() << "\"";
|
<< "\" capacity=\"" << list.capacity() << "\""
|
||||||
|
<< "\" min=\"" << SizeMin << "\"" ;
|
||||||
if (list.cdata())
|
if (list.cdata())
|
||||||
{
|
{
|
||||||
Info<< " ptr=\"" << name(list.cdata()) << "\"";
|
Info<< " ptr=\"" << name(list.cdata()) << "\"";
|
||||||
@ -79,7 +80,8 @@ void printInfo
|
|||||||
if (showSize)
|
if (showSize)
|
||||||
{
|
{
|
||||||
Info<< " size=\"" << list.size()
|
Info<< " size=\"" << list.size()
|
||||||
<< "\" capacity=\"" << list.capacity() << "\"";
|
<< "\" capacity=\"" << list.capacity() << "\""
|
||||||
|
<< "\" min=\"" << SizeMin << "\"" ;
|
||||||
if (list.cdata())
|
if (list.cdata())
|
||||||
{
|
{
|
||||||
Info<< " ptr=\"" << name(list.cdata()) << "\"";
|
Info<< " ptr=\"" << name(list.cdata()) << "\"";
|
||||||
@ -168,6 +170,22 @@ int main(int argc, char *argv[])
|
|||||||
printInfo("", list2);
|
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";
|
Info<< "\nEnd\n";
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1,3 +1,3 @@
|
|||||||
Test-FixedList.C
|
Test-FixedList.cxx
|
||||||
|
|
||||||
EXE = $(FOAM_USER_APPBIN)/Test-FixedList
|
EXE = $(FOAM_USER_APPBIN)/Test-FixedList
|
||||||
|
|||||||
@ -41,7 +41,6 @@ See also
|
|||||||
#include "List.H"
|
#include "List.H"
|
||||||
#include "IPstream.H"
|
#include "IPstream.H"
|
||||||
#include "OPstream.H"
|
#include "OPstream.H"
|
||||||
#include <numeric>
|
|
||||||
|
|
||||||
using namespace Foam;
|
using namespace Foam;
|
||||||
|
|
||||||
@ -54,7 +54,6 @@ See also
|
|||||||
#include "ListPolicy.H"
|
#include "ListPolicy.H"
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <numeric>
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
||||||
// see issue #2083
|
// see issue #2083
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
Test-List3.C
|
Test-List3.cxx
|
||||||
|
|
||||||
EXE = $(FOAM_USER_APPBIN)/Test-List3
|
EXE = $(FOAM_USER_APPBIN)/Test-List3
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
Test-ListRead1.C
|
Test-ListRead1.cxx
|
||||||
|
|
||||||
EXE = $(FOAM_USER_APPBIN)/Test-ListRead1
|
EXE = $(FOAM_USER_APPBIN)/Test-ListRead1
|
||||||
|
|||||||
@ -50,7 +50,6 @@ Description
|
|||||||
#include "ListPolicy.H"
|
#include "ListPolicy.H"
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <numeric>
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
||||||
using namespace Foam;
|
using namespace Foam;
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
Test-PackedList1.C
|
Test-PackedList1.cxx
|
||||||
|
|
||||||
EXE = $(FOAM_USER_APPBIN)/Test-PackedList1
|
EXE = $(FOAM_USER_APPBIN)/Test-PackedList1
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
Test-PackedList2.C
|
Test-PackedList2.cxx
|
||||||
|
|
||||||
EXE = $(FOAM_USER_APPBIN)/Test-PackedList2
|
EXE = $(FOAM_USER_APPBIN)/Test-PackedList2
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
Test-SubField.C
|
Test-SubField.cxx
|
||||||
|
|
||||||
EXE = $(FOAM_USER_APPBIN)/Test-SubField
|
EXE = $(FOAM_USER_APPBIN)/Test-SubField
|
||||||
|
|||||||
@ -38,7 +38,6 @@ Description
|
|||||||
#include "SubField.H"
|
#include "SubField.H"
|
||||||
#include "labelRange.H"
|
#include "labelRange.H"
|
||||||
#include "ListOps.H"
|
#include "ListOps.H"
|
||||||
#include <numeric>
|
|
||||||
|
|
||||||
using namespace Foam;
|
using namespace Foam;
|
||||||
|
|
||||||
@ -1,3 +1,3 @@
|
|||||||
Test-UIndirectList.C
|
Test-UIndirectList.cxx
|
||||||
|
|
||||||
EXE = $(FOAM_USER_APPBIN)/Test-UIndirectList
|
EXE = $(FOAM_USER_APPBIN)/Test-UIndirectList
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
Test-bitSet2.C
|
Test-bitSet2.cxx
|
||||||
|
|
||||||
EXE = $(FOAM_USER_APPBIN)/Test-bitSet2
|
EXE = $(FOAM_USER_APPBIN)/Test-bitSet2
|
||||||
|
|||||||
@ -499,7 +499,7 @@ int main(int argc, char *argv[])
|
|||||||
Info<<"bitSet ";
|
Info<<"bitSet ";
|
||||||
report(list4);
|
report(list4);
|
||||||
|
|
||||||
list4.shrink();
|
list4.shrink_to_fit();
|
||||||
Info<<"shrunk ";
|
Info<<"shrunk ";
|
||||||
report(list4);
|
report(list4);
|
||||||
|
|
||||||
@ -1,3 +1,3 @@
|
|||||||
Test-charList.C
|
Test-charList.cxx
|
||||||
|
|
||||||
EXE = $(FOAM_USER_APPBIN)/Test-charList
|
EXE = $(FOAM_USER_APPBIN)/Test-charList
|
||||||
|
|||||||
@ -43,8 +43,6 @@ Description
|
|||||||
#include "SubList.H"
|
#include "SubList.H"
|
||||||
#include "FlatOutput.H"
|
#include "FlatOutput.H"
|
||||||
|
|
||||||
#include <numeric>
|
|
||||||
|
|
||||||
using namespace Foam;
|
using namespace Foam;
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
@ -50,8 +50,6 @@ Description
|
|||||||
#include "SliceStreamRepo.H"
|
#include "SliceStreamRepo.H"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <numeric>
|
|
||||||
|
|
||||||
using namespace Foam;
|
using namespace Foam;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -73,7 +73,6 @@ Description
|
|||||||
#include "perfectInterface.H"
|
#include "perfectInterface.H"
|
||||||
#include "IOobjectList.H"
|
#include "IOobjectList.H"
|
||||||
#include "ReadFields.H"
|
#include "ReadFields.H"
|
||||||
#include <numeric>
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
|||||||
@ -406,7 +406,10 @@ public:
|
|||||||
inline void clearStorage();
|
inline void clearStorage();
|
||||||
|
|
||||||
//- Shrink the allocated space to what is actually used.
|
//- 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
|
//- Swap contents with argument
|
||||||
inline void swap(PackedList<Width>& rhs);
|
inline void swap(PackedList<Width>& rhs);
|
||||||
|
|||||||
@ -597,7 +597,7 @@ inline void Foam::PackedList<Width>::clearStorage()
|
|||||||
|
|
||||||
|
|
||||||
template<unsigned Width>
|
template<unsigned Width>
|
||||||
inline void Foam::PackedList<Width>::shrink()
|
inline void Foam::PackedList<Width>::shrink_to_fit()
|
||||||
{
|
{
|
||||||
// Any unneeded space allocated?
|
// Any unneeded space allocated?
|
||||||
const label nblocks = num_blocks(size());
|
const label nblocks = num_blocks(size());
|
||||||
|
|||||||
@ -120,6 +120,9 @@ public:
|
|||||||
//- Construct an empty list with given initial capacity
|
//- Construct an empty list with given initial capacity
|
||||||
inline explicit DynamicList(const label initialCapacity);
|
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.
|
//- Construct with given size and value for all elements.
|
||||||
inline DynamicList(const label len, const T& val);
|
inline DynamicList(const label len, const T& val);
|
||||||
|
|
||||||
@ -133,21 +136,21 @@ public:
|
|||||||
template<int AnySizeMin>
|
template<int AnySizeMin>
|
||||||
inline DynamicList(const DynamicList<T, AnySizeMin>& lst);
|
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.
|
// Also constructs from DynamicList with different sizing parameters.
|
||||||
inline explicit DynamicList(const UList<T>& lst);
|
inline explicit DynamicList(const UList<T>& lst);
|
||||||
|
|
||||||
//- Copy construct subset of list
|
//- Copy construct subset of list
|
||||||
inline DynamicList(const UList<T>& list, const labelUList& indices);
|
inline DynamicList(const UList<T>& list, const labelUList& indices);
|
||||||
|
|
||||||
//- Construct from a FixedList
|
//- Copy construct from a FixedList
|
||||||
template<unsigned N>
|
template<unsigned N>
|
||||||
inline explicit DynamicList(const FixedList<T, N>& lst);
|
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);
|
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>
|
template<class Addr>
|
||||||
inline explicit DynamicList(const IndirectListBase<T, Addr>& lst);
|
inline explicit DynamicList(const IndirectListBase<T, Addr>& lst);
|
||||||
|
|
||||||
@ -200,7 +203,7 @@ public:
|
|||||||
|
|
||||||
//- Change the value for the list capacity directly (ADVANCED, UNSAFE)
|
//- Change the value for the list capacity directly (ADVANCED, UNSAFE)
|
||||||
//- Does not perform any memory management or resizing.
|
//- 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
|
//- Reserve allocation space for at least this size, allocating new
|
||||||
//- space if required and \em retaining old content.
|
//- space if required and \em retaining old content.
|
||||||
@ -238,12 +241,6 @@ public:
|
|||||||
// Otherwise all entries will be uninitialized.
|
// Otherwise all entries will be uninitialized.
|
||||||
inline void resize_nocopy(const label len);
|
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.
|
//- Clear the addressed list, i.e. set the size to zero.
|
||||||
// Allocated size does not change
|
// Allocated size does not change
|
||||||
inline void clear() noexcept;
|
inline void clear() noexcept;
|
||||||
@ -259,9 +256,6 @@ public:
|
|||||||
// \note when empty() it will delete any allocated memory.
|
// \note when empty() it will delete any allocated memory.
|
||||||
inline void shrink_unsafe();
|
inline void shrink_unsafe();
|
||||||
|
|
||||||
//- Calls shrink_to_fit() and returns a reference to the DynamicList.
|
|
||||||
inline DynamicList<T, SizeMin>& shrink();
|
|
||||||
|
|
||||||
|
|
||||||
// Edit
|
// Edit
|
||||||
|
|
||||||
@ -304,7 +298,7 @@ public:
|
|||||||
template<class Addr>
|
template<class Addr>
|
||||||
inline void push_back(const IndirectListBase<T, Addr>& lst);
|
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);
|
inline void push_back(List<T>&& list);
|
||||||
|
|
||||||
//- Move append list
|
//- Move append list
|
||||||
@ -355,10 +349,10 @@ public:
|
|||||||
//- Return non-const access to an element, resizing list if needed
|
//- Return non-const access to an element, resizing list if needed
|
||||||
inline T& operator()(const label i);
|
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);
|
inline void operator=(const T& val);
|
||||||
|
|
||||||
//- Assignment of all entries to zero
|
//- Assign addressed entries to zero
|
||||||
inline void operator=(Foam::zero);
|
inline void operator=(Foam::zero);
|
||||||
|
|
||||||
//- Assignment to UList
|
//- Assignment to UList
|
||||||
@ -418,6 +412,20 @@ public:
|
|||||||
|
|
||||||
// Housekeeping
|
// 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.
|
//- Copy append an element to the end of this list.
|
||||||
//FOAM_DEPRECATED_FOR(2022-10, "push_back()")
|
//FOAM_DEPRECATED_FOR(2022-10, "push_back()")
|
||||||
void append(const T& val) { this->push_back(val); }
|
void append(const T& val) { this->push_back(val); }
|
||||||
|
|||||||
@ -42,7 +42,7 @@ inline void Foam::DynamicList<T, SizeMin>::doAssignDynList
|
|||||||
if (capacity_ < len)
|
if (capacity_ < len)
|
||||||
{
|
{
|
||||||
// Needs more space for the copy operation
|
// Needs more space for the copy operation
|
||||||
List<T>::setAddressableSize(capacity_); // Use entire space
|
List<T>::setAddressableSize(capacity_);
|
||||||
List<T>::resize_nocopy(len);
|
List<T>::resize_nocopy(len);
|
||||||
capacity_ = List<T>::size();
|
capacity_ = List<T>::size();
|
||||||
}
|
}
|
||||||
@ -68,23 +68,14 @@ inline void Foam::DynamicList<T, SizeMin>::doCapacity
|
|||||||
// Addressable length, possibly truncated by new capacity
|
// Addressable length, possibly truncated by new capacity
|
||||||
const label currLen = Foam::min(List<T>::size(), newCapacity);
|
const label currLen = Foam::min(List<T>::size(), newCapacity);
|
||||||
|
|
||||||
// Corner case...
|
List<T>::setAddressableSize(capacity_);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nocopy)
|
if (nocopy)
|
||||||
{
|
{
|
||||||
List<T>::resize_nocopy(newCapacity);
|
List<T>::resize_nocopy(newCapacity);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
List<T>::resize(newCapacity);
|
List<T>::resize_copy(currLen, newCapacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
capacity_ = List<T>::size();
|
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>
|
template<class T, int SizeMin>
|
||||||
inline Foam::DynamicList<T, SizeMin>::DynamicList
|
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>
|
template<class T, int SizeMin>
|
||||||
inline void Foam::DynamicList<T, SizeMin>::reserve
|
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();
|
const label currLen = List<T>::size();
|
||||||
if (currLen < capacity_)
|
if (currLen < capacity_)
|
||||||
{
|
{
|
||||||
// Adjust addressable size to trigger proper resizing
|
List<T>::setAddressableSize(capacity_);
|
||||||
List<T>::setAddressableSize(currLen+1);
|
|
||||||
List<T>::resize(currLen);
|
List<T>::resize(currLen);
|
||||||
capacity_ = List<T>::size();
|
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>
|
template<class T, int SizeMin>
|
||||||
inline void
|
inline void
|
||||||
Foam::DynamicList<T, SizeMin>::swap(List<T>& list)
|
Foam::DynamicList<T, SizeMin>::swap(List<T>& list)
|
||||||
@ -608,7 +592,7 @@ inline void Foam::DynamicList<T, SizeMin>::push_back
|
|||||||
const UList<T>& list
|
const UList<T>& list
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (this == &list)
|
if (FOAM_UNLIKELY(this == &list))
|
||||||
{
|
{
|
||||||
FatalErrorInFunction
|
FatalErrorInFunction
|
||||||
<< "Attempted push_back to self"
|
<< "Attempted push_back to self"
|
||||||
@ -662,8 +646,7 @@ inline void Foam::DynamicList<T, SizeMin>::push_back
|
|||||||
|
|
||||||
const label idx = this->size();
|
const label idx = this->size();
|
||||||
const label n = list.size();
|
const label n = list.size();
|
||||||
|
resize(idx + n);
|
||||||
resize(list + n);
|
|
||||||
|
|
||||||
auto iter = this->begin(idx);
|
auto iter = this->begin(idx);
|
||||||
|
|
||||||
@ -680,7 +663,7 @@ inline void Foam::DynamicList<T, SizeMin>::push_back
|
|||||||
List<T>&& list
|
List<T>&& list
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (this == &list)
|
if (FOAM_UNLIKELY(this == &list))
|
||||||
{
|
{
|
||||||
FatalErrorInFunction
|
FatalErrorInFunction
|
||||||
<< "Attempted push_back to self"
|
<< "Attempted push_back to self"
|
||||||
|
|||||||
@ -31,31 +31,34 @@ License
|
|||||||
#include "PtrList.H"
|
#include "PtrList.H"
|
||||||
#include "contiguous.H"
|
#include "contiguous.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
template<class T>
|
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_)
|
// Only a limited number of internal size checks.
|
||||||
{
|
// Caller knows what they are doing.
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (len > 0)
|
if (FOAM_LIKELY(len > 0))
|
||||||
{
|
{
|
||||||
// With sign-check to avoid spurious -Walloc-size-larger-than
|
// 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)
|
if (overlap > 0)
|
||||||
{
|
{
|
||||||
// Recover overlapping content when resizing
|
// Recover overlapping content when resizing
|
||||||
T* old = this->v_;
|
|
||||||
this->size_ = len;
|
this->size_ = len;
|
||||||
this->v_ = new T[len];
|
this->v_ = new T[len];
|
||||||
|
|
||||||
// Can dispatch with
|
// Can dispatch with
|
||||||
// - std::execution::parallel_unsequenced_policy
|
// - std::execution::par_unseq
|
||||||
// - std::execution::unsequenced_policy
|
// - std::execution::unseq
|
||||||
std::move(old, (old + overlap), this->v_);
|
std::move(old, (old + overlap), this->v_);
|
||||||
|
|
||||||
delete[] old;
|
delete[] old;
|
||||||
@ -63,7 +66,8 @@ void Foam::List<T>::doResize(const label len)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// No overlapping content
|
// No overlapping content
|
||||||
delete[] this->v_;
|
delete[] old;
|
||||||
|
|
||||||
this->size_ = len;
|
this->size_ = len;
|
||||||
this->v_ = new T[len];
|
this->v_ = new T[len];
|
||||||
}
|
}
|
||||||
@ -71,7 +75,7 @@ void Foam::List<T>::doResize(const label len)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Or only #ifdef FULLDEBUG
|
// Or only #ifdef FULLDEBUG
|
||||||
if (len < 0)
|
if (FOAM_UNLIKELY(len < 0))
|
||||||
{
|
{
|
||||||
FatalErrorInFunction
|
FatalErrorInFunction
|
||||||
<< "bad size " << len
|
<< "bad size " << len
|
||||||
@ -91,14 +95,17 @@ Foam::List<T>::List(const label len)
|
|||||||
:
|
:
|
||||||
UList<T>(nullptr, len)
|
UList<T>(nullptr, len)
|
||||||
{
|
{
|
||||||
if (len < 0)
|
if (FOAM_UNLIKELY(len < 0))
|
||||||
{
|
{
|
||||||
FatalErrorInFunction
|
FatalErrorInFunction
|
||||||
<< "bad size " << len
|
<< "bad size " << len
|
||||||
<< abort(FatalError);
|
<< 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)
|
UList<T>(nullptr, len)
|
||||||
{
|
{
|
||||||
if (len < 0)
|
if (FOAM_UNLIKELY(len < 0))
|
||||||
{
|
{
|
||||||
FatalErrorInFunction
|
FatalErrorInFunction
|
||||||
<< "bad size " << len
|
<< "bad size " << len
|
||||||
<< abort(FatalError);
|
<< abort(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len)
|
if (len > 0)
|
||||||
{
|
{
|
||||||
doAlloc();
|
doAlloc();
|
||||||
UList<T>::operator=(val);
|
UList<T>::operator=(val);
|
||||||
@ -127,14 +134,14 @@ Foam::List<T>::List(const label len, Foam::zero)
|
|||||||
:
|
:
|
||||||
UList<T>(nullptr, len)
|
UList<T>(nullptr, len)
|
||||||
{
|
{
|
||||||
if (len < 0)
|
if (FOAM_UNLIKELY(len < 0))
|
||||||
{
|
{
|
||||||
FatalErrorInFunction
|
FatalErrorInFunction
|
||||||
<< "bad size " << len
|
<< "bad size " << len
|
||||||
<< abort(FatalError);
|
<< abort(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len)
|
if (len > 0)
|
||||||
{
|
{
|
||||||
doAlloc();
|
doAlloc();
|
||||||
UList<T>::operator=(Foam::zero{});
|
UList<T>::operator=(Foam::zero{});
|
||||||
@ -206,10 +213,8 @@ Foam::List<T>::List(List<T>& list, bool reuse)
|
|||||||
this->v_ = list.v_;
|
this->v_ = list.v_;
|
||||||
list.v_ = nullptr;
|
list.v_ = nullptr;
|
||||||
list.size_ = 0;
|
list.size_ = 0;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
else if (this->size_ > 0)
|
||||||
if (this->size_)
|
|
||||||
{
|
{
|
||||||
doAlloc();
|
doAlloc();
|
||||||
UList<T>::deepCopy(list);
|
UList<T>::deepCopy(list);
|
||||||
@ -316,7 +321,13 @@ template<class T>
|
|||||||
void Foam::List<T>::resize(const label len, const T& val)
|
void Foam::List<T>::resize(const label len, const T& val)
|
||||||
{
|
{
|
||||||
const label oldLen = this->size_;
|
const label oldLen = this->size_;
|
||||||
this->doResize(len);
|
|
||||||
|
if (oldLen == len)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->resize_copy(oldLen, len);
|
||||||
|
|
||||||
// Fill trailing part with new values
|
// Fill trailing part with new values
|
||||||
if (oldLen < this->size_)
|
if (oldLen < this->size_)
|
||||||
|
|||||||
@ -93,10 +93,6 @@ class List
|
|||||||
template<class ListType, class ListIndices>
|
template<class ListType, class ListIndices>
|
||||||
inline void copyList(const ListType& list, const ListIndices& indices);
|
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
|
//- Construct given begin/end iterators and number of elements
|
||||||
// Since the size is provided, the end iterator is actually ignored.
|
// Since the size is provided, the end iterator is actually ignored.
|
||||||
template<class InputIterator>
|
template<class InputIterator>
|
||||||
@ -118,6 +114,16 @@ class List
|
|||||||
void setCapacity_nocopy(const label len) { resize_nocopy(len); }
|
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:
|
public:
|
||||||
|
|
||||||
// Related types
|
// Related types
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
Copyright (C) 2017-2023 OpenCFD Ltd.
|
Copyright (C) 2017-2025 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -102,7 +102,7 @@ inline Foam::List<T>::List
|
|||||||
:
|
:
|
||||||
UList<T>(nullptr, len)
|
UList<T>(nullptr, len)
|
||||||
{
|
{
|
||||||
if (this->size_)
|
if (len > 0)
|
||||||
{
|
{
|
||||||
doAlloc();
|
doAlloc();
|
||||||
|
|
||||||
@ -149,9 +149,9 @@ namespace Foam
|
|||||||
{
|
{
|
||||||
// Template specialization for bool. Fills new entries with false
|
// Template specialization for bool. Fills new entries with false
|
||||||
template<>
|
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>
|
template<class T>
|
||||||
inline void Foam::List<T>::resize(const label len)
|
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 idx = this->size();
|
||||||
const label n = list.size();
|
const label n = list.size();
|
||||||
|
|
||||||
resize(idx + n);
|
resize(idx + n);
|
||||||
|
|
||||||
auto iter = this->begin(idx);
|
auto iter = this->begin(idx);
|
||||||
|
|||||||
@ -172,7 +172,11 @@ public:
|
|||||||
// Member Operators
|
// Member Operators
|
||||||
|
|
||||||
//- Allow cast to a const List\<T\>&
|
//- 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.
|
//- Copy assign entries (deep copy) from given sub-list.
|
||||||
//- Sizes must match!
|
//- Sizes must match!
|
||||||
|
|||||||
@ -214,13 +214,6 @@ inline Foam::UList<T>& Foam::SubList<T>::reset
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * 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>
|
template<class T>
|
||||||
inline void Foam::SubList<T>::operator=(const SubList<T>& list)
|
inline void Foam::SubList<T>::operator=(const SubList<T>& list)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -427,7 +427,7 @@ public:
|
|||||||
//- Allow cast to a const List<T>&.
|
//- Allow cast to a const List<T>&.
|
||||||
// \note Marked as "strictly" deprecated.
|
// \note Marked as "strictly" deprecated.
|
||||||
// Currently (2025-04) code still depends on this cast.
|
// 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
|
operator const Foam::List<T>&() const
|
||||||
{
|
{
|
||||||
return *reinterpret_cast<const List<T>*>(this);
|
return *reinterpret_cast<const List<T>*>(this);
|
||||||
|
|||||||
@ -76,9 +76,12 @@ public:
|
|||||||
//- Default construct
|
//- Default construct
|
||||||
inline constexpr PtrDynList() noexcept;
|
inline constexpr PtrDynList() noexcept;
|
||||||
|
|
||||||
//- Construct with given capacity.
|
//- Construct with given initial capacity
|
||||||
inline explicit PtrDynList(const label len);
|
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
|
//- Copy construct using 'clone()' method on each element
|
||||||
inline PtrDynList(const PtrDynList<T, SizeMin>& list);
|
inline PtrDynList(const PtrDynList<T, SizeMin>& list);
|
||||||
|
|
||||||
@ -107,6 +110,10 @@ public:
|
|||||||
//- Size of the underlying storage.
|
//- Size of the underlying storage.
|
||||||
label capacity() const noexcept { return capacity_; }
|
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.
|
//- Reserve allocation space for at least this size.
|
||||||
inline void reserve(const label len);
|
inline void reserve(const label len);
|
||||||
|
|
||||||
@ -138,8 +145,8 @@ public:
|
|||||||
// \note when empty() it will delete any allocated memory.
|
// \note when empty() it will delete any allocated memory.
|
||||||
inline void shrink_unsafe();
|
inline void shrink_unsafe();
|
||||||
|
|
||||||
//- Calls shrink_to_fit()
|
//- Alias for shrink_to_fit()
|
||||||
void shrink() { shrink_to_fit(); }
|
void shrink() { this->shrink_to_fit(); }
|
||||||
|
|
||||||
|
|
||||||
// Edit
|
// Edit
|
||||||
|
|||||||
@ -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>
|
template<class T, int SizeMin>
|
||||||
inline Foam::PtrDynList<T, SizeMin>::PtrDynList
|
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();
|
const label currLen = PtrList<T>::size();
|
||||||
if (currLen < capacity_)
|
if (currLen < capacity_)
|
||||||
{
|
{
|
||||||
// Adjust addressable size to trigger proper resizing
|
PtrList<T>::setAddressableSize(capacity_);
|
||||||
PtrList<T>::setAddressableSize(currLen+1);
|
|
||||||
PtrList<T>::resize(currLen);
|
PtrList<T>::resize(currLen);
|
||||||
capacity_ = PtrList<T>::size();
|
capacity_ = PtrList<T>::size();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -249,7 +249,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
//- Same as resize()
|
//- 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
|
//- Move append an element to the end of the list
|
||||||
//FOAM_DEPRECATED_FOR(2022-10, "push_back()")
|
//FOAM_DEPRECATED_FOR(2022-10, "push_back()")
|
||||||
|
|||||||
@ -308,7 +308,7 @@ public:
|
|||||||
void operator=(const exprValue& rhs) { deepCopy(rhs); }
|
void operator=(const exprValue& rhs) { deepCopy(rhs); }
|
||||||
|
|
||||||
//- Assign from zero. Changes value but not type
|
//- Assign from zero. Changes value but not type
|
||||||
void operator=(const Foam::zero) { fill_zero(); }
|
void operator=(Foam::zero) { fill_zero(); }
|
||||||
|
|
||||||
|
|
||||||
// Low-level access
|
// Low-level access
|
||||||
|
|||||||
@ -214,7 +214,7 @@ public:
|
|||||||
// Member Operators
|
// Member Operators
|
||||||
|
|
||||||
//- Assign from zero. Changes value but not type
|
//- 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
|
//- Compare (uniformity,value) for equality
|
||||||
bool operator==(const exprValueFieldTag&) const;
|
bool operator==(const exprValueFieldTag&) const;
|
||||||
|
|||||||
@ -331,7 +331,7 @@ void clamp
|
|||||||
(
|
(
|
||||||
DimensionedField<Type, GeoMesh>& result,
|
DimensionedField<Type, GeoMesh>& result,
|
||||||
const DimensionedField<Type, GeoMesh>& f1,
|
const DimensionedField<Type, GeoMesh>& f1,
|
||||||
const Foam::zero_one
|
Foam::zero_one
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const MinMax<Type> range(Foam::zero_one{});
|
const MinMax<Type> range(Foam::zero_one{});
|
||||||
@ -345,7 +345,7 @@ tmp<DimensionedField<Type, GeoMesh>>
|
|||||||
clamp
|
clamp
|
||||||
(
|
(
|
||||||
const DimensionedField<Type, GeoMesh>& f1,
|
const DimensionedField<Type, GeoMesh>& f1,
|
||||||
const Foam::zero_one
|
Foam::zero_one
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
auto tres =
|
auto tres =
|
||||||
@ -367,7 +367,7 @@ tmp<DimensionedField<Type, GeoMesh>>
|
|||||||
clamp
|
clamp
|
||||||
(
|
(
|
||||||
const tmp<DimensionedField<Type, GeoMesh>>& tf1,
|
const tmp<DimensionedField<Type, GeoMesh>>& tf1,
|
||||||
const Foam::zero_one
|
Foam::zero_one
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const auto& f1 = tf1();
|
const auto& f1 = tf1();
|
||||||
|
|||||||
@ -149,7 +149,7 @@ void clamp
|
|||||||
(
|
(
|
||||||
DimensionedField<Type, GeoMesh>& result,
|
DimensionedField<Type, GeoMesh>& result,
|
||||||
const DimensionedField<Type, GeoMesh>& f1,
|
const DimensionedField<Type, GeoMesh>& f1,
|
||||||
const Foam::zero_one
|
Foam::zero_one
|
||||||
);
|
);
|
||||||
|
|
||||||
template<class Type, class GeoMesh>
|
template<class Type, class GeoMesh>
|
||||||
@ -157,7 +157,7 @@ tmp<DimensionedField<Type, GeoMesh>>
|
|||||||
clamp
|
clamp
|
||||||
(
|
(
|
||||||
const DimensionedField<Type, GeoMesh>& f1,
|
const DimensionedField<Type, GeoMesh>& f1,
|
||||||
const Foam::zero_one
|
Foam::zero_one
|
||||||
);
|
);
|
||||||
|
|
||||||
template<class Type, class GeoMesh>
|
template<class Type, class GeoMesh>
|
||||||
@ -165,7 +165,7 @@ tmp<DimensionedField<Type, GeoMesh>>
|
|||||||
clamp
|
clamp
|
||||||
(
|
(
|
||||||
const tmp<DimensionedField<Type, GeoMesh>>& tf1,
|
const tmp<DimensionedField<Type, GeoMesh>>& tf1,
|
||||||
const Foam::zero_one
|
Foam::zero_one
|
||||||
);
|
);
|
||||||
|
|
||||||
BINARY_TYPE_FUNCTION_FS(Type, Type, MinMax<Type>, clamp)
|
BINARY_TYPE_FUNCTION_FS(Type, Type, MinMax<Type>, clamp)
|
||||||
|
|||||||
@ -458,7 +458,7 @@ void FieldField<Field, Type>::operator=(const Type& val)
|
|||||||
|
|
||||||
|
|
||||||
template<template<class> class Field, class Type>
|
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)
|
forAll(*this, i)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -197,7 +197,7 @@ public:
|
|||||||
void operator=(const Type& val);
|
void operator=(const Type& val);
|
||||||
|
|
||||||
//- Assign uniform zero
|
//- Assign uniform zero
|
||||||
void operator=(const Foam::zero);
|
void operator=(Foam::zero);
|
||||||
|
|
||||||
void operator+=(const FieldField<Field, Type>&);
|
void operator+=(const FieldField<Field, Type>&);
|
||||||
void operator+=(const tmp<FieldField<Field, Type>>&);
|
void operator+=(const tmp<FieldField<Field, Type>>&);
|
||||||
|
|||||||
@ -29,6 +29,7 @@ Class
|
|||||||
|
|
||||||
Description
|
Description
|
||||||
Dynamically sized Field.
|
Dynamically sized Field.
|
||||||
|
Similar to DynamicList, but inheriting from a Field instead of a List.
|
||||||
|
|
||||||
SourceFiles
|
SourceFiles
|
||||||
DynamicFieldI.H
|
DynamicFieldI.H
|
||||||
@ -95,15 +96,6 @@ class DynamicField
|
|||||||
|
|
||||||
public:
|
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
|
// Constructors
|
||||||
|
|
||||||
//- Default construct, an empty field without allocation.
|
//- Default construct, an empty field without allocation.
|
||||||
@ -112,11 +104,14 @@ public:
|
|||||||
//- Construct empty field with given initial capacity
|
//- Construct empty field with given initial capacity
|
||||||
inline explicit DynamicField(const label initialCapacity);
|
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
|
//- Construct given size and initial value
|
||||||
inline DynamicField(const label len, const T& val);
|
inline DynamicField(const label len, const T& val);
|
||||||
|
|
||||||
//- Construct given size and initial value of zero
|
//- 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
|
//- Copy construct
|
||||||
inline DynamicField(const DynamicField<T, SizeMin>& list);
|
inline DynamicField(const DynamicField<T, SizeMin>& list);
|
||||||
@ -222,7 +217,7 @@ public:
|
|||||||
|
|
||||||
//- Change the value for the list capacity directly (ADVANCED, UNSAFE)
|
//- Change the value for the list capacity directly (ADVANCED, UNSAFE)
|
||||||
//- Does not perform any memory management or resizing.
|
//- 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
|
//- Reserve allocation space for at least this size, allocating new
|
||||||
//- space if required and \em retaining old content.
|
//- space if required and \em retaining old content.
|
||||||
@ -248,21 +243,18 @@ public:
|
|||||||
// setting values (as per List usage).
|
// setting values (as per List usage).
|
||||||
inline void resize(const label len);
|
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);
|
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
|
//- Alter addressable list size, allocating new space if required
|
||||||
//- \em without necessarily recovering old content.
|
//- \em without necessarily recovering old content.
|
||||||
// If no reallocation is required, the contents remain untouched.
|
// If no reallocation is required, the contents remain untouched.
|
||||||
// Otherwise all entries will be uninitialized.
|
// Otherwise all entries will be uninitialized.
|
||||||
inline void resize_nocopy(const label len);
|
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.
|
//- Clear the addressed list, i.e. set the size to zero.
|
||||||
// Allocated size does not change
|
// Allocated size does not change
|
||||||
inline void clear() noexcept;
|
inline void clear() noexcept;
|
||||||
@ -278,9 +270,6 @@ public:
|
|||||||
// \note when empty() it will delete any allocated memory.
|
// \note when empty() it will delete any allocated memory.
|
||||||
inline void shrink_unsafe();
|
inline void shrink_unsafe();
|
||||||
|
|
||||||
//- Calls shrink_to_fit() and returns a reference to the DynamicField.
|
|
||||||
inline DynamicField<T, SizeMin>& shrink();
|
|
||||||
|
|
||||||
|
|
||||||
// Edit
|
// Edit
|
||||||
|
|
||||||
@ -289,11 +278,11 @@ public:
|
|||||||
|
|
||||||
//- Swap content, independent of sizing parameter
|
//- Swap content, independent of sizing parameter
|
||||||
template<int AnySizeMin>
|
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
|
//- Swap content with DynamicList, independent of sizing parameter
|
||||||
template<int AnySizeMin>
|
template<int AnySizeMin>
|
||||||
inline void swap(DynamicList<T, AnySizeMin>& other);
|
inline void swap(DynamicList<T, AnySizeMin>& other) noexcept;
|
||||||
|
|
||||||
//- Transfer the parameter contents into this
|
//- Transfer the parameter contents into this
|
||||||
inline void transfer(List<T>& list);
|
inline void transfer(List<T>& list);
|
||||||
@ -311,7 +300,7 @@ public:
|
|||||||
template<class... Args>
|
template<class... Args>
|
||||||
inline T& emplace_back(Args&&... 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);
|
inline void push_back(const T& val);
|
||||||
|
|
||||||
//- Move append an element
|
//- Move append an element
|
||||||
@ -340,7 +329,7 @@ public:
|
|||||||
inline void operator=(const T& val);
|
inline void operator=(const T& val);
|
||||||
|
|
||||||
//- Assign addressed entries to zero
|
//- Assign addressed entries to zero
|
||||||
inline void operator=(const Foam::zero);
|
inline void operator=(Foam::zero);
|
||||||
|
|
||||||
//- Copy assignment
|
//- Copy assignment
|
||||||
inline void operator=(const UList<T>& list);
|
inline void operator=(const UList<T>& list);
|
||||||
@ -392,6 +381,20 @@ public:
|
|||||||
|
|
||||||
// Housekeeping
|
// 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
|
//- Append an element at the end of the list
|
||||||
//FOAM_DEPRECATED_FOR(2022-10, "push_back()")
|
//FOAM_DEPRECATED_FOR(2022-10, "push_back()")
|
||||||
void append(const T& val) { this->push_back(val); }
|
void append(const T& val) { this->push_back(val); }
|
||||||
|
|||||||
@ -40,7 +40,7 @@ inline void Foam::DynamicField<T, SizeMin>::doAssignDynList
|
|||||||
if (capacity_ < len)
|
if (capacity_ < len)
|
||||||
{
|
{
|
||||||
// Needs more space for the copy operation
|
// Needs more space for the copy operation
|
||||||
List<T>::setAddressableSize(capacity_); // Use entire space
|
List<T>::setAddressableSize(capacity_);
|
||||||
List<T>::resize_nocopy(len);
|
List<T>::resize_nocopy(len);
|
||||||
capacity_ = List<T>::size();
|
capacity_ = List<T>::size();
|
||||||
}
|
}
|
||||||
@ -66,19 +66,14 @@ inline void Foam::DynamicField<T, SizeMin>::doCapacity
|
|||||||
// Addressable length, possibly truncated by new capacity
|
// Addressable length, possibly truncated by new capacity
|
||||||
const label currLen = Foam::min(List<T>::size(), newCapacity);
|
const label currLen = Foam::min(List<T>::size(), newCapacity);
|
||||||
|
|
||||||
// Corner case - see comments in DynamicList doCapacity
|
List<T>::setAddressableSize(capacity_);
|
||||||
if (List<T>::size() == newCapacity)
|
|
||||||
{
|
|
||||||
List<T>::setAddressableSize(currLen+1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nocopy)
|
if (nocopy)
|
||||||
{
|
{
|
||||||
List<T>::resize_nocopy(newCapacity);
|
List<T>::resize_nocopy(newCapacity);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
List<T>::resize(newCapacity);
|
List<T>::resize_copy(currLen, newCapacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
capacity_ = List<T>::size();
|
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>
|
template<class T, int SizeMin>
|
||||||
inline Foam::DynamicField<T, SizeMin>::DynamicField
|
inline Foam::DynamicField<T, SizeMin>::DynamicField
|
||||||
(
|
(
|
||||||
@ -163,7 +171,7 @@ template<class T, int SizeMin>
|
|||||||
inline Foam::DynamicField<T, SizeMin>::DynamicField
|
inline Foam::DynamicField<T, SizeMin>::DynamicField
|
||||||
(
|
(
|
||||||
const label len,
|
const label len,
|
||||||
const Foam::zero
|
Foam::zero
|
||||||
)
|
)
|
||||||
:
|
:
|
||||||
Field<T>(len, 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>
|
template<class T, int SizeMin>
|
||||||
inline void Foam::DynamicField<T, SizeMin>::reserve
|
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>
|
template<class T, int SizeMin>
|
||||||
inline void Foam::DynamicField<T, SizeMin>::resize
|
inline void Foam::DynamicField<T, SizeMin>::resize
|
||||||
(
|
(
|
||||||
@ -534,8 +544,7 @@ inline void Foam::DynamicField<T, SizeMin>::shrink_to_fit()
|
|||||||
|
|
||||||
if (currLen < capacity_)
|
if (currLen < capacity_)
|
||||||
{
|
{
|
||||||
// Adjust addressable size to trigger proper resizing
|
List<T>::setAddressableSize(capacity_);
|
||||||
List<T>::setAddressableSize(currLen+1);
|
|
||||||
List<T>::resize(currLen);
|
List<T>::resize(currLen);
|
||||||
capacity_ = List<T>::size();
|
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>
|
template<class T, int SizeMin>
|
||||||
inline void
|
inline void
|
||||||
Foam::DynamicField<T, SizeMin>::swap(List<T>& list)
|
Foam::DynamicField<T, SizeMin>::swap(List<T>& list)
|
||||||
@ -592,7 +592,7 @@ template<int AnySizeMin>
|
|||||||
inline void Foam::DynamicField<T, SizeMin>::swap
|
inline void Foam::DynamicField<T, SizeMin>::swap
|
||||||
(
|
(
|
||||||
DynamicField<T, AnySizeMin>& other
|
DynamicField<T, AnySizeMin>& other
|
||||||
)
|
) noexcept
|
||||||
{
|
{
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
@ -616,7 +616,7 @@ template<int AnySizeMin>
|
|||||||
inline void Foam::DynamicField<T, SizeMin>::swap
|
inline void Foam::DynamicField<T, SizeMin>::swap
|
||||||
(
|
(
|
||||||
DynamicList<T, AnySizeMin>& other
|
DynamicList<T, AnySizeMin>& other
|
||||||
)
|
) noexcept
|
||||||
{
|
{
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
@ -822,7 +822,7 @@ inline void Foam::DynamicField<T, SizeMin>::operator=
|
|||||||
template<class T, int SizeMin>
|
template<class T, int SizeMin>
|
||||||
inline void Foam::DynamicField<T, SizeMin>::operator=
|
inline void Foam::DynamicField<T, SizeMin>::operator=
|
||||||
(
|
(
|
||||||
const Foam::zero
|
Foam::zero
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UList<T>::operator=(Foam::zero{});
|
UList<T>::operator=(Foam::zero{});
|
||||||
|
|||||||
@ -145,16 +145,16 @@ public:
|
|||||||
inline Field(const label len, const Type& val);
|
inline Field(const label len, const Type& val);
|
||||||
|
|
||||||
//- Construct given size and initial values of zero
|
//- 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
|
//- 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
|
//- 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
|
//- Construct with length=1, initializing content to zero
|
||||||
inline Field(const Foam::one, const Foam::zero);
|
inline Field(Foam::one, Foam::zero);
|
||||||
|
|
||||||
//- Copy construct
|
//- Copy construct
|
||||||
inline Field(const Field<Type>& fld);
|
inline Field(const Field<Type>& fld);
|
||||||
@ -276,7 +276,7 @@ public:
|
|||||||
//- and assign its contents to this. The behaviour largely as
|
//- and assign its contents to this. The behaviour largely as
|
||||||
//- described in assign():
|
//- described in assign():
|
||||||
// - For MUST_READ and key not found: FatalIOError.
|
// - 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.
|
// - For NO_READ and key not found: simply size the field.
|
||||||
// .
|
// .
|
||||||
Field
|
Field
|
||||||
@ -508,7 +508,7 @@ public:
|
|||||||
inline void operator=(const Type& val);
|
inline void operator=(const Type& val);
|
||||||
|
|
||||||
//- Assign entries to zero
|
//- Assign entries to zero
|
||||||
inline void operator=(const Foam::zero);
|
inline void operator=(Foam::zero);
|
||||||
|
|
||||||
template<class Form, class Cmpt, direction nCmpt>
|
template<class Form, class Cmpt, direction nCmpt>
|
||||||
void operator=(const VectorSpace<Form,Cmpt,nCmpt>&);
|
void operator=(const VectorSpace<Form,Cmpt,nCmpt>&);
|
||||||
|
|||||||
@ -29,8 +29,6 @@ License
|
|||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
inline constexpr Foam::Field<Type>::Field() noexcept
|
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>
|
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{})
|
List<Type>(len, Foam::zero{})
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
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)
|
List<Type>(Foam::one{}, val)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
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))
|
List<Type>(Foam::one{}, std::move(val))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
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{})
|
List<Type>(Foam::one{}, Foam::zero{})
|
||||||
{}
|
{}
|
||||||
@ -209,7 +207,7 @@ inline void Foam::Field<Type>::operator=(const Type& val)
|
|||||||
|
|
||||||
|
|
||||||
template<class Type>
|
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{});
|
List<Type>::operator=(Foam::zero{});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -136,7 +136,13 @@ public:
|
|||||||
// Member Operators
|
// Member Operators
|
||||||
|
|
||||||
//- Allow cast to a const Field\<Type\>&
|
//- 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.
|
//- Copy assign via UList operator. Takes linear time.
|
||||||
inline void operator=(const SubField<Type>&);
|
inline void operator=(const SubField<Type>&);
|
||||||
@ -148,7 +154,7 @@ public:
|
|||||||
inline void operator=(const Type& val);
|
inline void operator=(const Type& val);
|
||||||
|
|
||||||
//- Assign all entries to zero
|
//- Assign all entries to zero
|
||||||
inline void operator=(const Foam::zero);
|
inline void operator=(Foam::zero);
|
||||||
|
|
||||||
//- Copy assign via UList operator. Takes linear time.
|
//- Copy assign via UList operator. Takes linear time.
|
||||||
template<class Form, direction Ncmpts>
|
template<class Form, direction Ncmpts>
|
||||||
|
|||||||
@ -125,13 +125,6 @@ inline Foam::tmp<Foam::Field<Type>> Foam::SubField<Type>::T() const
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * 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>
|
template<class Type>
|
||||||
inline void Foam::SubField<Type>::operator=(const SubField<Type>& rhs)
|
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>
|
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{});
|
SubList<Type>::operator=(Foam::zero{});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -524,7 +524,7 @@ void clamp
|
|||||||
(
|
(
|
||||||
GeometricField<Type, PatchField, GeoMesh>& result,
|
GeometricField<Type, PatchField, GeoMesh>& result,
|
||||||
const GeometricField<Type, PatchField, GeoMesh>& f1,
|
const GeometricField<Type, PatchField, GeoMesh>& f1,
|
||||||
const Foam::zero_one
|
Foam::zero_one
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const MinMax<Type> range(Foam::zero_one{});
|
const MinMax<Type> range(Foam::zero_one{});
|
||||||
@ -544,7 +544,7 @@ tmp<GeometricField<Type, PatchField, GeoMesh>>
|
|||||||
clamp
|
clamp
|
||||||
(
|
(
|
||||||
const GeometricField<Type, PatchField, GeoMesh>& f1,
|
const GeometricField<Type, PatchField, GeoMesh>& f1,
|
||||||
const Foam::zero_one
|
Foam::zero_one
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
auto tres =
|
auto tres =
|
||||||
@ -566,7 +566,7 @@ tmp<GeometricField<Type, PatchField, GeoMesh>>
|
|||||||
clamp
|
clamp
|
||||||
(
|
(
|
||||||
const tmp<GeometricField<Type, PatchField, GeoMesh>>& tf1,
|
const tmp<GeometricField<Type, PatchField, GeoMesh>>& tf1,
|
||||||
const Foam::zero_one
|
Foam::zero_one
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const auto& f1 = tf1();
|
const auto& f1 = tf1();
|
||||||
|
|||||||
@ -287,7 +287,7 @@ void clamp
|
|||||||
(
|
(
|
||||||
GeometricField<Type, PatchField, GeoMesh>& result,
|
GeometricField<Type, PatchField, GeoMesh>& result,
|
||||||
const GeometricField<Type, PatchField, GeoMesh>& f1,
|
const GeometricField<Type, PatchField, GeoMesh>& f1,
|
||||||
const Foam::zero_one
|
Foam::zero_one
|
||||||
);
|
);
|
||||||
|
|
||||||
template<class Type, template<class> class PatchField, class GeoMesh>
|
template<class Type, template<class> class PatchField, class GeoMesh>
|
||||||
@ -295,7 +295,7 @@ tmp<GeometricField<Type, PatchField, GeoMesh>>
|
|||||||
clamp
|
clamp
|
||||||
(
|
(
|
||||||
const GeometricField<Type, PatchField, GeoMesh>& f1,
|
const GeometricField<Type, PatchField, GeoMesh>& f1,
|
||||||
const Foam::zero_one
|
Foam::zero_one
|
||||||
);
|
);
|
||||||
|
|
||||||
template<class Type, template<class> class PatchField, class GeoMesh>
|
template<class Type, template<class> class PatchField, class GeoMesh>
|
||||||
@ -303,7 +303,7 @@ tmp<GeometricField<Type, PatchField, GeoMesh>>
|
|||||||
clamp
|
clamp
|
||||||
(
|
(
|
||||||
const tmp<GeometricField<Type, PatchField, GeoMesh>>& tf1,
|
const tmp<GeometricField<Type, PatchField, GeoMesh>>& tf1,
|
||||||
const Foam::zero_one
|
Foam::zero_one
|
||||||
);
|
);
|
||||||
|
|
||||||
BINARY_TYPE_FUNCTION_FS(Type, Type, MinMax<Type>, clamp)
|
BINARY_TYPE_FUNCTION_FS(Type, Type, MinMax<Type>, clamp)
|
||||||
|
|||||||
@ -24,7 +24,7 @@ License
|
|||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
Description
|
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.
|
used in multiple places by OpenFOAM.
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
@ -36,6 +36,7 @@ Description
|
|||||||
#include <initializer_list>
|
#include <initializer_list>
|
||||||
#include <iterator> // for std::begin, std::end, ...
|
#include <iterator> // for std::begin, std::end, ...
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <numeric> // for std::iota, std::reduce, ...
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
|||||||
@ -43,7 +43,6 @@ SourceFiles
|
|||||||
#define Foam_DiagonalMatrix_H
|
#define Foam_DiagonalMatrix_H
|
||||||
|
|
||||||
#include "List.H"
|
#include "List.H"
|
||||||
#include <numeric>
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
|||||||
@ -45,7 +45,6 @@ SourceFiles
|
|||||||
|
|
||||||
#include "Matrix.H"
|
#include "Matrix.H"
|
||||||
#include "Identity.H"
|
#include "Identity.H"
|
||||||
#include <numeric>
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
|||||||
@ -239,7 +239,7 @@ void Foam::GAMGSolver::Vcycle
|
|||||||
coarseCorrFields[leveli],
|
coarseCorrFields[leveli],
|
||||||
const_cast<solveScalarField&>
|
const_cast<solveScalarField&>
|
||||||
(
|
(
|
||||||
ACf.operator const solveScalarField&()
|
static_cast<const solveScalarField&>(ACf)
|
||||||
),
|
),
|
||||||
matrixLevels_[leveli],
|
matrixLevels_[leveli],
|
||||||
interfaceLevelsBouCoeffs_[leveli],
|
interfaceLevelsBouCoeffs_[leveli],
|
||||||
@ -346,11 +346,10 @@ void Foam::GAMGSolver::Vcycle
|
|||||||
scratch1,
|
scratch1,
|
||||||
coarseCorrFields[leveli].size()
|
coarseCorrFields[leveli].size()
|
||||||
);
|
);
|
||||||
solveScalarField& ACfRef =
|
auto& ACfRef = const_cast<solveScalarField&>
|
||||||
const_cast<solveScalarField&>
|
(
|
||||||
(
|
static_cast<const solveScalarField&>(ACf)
|
||||||
ACf.operator const solveScalarField&()
|
);
|
||||||
);
|
|
||||||
|
|
||||||
if (interpolateCorrection_)
|
if (interpolateCorrection_)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -164,7 +164,7 @@ public:
|
|||||||
inline explicit boundBox(const point& p);
|
inline explicit boundBox(const point& p);
|
||||||
|
|
||||||
//- Construct a 0/1 unit bounding box
|
//- 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
|
//- Construct from bound box min/max points
|
||||||
inline boundBox(const point& min, const point& max);
|
inline boundBox(const point& min, const point& max);
|
||||||
@ -295,7 +295,7 @@ public:
|
|||||||
inline void reset();
|
inline void reset();
|
||||||
|
|
||||||
//- Reset to a 0/1 unit bounding box
|
//- 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
|
//- Reset min/max to be identical to the specified point
|
||||||
inline void reset(const point& pt);
|
inline void reset(const point& pt);
|
||||||
|
|||||||
@ -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),
|
min_(point::zero),
|
||||||
max_(point::one)
|
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;
|
min_ = point::zero;
|
||||||
max_ = point::one;
|
max_ = point::one;
|
||||||
|
|||||||
@ -81,7 +81,7 @@ public:
|
|||||||
inline IjkField(const labelVector& ijk, const Type& val);
|
inline IjkField(const labelVector& ijk, const Type& val);
|
||||||
|
|
||||||
//- Construct with sizing information and initial values of zero
|
//- 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
|
//- Copy construct from components
|
||||||
inline IjkField(const labelVector& ijk, const UList<Type>& list);
|
inline IjkField(const labelVector& ijk, const UList<Type>& list);
|
||||||
@ -118,7 +118,7 @@ public:
|
|||||||
//- Clear dimensions and field
|
//- Clear dimensions and field
|
||||||
inline void clear();
|
inline void clear();
|
||||||
|
|
||||||
//- Change dimensions. Fill new values with Zero
|
//- Change dimensions. Fill new values with zero
|
||||||
void resize(const labelVector& newSizes);
|
void resize(const labelVector& newSizes);
|
||||||
|
|
||||||
//- Change dimensions
|
//- Change dimensions
|
||||||
|
|||||||
@ -75,7 +75,7 @@ template<class Type>
|
|||||||
inline Foam::IjkField<Type>::IjkField
|
inline Foam::IjkField<Type>::IjkField
|
||||||
(
|
(
|
||||||
const labelVector& ijk,
|
const labelVector& ijk,
|
||||||
const Foam::zero
|
Foam::zero
|
||||||
)
|
)
|
||||||
:
|
:
|
||||||
Field<Type>(cmptProduct(ijk), Foam::zero{}),
|
Field<Type>(cmptProduct(ijk), Foam::zero{}),
|
||||||
@ -101,7 +101,7 @@ inline Foam::IjkField<Type>::IjkField
|
|||||||
<< nl << nl;
|
<< nl << nl;
|
||||||
#endif
|
#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;
|
<< nl << nl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Field<Type>::resize(ijk_.size(), Zero);
|
Field<Type>::resize(ijk_.size(), Foam::zero{});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1134,8 +1134,12 @@ void Foam::syncTools::syncBoundaryFaceList
|
|||||||
pp.size(),
|
pp.size(),
|
||||||
pp.start()-boundaryOffset
|
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
|
SubList<T> patchValues
|
||||||
(
|
(
|
||||||
|
|||||||
@ -202,7 +202,7 @@ public:
|
|||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
//- Construct a 0/1 unit bounding box
|
//- 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
|
//- Construct a bounding box containing a single initial point
|
||||||
inline explicit treeBoundBox(const point& p);
|
inline explicit treeBoundBox(const point& p);
|
||||||
|
|||||||
@ -31,9 +31,9 @@ License
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
inline Foam::treeBoundBox::treeBoundBox(const Foam::zero_one)
|
inline Foam::treeBoundBox::treeBoundBox(Foam::zero_one)
|
||||||
:
|
:
|
||||||
boundBox(zero_one{})
|
boundBox(Foam::zero_one{})
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -292,7 +292,7 @@ inline bool notEqual(const Scalar a, const Scalar b)
|
|||||||
|
|
||||||
|
|
||||||
//- Clamp scalar value to a 0-1 range
|
//- 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;
|
return (val < 0) ? 0 : (1 < val) ? 1 : val;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -84,7 +84,7 @@ struct clampOp
|
|||||||
{}
|
{}
|
||||||
|
|
||||||
//- Construct as 0-1 min/max range
|
//- Construct as 0-1 min/max range
|
||||||
clampOp(const Foam::zero_one)
|
clampOp(Foam::zero_one)
|
||||||
:
|
:
|
||||||
clampOp(MinMax<T>(Foam::zero_one{}))
|
clampOp(MinMax<T>(Foam::zero_one{}))
|
||||||
{}
|
{}
|
||||||
|
|||||||
@ -25,8 +25,6 @@ License
|
|||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include <numeric>
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
inline Foam::UList<uint8_t> Foam::vtk::Tools::asUList
|
inline Foam::UList<uint8_t> Foam::vtk::Tools::asUList
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2016-2022 OpenCFD Ltd.
|
Copyright (C) 2016-2025 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -193,22 +193,22 @@ void Foam::ensightFaces::sort()
|
|||||||
if (!sub.empty())
|
if (!sub.empty())
|
||||||
{
|
{
|
||||||
SubList<label> ids(sub, addressing());
|
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
|
// Sort flip map as well
|
||||||
if (!flipMap_.empty())
|
if (!flipMap_.empty())
|
||||||
{
|
{
|
||||||
SubList<bool> flips(flipMap_, sub);
|
SubList<bool> flips(flipMap_, sub);
|
||||||
flips = reorder<boolList>(order, flips);
|
flips = UIndirectList<bool>(flips, order).list();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort face ordering as well
|
// Sort face ordering as well
|
||||||
if (!faceOrder_.empty())
|
if (!faceOrder_.empty())
|
||||||
{
|
{
|
||||||
SubList<label> faceOrder(faceOrder_, sub);
|
SubList<label> faceOrder(faceOrder_, sub);
|
||||||
faceOrder = reorder<labelList>(order, faceOrder);
|
faceOrder = UIndirectList<label>(faceOrder, order).list();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user