tmp: Added assignment to pointer operator to initialize null-tmp to an allocated object

This is a convenient method to set a null-constructed tmp in a
conditional statement.
This commit is contained in:
Henry Weller
2016-02-12 14:08:38 +00:00
parent 566512bc28
commit 6fde55cbd6
2 changed files with 44 additions and 11 deletions

View File

@ -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) 2011-2015 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -125,7 +125,10 @@ public:
//- Return const object pointer //- Return const object pointer
inline const T* operator->() const; inline const T* operator->() const;
//- Assignment operator //- Assignment to pointer changing this tmp to a temporary T
inline void operator=(T*);
//- Assignment transfering the temporary T to this tmp
inline void operator=(const tmp<T>&); inline void operator=(const tmp<T>&);
}; };

View File

@ -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) 2011-2015 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -266,6 +266,37 @@ inline const T* Foam::tmp<T>::operator->() const
} }
template<class T>
inline void Foam::tmp<T>::operator=(T* tPtr)
{
if (isTmp_ && ptr_)
{
if (ptr_->okToDelete())
{
delete ptr_;
ptr_ = 0;
}
else
{
ptr_->operator--();
}
}
isTmp_ = true;
if (!tPtr)
{
FatalErrorInFunction
<< "attempted copy of a deallocated temporary"
<< " of type " << typeid(T).name()
<< abort(FatalError);
}
ptr_ = tPtr;
ptr_->resetRefCount();
}
template<class T> template<class T>
inline void Foam::tmp<T>::operator=(const tmp<T>& t) inline void Foam::tmp<T>::operator=(const tmp<T>& t)
{ {
@ -285,24 +316,23 @@ inline void Foam::tmp<T>::operator=(const tmp<T>& t)
if (t.isTmp_) if (t.isTmp_)
{ {
isTmp_ = true; isTmp_ = true;
ptr_ = t.ptr_;
if (ptr_) if (!t.ptr_)
{
ptr_->operator++();
}
else
{ {
FatalErrorInFunction FatalErrorInFunction
<< "attempted copy of a deallocated temporary" << "attempted assignment to a deallocated temporary"
<< " of type " << typeid(T).name() << " of type " << typeid(T).name()
<< abort(FatalError); << abort(FatalError);
} }
ptr_ = t.ptr_;
t.ptr_ = 0;
ptr_->resetRefCount();
} }
else else
{ {
FatalErrorInFunction FatalErrorInFunction
<< "attempted to assign to a const reference to constant object" << "attempted assignment to a const reference to constant object"
<< " of type " << typeid(T).name() << " of type " << typeid(T).name()
<< abort(FatalError); << abort(FatalError);
} }