mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: free/nullify of PtrList and UPtrList
- Allows clearing or freeing pointers without touching the underlying list size. Was previously only for PtrDynList, but now available on UPtrList, PtrList as well. - add transfer() method to PtrDynList to avoid potential slicing.
This commit is contained in:
@ -5,7 +5,7 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2018-2022 OpenCFD Ltd.
|
Copyright (C) 2018-2023 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -126,9 +126,6 @@ public:
|
|||||||
|
|
||||||
// Edit
|
// Edit
|
||||||
|
|
||||||
//- Delete the allocated entries, but retain the list size.
|
|
||||||
using PtrList<T>::free;
|
|
||||||
|
|
||||||
//- Squeeze out intermediate nullptr entries in the list of pointers
|
//- Squeeze out intermediate nullptr entries in the list of pointers
|
||||||
//- and adjust the addressable size accordingly.
|
//- and adjust the addressable size accordingly.
|
||||||
// \return the number of non-null entries
|
// \return the number of non-null entries
|
||||||
@ -138,6 +135,13 @@ public:
|
|||||||
template<int AnySizeMin>
|
template<int AnySizeMin>
|
||||||
inline void swap(PtrDynList<T, AnySizeMin>& other);
|
inline void swap(PtrDynList<T, AnySizeMin>& other);
|
||||||
|
|
||||||
|
//- Transfer contents of the argument PtrList into this.
|
||||||
|
inline void transfer(PtrList<T>& list);
|
||||||
|
|
||||||
|
//- Transfer contents of any sized PtrDynList into this.
|
||||||
|
template<int AnySizeMin>
|
||||||
|
inline void transfer(PtrDynList<T, AnySizeMin>& list);
|
||||||
|
|
||||||
//- Construct an element at the end of the list,
|
//- Construct an element at the end of the list,
|
||||||
//- return reference to the new list element
|
//- return reference to the new list element
|
||||||
template<class... Args>
|
template<class... Args>
|
||||||
|
|||||||
@ -216,6 +216,44 @@ inline void Foam::PtrDynList<T, SizeMin>::swap
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T, int SizeMin>
|
||||||
|
inline void Foam::PtrDynList<T, SizeMin>::transfer(PtrList<T>& other)
|
||||||
|
{
|
||||||
|
if
|
||||||
|
(
|
||||||
|
static_cast<const PtrList<T>*>(this)
|
||||||
|
== static_cast<const PtrList<T>*>(&other)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return; // Self assignment is a no-op
|
||||||
|
}
|
||||||
|
|
||||||
|
UPtrList<T>::swap(other);
|
||||||
|
other.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T, int SizeMin>
|
||||||
|
template<int AnySizeMin>
|
||||||
|
inline void Foam::PtrDynList<T, SizeMin>::transfer
|
||||||
|
(
|
||||||
|
PtrDynList<T, AnySizeMin>& other
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if
|
||||||
|
(
|
||||||
|
static_cast<const PtrList<T>*>(this)
|
||||||
|
== static_cast<const PtrList<T>*>(&other)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return; // Self assignment is a no-op
|
||||||
|
}
|
||||||
|
|
||||||
|
this->swap(other);
|
||||||
|
other.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class T, int SizeMin>
|
template<class T, int SizeMin>
|
||||||
template<class... Args>
|
template<class... Args>
|
||||||
inline T& Foam::PtrDynList<T, SizeMin>::emplace_back(Args&&... args)
|
inline T& Foam::PtrDynList<T, SizeMin>::emplace_back(Args&&... args)
|
||||||
|
|||||||
@ -78,8 +78,6 @@ protected:
|
|||||||
template<class INew>
|
template<class INew>
|
||||||
void readIstream(Istream& is, const INew& inew);
|
void readIstream(Istream& is, const INew& inew);
|
||||||
|
|
||||||
//- Delete the allocated entries, but retain the list size.
|
|
||||||
inline void free();
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -142,6 +140,9 @@ public:
|
|||||||
//- Clear the PtrList. Delete allocated entries and set size to zero.
|
//- Clear the PtrList. Delete allocated entries and set size to zero.
|
||||||
inline void clear();
|
inline void clear();
|
||||||
|
|
||||||
|
//- Free memory and nullify all entries. Does not change the list size.
|
||||||
|
inline void free();
|
||||||
|
|
||||||
//- Adjust size of PtrList.
|
//- Adjust size of PtrList.
|
||||||
// New entries are initialized to nullptr, removed entries are deleted
|
// New entries are initialized to nullptr, removed entries are deleted
|
||||||
void resize(const label newLen);
|
void resize(const label newLen);
|
||||||
|
|||||||
@ -30,15 +30,6 @@ License
|
|||||||
#include "refPtr.H"
|
#include "refPtr.H"
|
||||||
#include "tmp.H"
|
#include "tmp.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
inline void Foam::PtrList<T>::free()
|
|
||||||
{
|
|
||||||
(this->ptrs_).free(); // free old pointers
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
@ -96,11 +87,18 @@ inline Foam::PtrList<T>::PtrList
|
|||||||
template<class T>
|
template<class T>
|
||||||
inline void Foam::PtrList<T>::clear()
|
inline void Foam::PtrList<T>::clear()
|
||||||
{
|
{
|
||||||
(this->ptrs_).free(); // free old pointers
|
(this->ptrs_).free(); // Free and nullify old pointers
|
||||||
UPtrList<T>::clear();
|
UPtrList<T>::clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
inline void Foam::PtrList<T>::free()
|
||||||
|
{
|
||||||
|
(this->ptrs_).free(); // Free and nullify old pointers
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
template<class... Args>
|
template<class... Args>
|
||||||
inline T& Foam::PtrList<T>::emplace_back(Args&&... args)
|
inline T& Foam::PtrList<T>::emplace_back(Args&&... args)
|
||||||
@ -260,7 +258,12 @@ inline Foam::autoPtr<T> Foam::PtrList<T>::release(const label i)
|
|||||||
template<class T>
|
template<class T>
|
||||||
inline void Foam::PtrList<T>::transfer(PtrList<T>& list)
|
inline void Foam::PtrList<T>::transfer(PtrList<T>& list)
|
||||||
{
|
{
|
||||||
(this->ptrs_).free(); // free old pointers
|
if (this == &list)
|
||||||
|
{
|
||||||
|
return; // Self-assignment is a no-op
|
||||||
|
}
|
||||||
|
|
||||||
|
(this->ptrs_).free(); // Free and nullify old pointers
|
||||||
UPtrList<T>::transfer(list);
|
UPtrList<T>::transfer(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -295,6 +295,9 @@ public:
|
|||||||
//- Set list size to zero.
|
//- Set list size to zero.
|
||||||
inline void clear();
|
inline void clear();
|
||||||
|
|
||||||
|
//- Nullify all entries. Does not change the list size.
|
||||||
|
inline void free();
|
||||||
|
|
||||||
//- Change the size of the list.
|
//- Change the size of the list.
|
||||||
// New entries are initialized to nullptr.
|
// New entries are initialized to nullptr.
|
||||||
inline void resize(const label newLen);
|
inline void resize(const label newLen);
|
||||||
|
|||||||
@ -205,6 +205,13 @@ inline void Foam::UPtrList<T>::clear()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
inline void Foam::UPtrList<T>::free()
|
||||||
|
{
|
||||||
|
ptrs_.setNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
inline void Foam::UPtrList<T>::swap(UPtrList<T>& list)
|
inline void Foam::UPtrList<T>::swap(UPtrList<T>& list)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -191,7 +191,7 @@ void Foam::mapDistributeBase::send
|
|||||||
|
|
||||||
// Set up receives from neighbours
|
// Set up receives from neighbours
|
||||||
|
|
||||||
recvFields.clear();
|
recvFields.free();
|
||||||
recvFields.resize(nProcs);
|
recvFields.resize(nProcs);
|
||||||
|
|
||||||
for (const int domain : UPstream::allProcs(comm))
|
for (const int domain : UPstream::allProcs(comm))
|
||||||
@ -219,7 +219,7 @@ void Foam::mapDistributeBase::send
|
|||||||
|
|
||||||
// Set up sends to neighbours
|
// Set up sends to neighbours
|
||||||
|
|
||||||
sendFields.clear();
|
recvFields.free();
|
||||||
sendFields.resize(nProcs);
|
sendFields.resize(nProcs);
|
||||||
|
|
||||||
for (const int domain : UPstream::allProcs(comm))
|
for (const int domain : UPstream::allProcs(comm))
|
||||||
|
|||||||
@ -206,6 +206,13 @@ Foam::polyBoundaryMesh::polyBoundaryMesh
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
void Foam::polyBoundaryMesh::clear()
|
||||||
|
{
|
||||||
|
polyPatchList::clear();
|
||||||
|
clearAddressing();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Foam::polyBoundaryMesh::clearGeom()
|
void Foam::polyBoundaryMesh::clearGeom()
|
||||||
{
|
{
|
||||||
polyPatchList& patches = *this;
|
polyPatchList& patches = *this;
|
||||||
@ -219,9 +226,9 @@ void Foam::polyBoundaryMesh::clearGeom()
|
|||||||
|
|
||||||
void Foam::polyBoundaryMesh::clearAddressing()
|
void Foam::polyBoundaryMesh::clearAddressing()
|
||||||
{
|
{
|
||||||
neighbourEdgesPtr_.clear();
|
neighbourEdgesPtr_.reset(nullptr);
|
||||||
patchIDPtr_.clear();
|
patchIDPtr_.reset(nullptr);
|
||||||
groupIDsPtr_.clear();
|
groupIDsPtr_.reset(nullptr);
|
||||||
|
|
||||||
polyPatchList& patches = *this;
|
polyPatchList& patches = *this;
|
||||||
|
|
||||||
@ -493,7 +500,7 @@ void Foam::polyBoundaryMesh::setGroup
|
|||||||
const labelUList& patchIDs
|
const labelUList& patchIDs
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
groupIDsPtr_.clear();
|
groupIDsPtr_.reset(nullptr);
|
||||||
|
|
||||||
polyPatchList& patches = *this;
|
polyPatchList& patches = *this;
|
||||||
|
|
||||||
@ -1179,9 +1186,9 @@ void Foam::polyBoundaryMesh::movePoints(const pointField& p)
|
|||||||
|
|
||||||
void Foam::polyBoundaryMesh::updateMesh()
|
void Foam::polyBoundaryMesh::updateMesh()
|
||||||
{
|
{
|
||||||
neighbourEdgesPtr_.clear();
|
neighbourEdgesPtr_.reset(nullptr);
|
||||||
patchIDPtr_.clear();
|
patchIDPtr_.reset(nullptr);
|
||||||
groupIDsPtr_.clear();
|
groupIDsPtr_.reset(nullptr);
|
||||||
|
|
||||||
PstreamBuffers pBufs(Pstream::defaultCommsType);
|
PstreamBuffers pBufs(Pstream::defaultCommsType);
|
||||||
|
|
||||||
|
|||||||
@ -94,23 +94,24 @@ class polyBoundaryMesh
|
|||||||
//- Read if IOobject flags set. Return true if read.
|
//- Read if IOobject flags set. Return true if read.
|
||||||
bool readContents(const bool allowReadIfPresent);
|
bool readContents(const bool allowReadIfPresent);
|
||||||
|
|
||||||
//- No copy construct
|
|
||||||
polyBoundaryMesh(const polyBoundaryMesh&) = delete;
|
|
||||||
|
|
||||||
//- No copy assignment
|
|
||||||
void operator=(const polyBoundaryMesh&) = delete;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//- Declare friendship with polyMesh
|
//- Declare friendship with polyMesh
|
||||||
friend class polyMesh;
|
friend class polyMesh;
|
||||||
|
|
||||||
|
|
||||||
//- Runtime type information
|
//- Runtime type information
|
||||||
TypeName("polyBoundaryMesh");
|
TypeName("polyBoundaryMesh");
|
||||||
|
|
||||||
|
|
||||||
|
// Generated Methods
|
||||||
|
|
||||||
|
//- No copy construct
|
||||||
|
polyBoundaryMesh(const polyBoundaryMesh&) = delete;
|
||||||
|
|
||||||
|
//- No copy assignment
|
||||||
|
void operator=(const polyBoundaryMesh&) = delete;
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
//- Read constructor given IOobject and a polyMesh reference
|
//- Read constructor given IOobject and a polyMesh reference
|
||||||
@ -142,15 +143,17 @@ public:
|
|||||||
~polyBoundaryMesh() = default;
|
~polyBoundaryMesh() = default;
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Clear the patch list and all demand-driven data
|
||||||
|
void clear();
|
||||||
|
|
||||||
//- Clear geometry at this level and at patches
|
//- Clear geometry at this level and at patches
|
||||||
void clearGeom();
|
void clearGeom();
|
||||||
|
|
||||||
//- Clear addressing at this level and at patches
|
//- Clear addressing at this level and at patches
|
||||||
void clearAddressing();
|
void clearAddressing();
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- Return the mesh reference
|
//- Return the mesh reference
|
||||||
const polyMesh& mesh() const noexcept
|
const polyMesh& mesh() const noexcept
|
||||||
{
|
{
|
||||||
|
|||||||
@ -40,9 +40,7 @@ void Foam::polyMesh::removeBoundary()
|
|||||||
{
|
{
|
||||||
DebugInFunction << "Removing boundary patches." << endl;
|
DebugInFunction << "Removing boundary patches." << endl;
|
||||||
|
|
||||||
// Remove the point zones
|
|
||||||
boundary_.clear();
|
boundary_.clear();
|
||||||
boundary_.setSize(0);
|
|
||||||
|
|
||||||
clearOut();
|
clearOut();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -212,7 +212,7 @@ Foam::polyMesh::readUpdateState Foam::polyMesh::readUpdate()
|
|||||||
<< "unexpected consequences. Proceed with care." << endl;
|
<< "unexpected consequences. Proceed with care." << endl;
|
||||||
|
|
||||||
boundary_.clear();
|
boundary_.clear();
|
||||||
boundary_.setSize(newBoundary.size());
|
boundary_.resize(newBoundary.size());
|
||||||
|
|
||||||
forAll(newBoundary, patchi)
|
forAll(newBoundary, patchi)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -462,8 +462,7 @@ void Foam::boundaryMesh::clearOut()
|
|||||||
void Foam::boundaryMesh::read(const polyMesh& mesh)
|
void Foam::boundaryMesh::read(const polyMesh& mesh)
|
||||||
{
|
{
|
||||||
patches_.clear();
|
patches_.clear();
|
||||||
|
patches_.resize(mesh.boundaryMesh().size());
|
||||||
patches_.setSize(mesh.boundaryMesh().size());
|
|
||||||
|
|
||||||
// Number of boundary faces
|
// Number of boundary faces
|
||||||
const label nBFaces = mesh.nBoundaryFaces();
|
const label nBFaces = mesh.nBoundaryFaces();
|
||||||
@ -630,7 +629,7 @@ void Foam::boundaryMesh::readTriSurface(const fileName& fName)
|
|||||||
// There are as many surface patches as region numbers in triangles
|
// There are as many surface patches as region numbers in triangles
|
||||||
// so use the surface patches
|
// so use the surface patches
|
||||||
|
|
||||||
patches_.setSize(surfPatches.size());
|
patches_.resize(surfPatches.size());
|
||||||
|
|
||||||
// Take over patches, setting size to 0 for now.
|
// Take over patches, setting size to 0 for now.
|
||||||
forAll(surfPatches, patchi)
|
forAll(surfPatches, patchi)
|
||||||
@ -655,7 +654,7 @@ void Foam::boundaryMesh::readTriSurface(const fileName& fName)
|
|||||||
{
|
{
|
||||||
// There are not enough surface patches. Make up my own.
|
// There are not enough surface patches. Make up my own.
|
||||||
|
|
||||||
patches_.setSize(regionToBoundaryPatch.size());
|
patches_.resize(regionToBoundaryPatch.size());
|
||||||
|
|
||||||
forAll(patches_, patchi)
|
forAll(patches_, patchi)
|
||||||
{
|
{
|
||||||
@ -1627,9 +1626,7 @@ void Foam::boundaryMesh::deletePatch(const word& patchName)
|
|||||||
newPatches.set(patchi - 1, patches_[patchi].clone());
|
newPatches.set(patchi - 1, patches_[patchi].clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
patches_.clear();
|
patches_ = std::move(newPatches);
|
||||||
|
|
||||||
patches_ = newPatches;
|
|
||||||
|
|
||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -176,6 +176,15 @@ Foam::faBoundaryMesh::faBoundaryMesh
|
|||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
void Foam::faBoundaryMesh::clear()
|
||||||
|
{
|
||||||
|
faPatchList::clear();
|
||||||
|
groupIDsPtr_.reset(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
void Foam::faBoundaryMesh::calcGeometry()
|
void Foam::faBoundaryMesh::calcGeometry()
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2016-2017 Wikki Ltd
|
Copyright (C) 2016-2017 Wikki Ltd
|
||||||
Copyright (C) 2018-2022 OpenCFD Ltd.
|
Copyright (C) 2018-2023 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -90,12 +90,6 @@ class faBoundaryMesh
|
|||||||
//- Read if IOobject flags set. Return true if read.
|
//- Read if IOobject flags set. Return true if read.
|
||||||
bool readContents(const bool allowReadIfPresent);
|
bool readContents(const bool allowReadIfPresent);
|
||||||
|
|
||||||
//- No copy construct
|
|
||||||
faBoundaryMesh(const faBoundaryMesh&) = delete;
|
|
||||||
|
|
||||||
//- No copy assignment
|
|
||||||
void operator=(const faBoundaryMesh&) = delete;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -103,6 +97,15 @@ public:
|
|||||||
TypeName("faBoundaryMesh");
|
TypeName("faBoundaryMesh");
|
||||||
|
|
||||||
|
|
||||||
|
// Generated Methods
|
||||||
|
|
||||||
|
//- No copy construct
|
||||||
|
faBoundaryMesh(const faBoundaryMesh&) = delete;
|
||||||
|
|
||||||
|
//- No copy assignment
|
||||||
|
void operator=(const faBoundaryMesh&) = delete;
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
//- Construct from faMesh
|
//- Construct from faMesh
|
||||||
@ -127,6 +130,9 @@ public:
|
|||||||
|
|
||||||
// Member Functions
|
// Member Functions
|
||||||
|
|
||||||
|
//- Clear the patch list and all demand-driven data
|
||||||
|
void clear();
|
||||||
|
|
||||||
//- Return the mesh reference
|
//- Return the mesh reference
|
||||||
const faMesh& mesh() const noexcept
|
const faMesh& mesh() const noexcept
|
||||||
{
|
{
|
||||||
|
|||||||
@ -155,7 +155,7 @@ void Foam::sampledSets::gatherAllSets()
|
|||||||
|
|
||||||
const PtrList<sampledSet>& localSets = *this;
|
const PtrList<sampledSet>& localSets = *this;
|
||||||
|
|
||||||
gatheredSets_.clear();
|
gatheredSets_.free();
|
||||||
gatheredSets_.resize(localSets.size());
|
gatheredSets_.resize(localSets.size());
|
||||||
gatheredSorting_.resize_nocopy(localSets.size());
|
gatheredSorting_.resize_nocopy(localSets.size());
|
||||||
globalIndices_.resize_nocopy(localSets.size());
|
globalIndices_.resize_nocopy(localSets.size());
|
||||||
|
|||||||
Reference in New Issue
Block a user