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 {