ENH: support pointer cast from autoPtr
This commit is contained in:
parent
8b6f4a4bcf
commit
675aa8053a
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2018-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -23,6 +23,7 @@ License
|
|||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include "autoPtr.H"
|
#include "autoPtr.H"
|
||||||
#include "labelList.H"
|
#include "labelList.H"
|
||||||
#include "ListOps.H"
|
#include "ListOps.H"
|
||||||
@ -80,10 +81,26 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
auto list = autoPtr<labelList>::New(10, label(-1));
|
auto list = autoPtr<labelList>::New(10, label(-1));
|
||||||
|
|
||||||
Info<<"create: " << list() << nl;
|
Info<<"create: " << *list << nl;
|
||||||
|
|
||||||
|
const labelList* plist = list;
|
||||||
|
|
||||||
|
Info<<"pointer: " << uintptr_t(plist) << nl
|
||||||
|
<<"content: " << *plist << nl;
|
||||||
|
|
||||||
Info<<"create: " << autoPtr<labelList>::New(10, label(-1))()
|
Info<<"create: " << autoPtr<labelList>::New(10, label(-1))()
|
||||||
<< nl << nl;
|
<< nl << nl;
|
||||||
|
|
||||||
|
// Transfer to unique_ptr
|
||||||
|
std::unique_ptr<labelList> list2(list.release());
|
||||||
|
|
||||||
|
Info<<"move to unique_ptr: " << *list2 << nl;
|
||||||
|
Info<<"old is " << Switch(bool(list)) << nl;
|
||||||
|
|
||||||
|
autoPtr<labelList> list3(list2.release());
|
||||||
|
|
||||||
|
Info<<"move unique to autoPtr: " << *list3 << nl;
|
||||||
|
Info<<"old is " << Switch(bool(list2)) << nl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Confirm that forwarding with move construct actually works as expected
|
// Confirm that forwarding with move construct actually works as expected
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2016-2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2016-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011-2017 OpenFOAM Foundation
|
| Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||||
@ -121,17 +121,19 @@ public:
|
|||||||
inline explicit autoPtr(autoPtr<U>&& ap);
|
inline explicit autoPtr(autoPtr<U>&& ap);
|
||||||
|
|
||||||
//- A move construct disguised as a copy construct (transfers ownership)
|
//- A move construct disguised as a copy construct (transfers ownership)
|
||||||
// \remark This is a non-standard definition, and should ideally be
|
// \remark This should ideally be deleted - pending cleanup of code
|
||||||
// marked as deleted - pending cleanup of code currently relying
|
// currently relying on this behaviour.
|
||||||
// on this behaviour.
|
|
||||||
#ifdef Foam_autoPtr_copyConstruct
|
#ifdef Foam_autoPtr_copyConstruct
|
||||||
inline autoPtr(const autoPtr<T>& ap) noexcept;
|
autoPtr(const autoPtr<T>& ap) noexcept
|
||||||
|
:
|
||||||
|
ptr_(const_cast<autoPtr<T>&>(ap).release())
|
||||||
|
{}
|
||||||
#else
|
#else
|
||||||
autoPtr(const autoPtr<T>& ap) = delete;
|
autoPtr(const autoPtr<T>& ap) = delete;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//- Destructs the managed object if such is present
|
//- Deletes the managed object if such is present
|
||||||
inline ~autoPtr() noexcept;
|
inline ~autoPtr() noexcept;
|
||||||
|
|
||||||
|
|
||||||
@ -179,16 +181,8 @@ public:
|
|||||||
inline void reset(T* p = nullptr) noexcept;
|
inline void reset(T* p = nullptr) noexcept;
|
||||||
|
|
||||||
//- Delete managed object and set to new given pointer
|
//- Delete managed object and set to new given pointer
|
||||||
// \remark This is a non-standard definition, but may provide better
|
// \remark Same as move assign, but better for code documentation
|
||||||
// code documentation than a simple move assign would.
|
inline void reset(autoPtr<T>&& ap) noexcept;
|
||||||
inline void reset(autoPtr<T>&& other) noexcept;
|
|
||||||
|
|
||||||
//- Delete managed object and set to new given pointer
|
|
||||||
//- Identical behaviour to reset().
|
|
||||||
// \note Provided for backward compatibility - the older version
|
|
||||||
// enforced a run-time check (Fatal if pointer was already set)
|
|
||||||
// but this was rarely used.
|
|
||||||
inline void set(T* p) noexcept;
|
|
||||||
|
|
||||||
//- Swaps the managed object with other autoPtr.
|
//- Swaps the managed object with other autoPtr.
|
||||||
inline void swap(autoPtr<T>& other) noexcept;
|
inline void swap(autoPtr<T>& other) noexcept;
|
||||||
@ -239,6 +233,12 @@ public:
|
|||||||
operator const T&() const = delete;
|
operator const T&() const = delete;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//- Cast to pointer type
|
||||||
|
operator const T*() const noexcept { return get(); }
|
||||||
|
|
||||||
|
//- Cast to pointer type
|
||||||
|
operator T*() noexcept { return get(); }
|
||||||
|
|
||||||
//- True if the managed pointer is non-null
|
//- True if the managed pointer is non-null
|
||||||
explicit inline operator bool() const noexcept;
|
explicit inline operator bool() const noexcept;
|
||||||
|
|
||||||
@ -252,17 +252,27 @@ public:
|
|||||||
#ifdef Foam_autoPtr_copyAssign
|
#ifdef Foam_autoPtr_copyAssign
|
||||||
//- A move assignment disguised as a copy assignment
|
//- A move assignment disguised as a copy assignment
|
||||||
// \remark Non-standard definition - should just be movable
|
// \remark Non-standard definition - should just be movable
|
||||||
inline void operator=(const autoPtr<T>& ap) noexcept;
|
void operator=(const autoPtr<T>& ap) noexcept
|
||||||
|
{
|
||||||
|
operator=(std::move(const_cast<autoPtr<T>&>(ap)));
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
void operator=(const autoPtr<T>& ap) = delete;
|
void operator=(const autoPtr<T>& ap) = delete;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//- Allow reset via assignment from literal nullptr
|
//- Clear via assignment from literal nullptr
|
||||||
inline void operator=(std::nullptr_t) noexcept;
|
inline void operator=(std::nullptr_t) noexcept;
|
||||||
|
|
||||||
|
|
||||||
// Housekeeping
|
// Housekeeping
|
||||||
|
|
||||||
|
//- Deprecated(2018-02) Identical to reset().
|
||||||
|
// \note Provided for backward compatibility - the older version
|
||||||
|
// enforced a run-time check (Fatal if pointer was already set)
|
||||||
|
// but this was rarely used.
|
||||||
|
// \deprecated(2018-02) Identical to reset().
|
||||||
|
void set(T* p) noexcept { reset(p); }
|
||||||
|
|
||||||
//- Deprecated(2018-02) No copy assignment from plain pointer
|
//- Deprecated(2018-02) No copy assignment from plain pointer
|
||||||
// \deprecated(2018-02) Convenient, but uncontrolled access
|
// \deprecated(2018-02) Convenient, but uncontrolled access
|
||||||
void operator=(T* p) = delete;
|
void operator=(T* p) = delete;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2016-2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2016-2019 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
| Copyright (C) 2011-2017 OpenFOAM Foundation
|
| Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||||
@ -84,15 +84,6 @@ inline Foam::autoPtr<T>::autoPtr(autoPtr<U>&& ap)
|
|||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
#ifdef Foam_autoPtr_copyConstruct
|
|
||||||
template<class T>
|
|
||||||
inline Foam::autoPtr<T>::autoPtr(const autoPtr<T>& ap) noexcept
|
|
||||||
:
|
|
||||||
ptr_(const_cast<autoPtr<T>&>(ap).release())
|
|
||||||
{}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
@ -177,13 +168,6 @@ inline void Foam::autoPtr<T>::reset(autoPtr<T>&& ap) noexcept
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
inline void Foam::autoPtr<T>::set(T* p) noexcept
|
|
||||||
{
|
|
||||||
reset(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
inline void Foam::autoPtr<T>::swap(autoPtr<T>& other) noexcept
|
inline void Foam::autoPtr<T>::swap(autoPtr<T>& other) noexcept
|
||||||
{
|
{
|
||||||
@ -290,15 +274,6 @@ inline void Foam::autoPtr<T>::operator=(autoPtr<U>&& ap) noexcept
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef Foam_autoPtr_copyAssign
|
|
||||||
template<class T>
|
|
||||||
inline void Foam::autoPtr<T>::operator=(const autoPtr<T>& ap) noexcept
|
|
||||||
{
|
|
||||||
operator=(std::move(const_cast<autoPtr<T>&>(ap)));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
inline void Foam::autoPtr<T>::operator=(std::nullptr_t) noexcept
|
inline void Foam::autoPtr<T>::operator=(std::nullptr_t) noexcept
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user