Vanilla upgrade of tmp

This commit is contained in:
Hrvoje Jasak 2016-06-03 21:38:56 +01:00
parent 25809b6ec9
commit ca7dbf2d1c
2 changed files with 53 additions and 15 deletions

View file

@ -62,7 +62,7 @@ class tmp
//- Pointer to temporary object //- Pointer to temporary object
mutable T* ptr_; mutable T* ptr_;
// Const reference to constant object //- Const reference to constant object
const T& ref_; const T& ref_;
@ -79,10 +79,11 @@ public:
//- Construct copy and increment reference count //- Construct copy and increment reference count
inline tmp(const tmp<T>&); inline tmp(const tmp<T>&);
//- Construct copy transferring content of temporary if required
inline tmp(const tmp<T>&, bool allowTransfer);
// Destructor
//- Delete object when reference count == 0 //- Destructor, delete object when reference count == 0
inline ~tmp(); inline ~tmp();

View file

@ -24,6 +24,7 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "error.H" #include "error.H"
#include <typeinfo>
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
@ -60,14 +61,48 @@ inline Foam::tmp<T>::tmp(const tmp<T>& t)
} }
else else
{ {
FatalErrorIn("tmp<T>::tmp(const tmp<T>&)") FatalErrorIn("Foam::tmp<T>::tmp(const tmp<T>&)")
<< "attempted copy of a deallocated temporary" << "attempted copy of a deallocated temporary"
<< " of type " << typeid(T).name()
<< abort(FatalError); << abort(FatalError);
} }
} }
} }
template<class T>
inline Foam::tmp<T>::tmp(const tmp<T>& t, bool allowTransfer)
:
isTmp_(t.isTmp_),
ptr_(t.ptr_),
ref_(t.ref_)
{
if (isTmp_)
{
if (allowTransfer)
{
const_cast<tmp<T>&>(t).ptr_ = 0;
}
else
{
if (ptr_)
{
ptr_->operator++();
}
else
{
FatalErrorIn
(
"Foam::tmp<T>::tmp(const tmp<T>&, bool allowTransfer)"
) << "attempted copy of a deallocated temporary"
<< " of type " << typeid(T).name()
<< abort(FatalError);
}
}
}
}
template<class T> template<class T>
inline Foam::tmp<T>::~tmp() inline Foam::tmp<T>::~tmp()
{ {
@ -116,8 +151,8 @@ inline T* Foam::tmp<T>::ptr() const
{ {
if (!ptr_) if (!ptr_)
{ {
FatalErrorIn("tmp<T>::ptr() const") FatalErrorIn("Foam::tmp<T>::ptr() const")
<< "temporary deallocated" << "temporary of type " << typeid(T).name() << " deallocated"
<< abort(FatalError); << abort(FatalError);
} }
@ -155,8 +190,8 @@ inline T& Foam::tmp<T>::operator()()
{ {
if (!ptr_) if (!ptr_)
{ {
FatalErrorIn("T& tmp<T>::operator()()") FatalErrorIn("T& Foam::tmp<T>::operator()()")
<< "temporary deallocated" << "temporary of type " << typeid(T).name() << " deallocated"
<< abort(FatalError); << abort(FatalError);
} }
@ -184,8 +219,8 @@ inline const T& Foam::tmp<T>::operator()() const
{ {
if (!ptr_) if (!ptr_)
{ {
FatalErrorIn("const T& tmp<T>::operator()() const") FatalErrorIn("const T& Foam::tmp<T>::operator()() const")
<< "temporary deallocated" << "temporary of type " << typeid(T).name() << " deallocated"
<< abort(FatalError); << abort(FatalError);
} }
@ -212,8 +247,8 @@ inline T* Foam::tmp<T>::operator->()
{ {
if (!ptr_) if (!ptr_)
{ {
FatalErrorIn("tmp<T>::operator->()") FatalErrorIn("Foam::tmp<T>::operator->()")
<< "temporary deallocated" << "temporary of type " << typeid(T).name() << " deallocated"
<< abort(FatalError); << abort(FatalError);
} }
@ -260,15 +295,17 @@ inline void Foam::tmp<T>::operator=(const tmp<T>& t)
} }
else else
{ {
FatalErrorIn("tmp<T>::operator=(const tmp<T>& t)") FatalErrorIn("Foam::tmp<T>::operator=(const tmp<T>&)")
<< "attempted copy of a deallocated temporary" << "attempted copy of a deallocated temporary"
<< " of type " << typeid(T).name()
<< abort(FatalError); << abort(FatalError);
} }
} }
else else
{ {
FatalErrorIn("tmp<T>::operator=(const tmp<T>& t)") FatalErrorIn("Foam::tmp<T>::operator=(const tmp<T>&)")
<< "attempted to assign to a const reference to constant object" << "attempted to assign to a const reference to constant object"
<< " of type " << typeid(T).name()
<< abort(FatalError); << abort(FatalError);
} }
} }