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
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
Test-DynamicList2.C
|
||||
Test-DynamicList2.cxx
|
||||
|
||||
EXE = $(FOAM_USER_APPBIN)/Test-DynamicList2
|
||||
|
||||
@ -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;
|
||||
@ -1,3 +1,3 @@
|
||||
Test-FixedList.C
|
||||
Test-FixedList.cxx
|
||||
|
||||
EXE = $(FOAM_USER_APPBIN)/Test-FixedList
|
||||
|
||||
@ -41,7 +41,6 @@ See also
|
||||
#include "List.H"
|
||||
#include "IPstream.H"
|
||||
#include "OPstream.H"
|
||||
#include <numeric>
|
||||
|
||||
using namespace Foam;
|
||||
|
||||
@ -54,7 +54,6 @@ See also
|
||||
#include "ListPolicy.H"
|
||||
|
||||
#include <list>
|
||||
#include <numeric>
|
||||
#include <functional>
|
||||
|
||||
// see issue #2083
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
Test-List3.C
|
||||
Test-List3.cxx
|
||||
|
||||
EXE = $(FOAM_USER_APPBIN)/Test-List3
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
Test-ListRead1.C
|
||||
Test-ListRead1.cxx
|
||||
|
||||
EXE = $(FOAM_USER_APPBIN)/Test-ListRead1
|
||||
|
||||
@ -50,7 +50,6 @@ Description
|
||||
#include "ListPolicy.H"
|
||||
|
||||
#include <list>
|
||||
#include <numeric>
|
||||
#include <functional>
|
||||
|
||||
using namespace Foam;
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
Test-PackedList1.C
|
||||
Test-PackedList1.cxx
|
||||
|
||||
EXE = $(FOAM_USER_APPBIN)/Test-PackedList1
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
Test-PackedList2.C
|
||||
Test-PackedList2.cxx
|
||||
|
||||
EXE = $(FOAM_USER_APPBIN)/Test-PackedList2
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
Test-SubField.C
|
||||
Test-SubField.cxx
|
||||
|
||||
EXE = $(FOAM_USER_APPBIN)/Test-SubField
|
||||
|
||||
@ -38,7 +38,6 @@ Description
|
||||
#include "SubField.H"
|
||||
#include "labelRange.H"
|
||||
#include "ListOps.H"
|
||||
#include <numeric>
|
||||
|
||||
using namespace Foam;
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
Test-UIndirectList.C
|
||||
Test-UIndirectList.cxx
|
||||
|
||||
EXE = $(FOAM_USER_APPBIN)/Test-UIndirectList
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
Test-bitSet2.C
|
||||
Test-bitSet2.cxx
|
||||
|
||||
EXE = $(FOAM_USER_APPBIN)/Test-bitSet2
|
||||
|
||||
@ -499,7 +499,7 @@ int main(int argc, char *argv[])
|
||||
Info<<"bitSet ";
|
||||
report(list4);
|
||||
|
||||
list4.shrink();
|
||||
list4.shrink_to_fit();
|
||||
Info<<"shrunk ";
|
||||
report(list4);
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
Test-charList.C
|
||||
Test-charList.cxx
|
||||
|
||||
EXE = $(FOAM_USER_APPBIN)/Test-charList
|
||||
|
||||
@ -43,8 +43,6 @@ Description
|
||||
#include "SubList.H"
|
||||
#include "FlatOutput.H"
|
||||
|
||||
#include <numeric>
|
||||
|
||||
using namespace Foam;
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
@ -50,8 +50,6 @@ Description
|
||||
#include "SliceStreamRepo.H"
|
||||
#endif
|
||||
|
||||
#include <numeric>
|
||||
|
||||
using namespace Foam;
|
||||
|
||||
|
||||
|
||||
@ -73,7 +73,6 @@ Description
|
||||
#include "perfectInterface.H"
|
||||
#include "IOobjectList.H"
|
||||
#include "ReadFields.H"
|
||||
#include <numeric>
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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); }
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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_)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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!
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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()")
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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>>&);
|
||||
|
||||
@ -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); }
|
||||
|
||||
@ -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{});
|
||||
|
||||
@ -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>&);
|
||||
|
||||
@ -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{});
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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{});
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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>
|
||||
|
||||
|
||||
@ -43,7 +43,6 @@ SourceFiles
|
||||
#define Foam_DiagonalMatrix_H
|
||||
|
||||
#include "List.H"
|
||||
#include <numeric>
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
@ -45,7 +45,6 @@ SourceFiles
|
||||
|
||||
#include "Matrix.H"
|
||||
#include "Identity.H"
|
||||
#include <numeric>
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
@ -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_)
|
||||
{
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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{});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
(
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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{})
|
||||
{}
|
||||
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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{}))
|
||||
{}
|
||||
|
||||
@ -25,8 +25,6 @@ License
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include <numeric>
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
inline Foam::UList<uint8_t> Foam::vtk::Tools::asUList
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user