From 6120e13d2923caeb134e0e9d507605ec6082f242 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Tue, 8 Jun 2021 13:51:49 +0200 Subject: [PATCH] ENH: add tmp/refPtr support for setting cref/ref from pointer - makes it easier to use for local or alternative storage. Eg, ``` tmp tfld; tfld.cref(obj.cfindObject("name")); if (!tfld) { tfld = volScalarField::New("name", ...); } ``` --- applications/test/refPtr/Test-refPtr.C | 6 ++++++ applications/test/tmp/Test-tmp.C | 8 +++++++- src/OpenFOAM/memory/refPtr/refPtr.H | 12 ++++++++++-- src/OpenFOAM/memory/refPtr/refPtrI.H | 18 ++++++++++++++++++ src/OpenFOAM/memory/tmp/tmp.H | 14 +++++++++++--- src/OpenFOAM/memory/tmp/tmpI.H | 20 +++++++++++++++++++- 6 files changed, 71 insertions(+), 7 deletions(-) diff --git a/applications/test/refPtr/Test-refPtr.C b/applications/test/refPtr/Test-refPtr.C index 2d39ffa55c..5a5b872610 100644 --- a/applications/test/refPtr/Test-refPtr.C +++ b/applications/test/refPtr/Test-refPtr.C @@ -85,6 +85,12 @@ int main() ptr.reset(new scalarField(5, scalar(15))); tfld3.reset(std::move(ptr)); printInfo(tfld3, true); + + + ptr.reset(new scalarField(2, scalar(1))); + Info<< nl << "const-ref from pointer: " << name(ptr.get()) << nl; + tfld3.cref(ptr.get()); + printInfo(tfld3, true); } Info<< "\nEnd" << endl; diff --git a/applications/test/tmp/Test-tmp.C b/applications/test/tmp/Test-tmp.C index da0486af23..52cbde670e 100644 --- a/applications/test/tmp/Test-tmp.C +++ b/applications/test/tmp/Test-tmp.C @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2018-2020 OpenCFD Ltd. + Copyright (C) 2018-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM, distributed under GPL-3.0-or-later. @@ -110,6 +110,12 @@ int main() Info<< "Reset to some other tmp content : "; printInfo(tfld2); } + + std::unique_ptr ptr(new scalarField(2, scalar(1))); + + Info<< nl << "const-ref from pointer: " << name(ptr.get()) << nl; + tfld2.cref(ptr.get()); + printInfo(tfld2); } Info<< "\nEnd" << endl; diff --git a/src/OpenFOAM/memory/refPtr/refPtr.H b/src/OpenFOAM/memory/refPtr/refPtr.H index dabc065305..d7cf643fd8 100644 --- a/src/OpenFOAM/memory/refPtr/refPtr.H +++ b/src/OpenFOAM/memory/refPtr/refPtr.H @@ -215,12 +215,20 @@ public: //- Clear existing and transfer ownership. inline void reset(refPtr&& other) noexcept; - //- Delete managed temporary object and set to (const) reference + //- Clear existing and set (const) reference inline void cref(const T& obj) noexcept; - //- Delete managed temporary object and set to (non-const) reference + //- Clear existing and set (const) reference to pointer content. + // A null pointer is permitted (treated as a managed pointer). + inline void cref(const T* p) noexcept; + + //- Clear existing and set (non-const) reference inline void ref(T& obj) noexcept; + //- Clear existing and set (non-const) reference to pointer content. + // A null pointer is permitted (treated as a managed pointer). + inline void ref(T* p) noexcept; + //- Swaps the managed object with other. inline void swap(refPtr& other) noexcept; diff --git a/src/OpenFOAM/memory/refPtr/refPtrI.H b/src/OpenFOAM/memory/refPtr/refPtrI.H index 7a2019a27f..7736fa301f 100644 --- a/src/OpenFOAM/memory/refPtr/refPtrI.H +++ b/src/OpenFOAM/memory/refPtr/refPtrI.H @@ -300,6 +300,15 @@ inline void Foam::refPtr::cref(const T& obj) noexcept } +template +inline void Foam::refPtr::cref(const T* p) noexcept +{ + clear(); + ptr_ = const_cast(p); + type_ = (ptr_ ? CREF : PTR); +} + + template inline void Foam::refPtr::ref(T& obj) noexcept { @@ -309,6 +318,15 @@ inline void Foam::refPtr::ref(T& obj) noexcept } +template +inline void Foam::refPtr::ref(T* p) noexcept +{ + clear(); + ptr_ = p; + type_ = (ptr_ ? REF : PTR); +} + + template inline void Foam::refPtr::swap(refPtr& other) noexcept { diff --git a/src/OpenFOAM/memory/tmp/tmp.H b/src/OpenFOAM/memory/tmp/tmp.H index f9e0fa52fc..7a4272f0ee 100644 --- a/src/OpenFOAM/memory/tmp/tmp.H +++ b/src/OpenFOAM/memory/tmp/tmp.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation - Copyright (C) 2018-2020 OpenCFD Ltd. + Copyright (C) 2018-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -224,12 +224,20 @@ public: //- Clear existing and transfer ownership. inline void reset(tmp&& other) noexcept; - //- Delete managed temporary object and set to (const) reference + //- Clear existing and set (const) reference inline void cref(const T& obj) noexcept; - //- Delete managed temporary object and set to (non-const) reference + //- Clear existing and set (const) reference to pointer content. + // A null pointer is permitted (treated as a managed pointer). + inline void cref(const T* p) noexcept; + + //- Clear existing and set to (non-const) reference inline void ref(T& obj) noexcept; + //- Clear existing and set (non-const) reference to pointer content. + // A null pointer is permitted (treated as a managed pointer). + inline void ref(T* p) noexcept; + //- Swaps the managed object with other. inline void swap(tmp& other) noexcept; diff --git a/src/OpenFOAM/memory/tmp/tmpI.H b/src/OpenFOAM/memory/tmp/tmpI.H index 80650e3619..094eab36a7 100644 --- a/src/OpenFOAM/memory/tmp/tmpI.H +++ b/src/OpenFOAM/memory/tmp/tmpI.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2017 OpenFOAM Foundation - Copyright (C) 2018-2020 OpenCFD Ltd. + Copyright (C) 2018-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -340,6 +340,15 @@ inline void Foam::tmp::cref(const T& obj) noexcept } +template +inline void Foam::tmp::cref(const T* p) noexcept +{ + clear(); + ptr_ = const_cast(p); + type_ = (ptr_ ? CREF : PTR); +} + + template inline void Foam::tmp::ref(T& obj) noexcept { @@ -349,6 +358,15 @@ inline void Foam::tmp::ref(T& obj) noexcept } +template +inline void Foam::tmp::ref(T* p) noexcept +{ + clear(); + ptr_ = p; + type_ = (ptr_ ? REF : PTR); +} + + template inline void Foam::tmp::swap(tmp& other) noexcept {