From ae0ffe751a6e5c479e34c56e2d93ca74eb3fe942 Mon Sep 17 00:00:00 2001
From: Jyoti Prakash Biswal <jyoti.prakash.biswal@cern.ch>
Date: Thu, 18 Oct 2018 19:25:33 +0200
Subject: [PATCH] Solution to missing move assignment operator!

move_ptr added.

Coverity issue# 113615
---
 .../PseudoMeasurementOnTrack.h                |  8 ++++-
 .../src/PseudoMeasurementOnTrack.cxx          | 36 ++++++++++++++++++-
 2 files changed, 42 insertions(+), 2 deletions(-)

diff --git a/Tracking/TrkEvent/TrkPseudoMeasurementOnTrack/TrkPseudoMeasurementOnTrack/PseudoMeasurementOnTrack.h b/Tracking/TrkEvent/TrkPseudoMeasurementOnTrack/TrkPseudoMeasurementOnTrack/PseudoMeasurementOnTrack.h
index 8213f9ca34c..d20f61f836a 100755
--- a/Tracking/TrkEvent/TrkPseudoMeasurementOnTrack/TrkPseudoMeasurementOnTrack/PseudoMeasurementOnTrack.h
+++ b/Tracking/TrkEvent/TrkPseudoMeasurementOnTrack/TrkPseudoMeasurementOnTrack/PseudoMeasurementOnTrack.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
 */
 
 ///////////////////////////////////////////////////////////////////
@@ -64,6 +64,12 @@ namespace Trk{
       //! virtual constructor, not absolutely needed but given for EDM symmetry 
       virtual PseudoMeasurementOnTrack* clone() const override;
 
+      //! move constructor
+      PseudoMeasurementOnTrack(PseudoMeasurementOnTrack&& pmot);
+
+      //! move assignment operator
+      PseudoMeasurementOnTrack& operator=(PseudoMeasurementOnTrack&& pmot);   
+
       //! returns the surface for the local to global transformation (interface from MeasurementBase)
       virtual const Surface& associatedSurface() const override;
 
diff --git a/Tracking/TrkEvent/TrkPseudoMeasurementOnTrack/src/PseudoMeasurementOnTrack.cxx b/Tracking/TrkEvent/TrkPseudoMeasurementOnTrack/src/PseudoMeasurementOnTrack.cxx
index 4ec12f83298..fdab96f523e 100755
--- a/Tracking/TrkEvent/TrkPseudoMeasurementOnTrack/src/PseudoMeasurementOnTrack.cxx
+++ b/Tracking/TrkEvent/TrkPseudoMeasurementOnTrack/src/PseudoMeasurementOnTrack.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
 */
 
 ///////////////////////////////////////////////////////////////////
@@ -15,6 +15,16 @@
 #include <typeinfo>
 
 
+namespace {
+  // helper to move pointer and set source to nullptr
+  template <class T>
+  T move_ptr(T &src) {
+    T tmp = src;
+    src = nullptr;
+    return tmp;
+  }
+}
+
 
 Trk::PseudoMeasurementOnTrack::PseudoMeasurementOnTrack(const LocalParameters& locpars,
                                                         const Amg::MatrixX& locerr,
@@ -57,6 +67,14 @@ Trk::PseudoMeasurementOnTrack::PseudoMeasurementOnTrack( const Trk::PseudoMeasur
   m_globalPosition(0)
 {}
 
+// move constructor:
+Trk::PseudoMeasurementOnTrack::PseudoMeasurementOnTrack(Trk::PseudoMeasurementOnTrack&& pmot) :
+  Trk::MeasurementBase(pmot),
+  m_associatedSurface(move_ptr(pmot.m_associatedSurface)),
+  m_globalPosition(move_ptr(pmot.m_globalPosition))
+{}
+
+
 // assignment operator:
 Trk::PseudoMeasurementOnTrack& Trk::PseudoMeasurementOnTrack::operator=(const PseudoMeasurementOnTrack& pmot)
 {
@@ -72,6 +90,22 @@ Trk::PseudoMeasurementOnTrack& Trk::PseudoMeasurementOnTrack::operator=(const Ps
   return *this;
 }
 
+
+// move assignment operator:
+Trk::PseudoMeasurementOnTrack& Trk::PseudoMeasurementOnTrack::operator=(PseudoMeasurementOnTrack&& pmot)
+{
+  if ( &pmot != this) {
+    Trk::MeasurementBase::operator=(pmot);
+    if (m_associatedSurface && m_associatedSurface->isFree())
+      delete m_associatedSurface;
+    m_associatedSurface = move_ptr(pmot.m_associatedSurface);
+    delete m_globalPosition;
+    m_globalPosition    = move_ptr(pmot.m_globalPosition);
+  }
+  return *this;
+}
+
+
 const Amg::Vector3D& Trk::PseudoMeasurementOnTrack::globalPosition() const
 {
   if (m_globalPosition == 0) {m_globalPosition = new Amg::Vector3D(m_associatedSurface->center());}
-- 
GitLab