ENH: add tmp/refPtr support for setting cref/ref from pointer

- makes it easier to use for local or alternative storage.
  Eg,

  ```
      tmp<volScalarField> tfld;

      tfld.cref(obj.cfindObject<volScalarField>("name"));

      if (!tfld)
      {
          tfld = volScalarField::New("name", ...);
      }
  ```
This commit is contained in:
Mark Olesen 2021-06-08 13:51:49 +02:00
parent e2c8b0b13f
commit 6120e13d29
6 changed files with 71 additions and 7 deletions

View File

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

View File

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

View File

@ -215,12 +215,20 @@ public:
//- Clear existing and transfer ownership.
inline void reset(refPtr<T>&& 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<T>& other) noexcept;

View File

@ -300,6 +300,15 @@ inline void Foam::refPtr<T>::cref(const T& obj) noexcept
}
template<class T>
inline void Foam::refPtr<T>::cref(const T* p) noexcept
{
clear();
ptr_ = const_cast<T*>(p);
type_ = (ptr_ ? CREF : PTR);
}
template<class T>
inline void Foam::refPtr<T>::ref(T& obj) noexcept
{
@ -309,6 +318,15 @@ inline void Foam::refPtr<T>::ref(T& obj) noexcept
}
template<class T>
inline void Foam::refPtr<T>::ref(T* p) noexcept
{
clear();
ptr_ = p;
type_ = (ptr_ ? REF : PTR);
}
template<class T>
inline void Foam::refPtr<T>::swap(refPtr<T>& other) noexcept
{

View File

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

View File

@ -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<T>::cref(const T& obj) noexcept
}
template<class T>
inline void Foam::tmp<T>::cref(const T* p) noexcept
{
clear();
ptr_ = const_cast<T*>(p);
type_ = (ptr_ ? CREF : PTR);
}
template<class T>
inline void Foam::tmp<T>::ref(T& obj) noexcept
{
@ -349,6 +358,15 @@ inline void Foam::tmp<T>::ref(T& obj) noexcept
}
template<class T>
inline void Foam::tmp<T>::ref(T* p) noexcept
{
clear();
ptr_ = p;
type_ = (ptr_ ? REF : PTR);
}
template<class T>
inline void Foam::tmp<T>::swap(tmp<T>& other) noexcept
{