diff --git a/src/OpenFOAM/db/regIOobject/regIOobject.H b/src/OpenFOAM/db/regIOobject/regIOobject.H index 6ac4db7c28190c7d72e63350292669a4f7ad7484..d1ed8278727ac6e519829b4c3e14dbfd363ac799 100644 --- a/src/OpenFOAM/db/regIOobject/regIOobject.H +++ b/src/OpenFOAM/db/regIOobject/regIOobject.H @@ -42,6 +42,8 @@ SourceFiles #define regIOobject_H #include "IOobject.H" +#include "refPtr.H" +#include "tmp.H" #include "typeInfo.H" #include "stdFoam.H" #include "OSspecific.H" @@ -52,6 +54,8 @@ SourceFiles namespace Foam { +// Forward Declarations + namespace functionEntries { class codeStream; @@ -59,7 +63,6 @@ namespace functionEntries namespace fileOperations { class uncollatedFileOperation; - class masterUncollatedFileOperation; } /*---------------------------------------------------------------------------*\ @@ -118,11 +121,9 @@ private: public: - //- Declare friendship with classes that need access to - //- masterOnlyReading + //- Friendship with classes needing access to masterOnlyReading friend class functionEntries::codeStream; friend class fileOperations::uncollatedFileOperation; - friend class fileOperations::masterUncollatedFileOperation; // Static data @@ -184,41 +185,46 @@ public: // \return true if now ownedByRegistry inline bool store(); - //- Register object pointer with its registry - //- and transfer ownership to the registry. - // \return reference to the object. + //- Transfer pointer ownership to its registry. + // \return reference to the stored object template<class Type> inline static Type& store(Type* p); - //- Register object pointer with its registry - //- and transfer ownership to the registry. - // Clears the autoPtr parameter. - // \return reference to the object. + //- Transfer pointer ownership to its registry. + // Resets (clears) the parameter. + // \return reference to the stored object template<class Type> - inline static Type& store(autoPtr<Type>& aptr); + inline static Type& store(autoPtr<Type>& ptr); - //- Register object pointer with its registry - //- and transfer ownership to the registry. - // Clears the autoPtr parameter. - // \return reference to the object. + //- Transfer pointer ownership to its registry. + // Resets (clears) the parameter. + // \return reference to the stored object + template<class Type> + inline static Type& store(autoPtr<Type>&& ptr); + + //- Transfer pointer ownership to its registry. + // Changes parameter from PTR to CREF (do not rely on this). + // \return reference to the stored object + template<class Type> + inline static Type& store(refPtr<Type>& ptr); + + //- Transfer pointer ownership to its registry. + // Changes parameter from PTR to CREF (do not rely on this). + // \return reference to the stored object template<class Type> - inline static Type& store(autoPtr<Type>&& aptr); + inline static Type& store(refPtr<Type>&& ptr); - //- Register temporary pointer with its registry - //- and transfer ownership of pointer to the registry. - // After the call, tmp parameter changes from PTR to CREF. - // - // \return reference to the object. + //- Transfer pointer ownership to its registry. + // Changes parameter from PTR to CREF (do not rely on this). + // \return reference to the stored object template<class Type> - inline static Type& store(tmp<Type>& tptr); + inline static Type& store(tmp<Type>& ptr); - //- Register temporary pointer with its registry - //- and transfer ownership of pointer to the registry. - // After the call, the tmp parameter content is \em unspecified. - // - // \return reference to the object. + //- Transfer pointer ownership to its registry. + // Changes parameter from PTR to CREF (do not rely on this). + // \return reference to the stored object template<class Type> - inline static Type& store(tmp<Type>&& tptr); + inline static Type& store(tmp<Type>&& ptr); //- Release ownership of this object from its registry // \param unregister optionally set as non-registered diff --git a/src/OpenFOAM/db/regIOobject/regIOobjectI.H b/src/OpenFOAM/db/regIOobject/regIOobjectI.H index 07623d9368617bff9a24adf1158cbb1a20567647..aa490b75ce63c6a20684c45e59816a9a02f1f4f7 100644 --- a/src/OpenFOAM/db/regIOobject/regIOobjectI.H +++ b/src/OpenFOAM/db/regIOobject/regIOobjectI.H @@ -75,47 +75,47 @@ inline Type& Foam::regIOobject::store(Type* p) template<class Type> -inline Type& Foam::regIOobject::store(autoPtr<Type>& aptr) +inline Type& Foam::regIOobject::store(autoPtr<Type>& ptr) { // Pass management to objectRegistry - return store(aptr.release()); + return store(ptr.release()); } template<class Type> -inline Type& Foam::regIOobject::store(autoPtr<Type>&& aptr) +inline Type& Foam::regIOobject::store(autoPtr<Type>&& ptr) { // Pass management to objectRegistry - return store(aptr.release()); + return store(ptr.release()); } template<class Type> -inline Type& Foam::regIOobject::store(tmp<Type>& tptr) +inline Type& Foam::regIOobject::store(refPtr<Type>& ptr) { Type* p = nullptr; - if (tptr.isTmp()) + if (ptr.is_pointer()) { - // Pass management to objectRegistry - p = tptr.ptr(); + // Acquire ownership, pass management to objectRegistry + p = ptr.ptr(); store(p); - // Adjust tmp<> access to use the stored reference - tptr.cref(*p); + // Change parameter to access the stored reference + ptr.cref(*p); } else { - // Taking ownership of a const-ref does not make much sense. + // Taking ownership of reference does not make much sense. // - Storing the object won't actually do so, it will be removed // when the original object goes out of scope. // - Storing a clone may not be what we want. - p = tptr.get(); + p = ptr.get(); WarningInFunction - << "Refuse to store tmp to const-ref: " << p->name() + << "Refuse to store reference: " << p->name() << ". Likely indicates a coding error\n"; } @@ -124,10 +124,51 @@ inline Type& Foam::regIOobject::store(tmp<Type>& tptr) template<class Type> -inline Type& Foam::regIOobject::store(tmp<Type>&& tptr) +inline Type& Foam::regIOobject::store(refPtr<Type>&& ptr) { - // Treat like a normal reference - return store(tptr); + // Forward as named reference, which also does a move + return store(ptr); +} + + +template<class Type> +inline Type& Foam::regIOobject::store(tmp<Type>& ptr) +{ + Type* p = nullptr; + + if (ptr.is_pointer()) + { + // Acquire ownership, pass management to objectRegistry + p = ptr.ptr(); + + store(p); + + // Change parameter to access the stored reference + ptr.cref(*p); + } + else + { + // Taking ownership of reference does not make much sense. + // - Storing the object won't actually do so, it will be removed + // when the original object goes out of scope. + // - Storing a clone may not be what we want. + + p = ptr.get(); + + WarningInFunction + << "Refuse to store reference: " << p->name() + << ". Likely indicates a coding error\n"; + } + + return *p; +} + + +template<class Type> +inline Type& Foam::regIOobject::store(tmp<Type>&& ptr) +{ + // Forward as named reference, which also does a move + return store(ptr); }