From ad37a9a5ebd7e8761e11d96cb7cf2ce630338f82 Mon Sep 17 00:00:00 2001 From: Henry Weller <http://cfd.direct> Date: Fri, 12 Feb 2016 14:08:38 +0000 Subject: [PATCH] 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. --- src/OpenFOAM/memory/tmp/tmp.H | 7 +++-- src/OpenFOAM/memory/tmp/tmpI.H | 48 +++++++++++++++++++++++++++------- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/OpenFOAM/memory/tmp/tmp.H b/src/OpenFOAM/memory/tmp/tmp.H index 7ca3a13ca2..783d06feb8 100644 --- a/src/OpenFOAM/memory/tmp/tmp.H +++ b/src/OpenFOAM/memory/tmp/tmp.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -125,7 +125,10 @@ public: //- Return const object pointer 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>&); }; diff --git a/src/OpenFOAM/memory/tmp/tmpI.H b/src/OpenFOAM/memory/tmp/tmpI.H index e289a06ca0..4f3ae9c662 100644 --- a/src/OpenFOAM/memory/tmp/tmpI.H +++ b/src/OpenFOAM/memory/tmp/tmpI.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -267,7 +267,7 @@ inline const T* Foam::tmp<T>::operator->() const template<class T> -inline void Foam::tmp<T>::operator=(const tmp<T>& t) +inline void Foam::tmp<T>::operator=(T* tPtr) { if (isTmp_ && ptr_) { @@ -282,27 +282,57 @@ inline void Foam::tmp<T>::operator=(const tmp<T>& t) } } - if (t.isTmp_) + isTmp_ = true; + + if (!tPtr) { - isTmp_ = true; - ptr_ = t.ptr_; + FatalErrorInFunction + << "attempted copy of a deallocated temporary" + << " of type " << typeid(T).name() + << abort(FatalError); + } - if (ptr_) + ptr_ = tPtr; + ptr_->resetRefCount(); +} + + +template<class T> +inline void Foam::tmp<T>::operator=(const tmp<T>& t) +{ + if (isTmp_ && ptr_) + { + if (ptr_->okToDelete()) { - ptr_->operator++(); + delete ptr_; + ptr_ = 0; } else + { + ptr_->operator--(); + } + } + + if (t.isTmp_) + { + isTmp_ = true; + + if (!t.ptr_) { FatalErrorInFunction - << "attempted copy of a deallocated temporary" + << "attempted assignment to a deallocated temporary" << " of type " << typeid(T).name() << abort(FatalError); } + + ptr_ = t.ptr_; + t.ptr_ = 0; + ptr_->resetRefCount(); } else { 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() << abort(FatalError); } -- GitLab