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:
Andrew Heather
2025-04-30 08:22:01 +00:00
67 changed files with 294 additions and 256 deletions

View File

@ -1,3 +1,3 @@
Test-DynamicList.C
Test-DynamicList.cxx
EXE = $(FOAM_USER_APPBIN)/Test-DynamicList

View File

@ -1,3 +1,3 @@
Test-DynamicList2.C
Test-DynamicList2.cxx
EXE = $(FOAM_USER_APPBIN)/Test-DynamicList2

View File

@ -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;

View File

@ -1,3 +1,3 @@
Test-FixedList.C
Test-FixedList.cxx
EXE = $(FOAM_USER_APPBIN)/Test-FixedList

View File

@ -41,7 +41,6 @@ See also
#include "List.H"
#include "IPstream.H"
#include "OPstream.H"
#include <numeric>
using namespace Foam;

View File

@ -54,7 +54,6 @@ See also
#include "ListPolicy.H"
#include <list>
#include <numeric>
#include <functional>
// see issue #2083

View File

@ -1,3 +1,3 @@
Test-List3.C
Test-List3.cxx
EXE = $(FOAM_USER_APPBIN)/Test-List3

View File

@ -1,3 +1,3 @@
Test-ListRead1.C
Test-ListRead1.cxx
EXE = $(FOAM_USER_APPBIN)/Test-ListRead1

View File

@ -50,7 +50,6 @@ Description
#include "ListPolicy.H"
#include <list>
#include <numeric>
#include <functional>
using namespace Foam;

View File

@ -1,3 +1,3 @@
Test-PackedList1.C
Test-PackedList1.cxx
EXE = $(FOAM_USER_APPBIN)/Test-PackedList1

View File

@ -1,3 +1,3 @@
Test-PackedList2.C
Test-PackedList2.cxx
EXE = $(FOAM_USER_APPBIN)/Test-PackedList2

View File

@ -1,3 +1,3 @@
Test-SubField.C
Test-SubField.cxx
EXE = $(FOAM_USER_APPBIN)/Test-SubField

View File

@ -38,7 +38,6 @@ Description
#include "SubField.H"
#include "labelRange.H"
#include "ListOps.H"
#include <numeric>
using namespace Foam;

View File

@ -1,3 +1,3 @@
Test-UIndirectList.C
Test-UIndirectList.cxx
EXE = $(FOAM_USER_APPBIN)/Test-UIndirectList

View File

@ -1,3 +1,3 @@
Test-bitSet2.C
Test-bitSet2.cxx
EXE = $(FOAM_USER_APPBIN)/Test-bitSet2

View File

@ -499,7 +499,7 @@ int main(int argc, char *argv[])
Info<<"bitSet ";
report(list4);
list4.shrink();
list4.shrink_to_fit();
Info<<"shrunk ";
report(list4);

View File

@ -1,3 +1,3 @@
Test-charList.C
Test-charList.cxx
EXE = $(FOAM_USER_APPBIN)/Test-charList

View File

@ -43,8 +43,6 @@ Description
#include "SubList.H"
#include "FlatOutput.H"
#include <numeric>
using namespace Foam;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -50,8 +50,6 @@ Description
#include "SliceStreamRepo.H"
#endif
#include <numeric>
using namespace Foam;

View File

@ -73,7 +73,6 @@ Description
#include "perfectInterface.H"
#include "IOobjectList.H"
#include "ReadFields.H"
#include <numeric>
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -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);

View File

@ -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());

View File

@ -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); }

View File

@ -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"

View File

@ -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_)

View File

@ -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

View File

@ -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);

View File

@ -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!

View File

@ -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)
{

View File

@ -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);

View File

@ -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

View File

@ -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();
}

View File

@ -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()")

View File

@ -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

View File

@ -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;

View File

@ -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();

View File

@ -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)

View File

@ -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)
{

View File

@ -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>>&);

View File

@ -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); }

View File

@ -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{});

View File

@ -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>&);

View File

@ -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{});
}

View File

@ -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>

View File

@ -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{});
}

View File

@ -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();

View File

@ -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)

View File

@ -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>

View File

@ -43,7 +43,6 @@ SourceFiles
#define Foam_DiagonalMatrix_H
#include "List.H"
#include <numeric>
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -45,7 +45,6 @@ SourceFiles
#include "Matrix.H"
#include "Identity.H"
#include <numeric>
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -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_)
{

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -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{});
}
}

View File

@ -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
(

View File

@ -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);

View File

@ -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{})
{}

View File

@ -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;
}

View File

@ -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{}))
{}

View File

@ -25,8 +25,6 @@ License
\*---------------------------------------------------------------------------*/
#include <numeric>
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
inline Foam::UList<uint8_t> Foam::vtk::Tools::asUList

View File

@ -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();
}
}
}