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