mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: refine handling of DynamicList/DynamicField resizing
- previously had special resizing treatment for the corner case when the addressable size and the new capacity are identical. However, that particular approach (to minimize copying) meant that the exact deallocation size would likely be incorrect. Having the correct deallocation size becomes more important with alternative allocators. Introduce resize_copy() protected function to limit the number of elements copied during the resize. ENH: provide DynamicList/DynamicField constructor with sizing - allows fine-grained creation of a DynamicList/DynamicField with a given size/capacity without an initial value. COMP: typo in code for DynamicList::push_back() with IndirectList
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-List3.C
|
||||
Test-List3.cxx
|
||||
|
||||
EXE = $(FOAM_USER_APPBIN)/Test-List3
|
||||
|
||||
@ -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-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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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()")
|
||||
|
||||
@ -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{});
|
||||
|
||||
Reference in New Issue
Block a user