From aff54e68dabba335d958b483d2789ec87113f4dc Mon Sep 17 00:00:00 2001
From: Jyoti Prakash Biswal <jyoti.prakash.biswal@cern.ch>
Date: Wed, 6 Feb 2019 13:56:11 +0000
Subject: [PATCH] Solution to Missing move assignment operator! (CID# 113566)

---
 .../TrkEvent/TrkSegment/TrkSegment/Segment.h  | 23 +++--
 .../TrkSegment/TrkSegment/TrackSegment.h      | 10 +-
 Tracking/TrkEvent/TrkSegment/src/Segment.cxx  | 96 +++++++++++++------
 .../TrkEvent/TrkSegment/src/TrackSegment.cxx  | 36 ++++++-
 4 files changed, 120 insertions(+), 45 deletions(-)

diff --git a/Tracking/TrkEvent/TrkSegment/TrkSegment/Segment.h b/Tracking/TrkEvent/TrkSegment/TrkSegment/Segment.h
index cffb255fbb1..9aa27cc5b12 100755
--- a/Tracking/TrkEvent/TrkSegment/TrkSegment/Segment.h
+++ b/Tracking/TrkEvent/TrkSegment/TrkSegment/Segment.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 ///////////////////////////////////////////////////////////////////
@@ -78,8 +78,12 @@ class FitQuality;
       Segment();
       /** Copy Constructor */
       Segment(const Segment& seg);
+      /** Move Constructor */   
+      Segment(Segment&&);      
       /** Assignment operator */
       Segment& operator=(const Segment& seg);
+      /** Move assignment operator*/
+      Segment& operator=(Segment&&);
 
       /** Constructor with parameters */
       Segment( const LocalParameters& locpars,
@@ -100,8 +104,7 @@ class FitQuality;
 
       const DataVector<const Trk::MeasurementBase>& containedMeasurementsDataVector() const;
 
-      bool hasContainedMeasurements() const;
-
+      bool hasContainedMeasurements() const; 
       /** Return the number of contained Trk::MeasurementBase (s)*/
       unsigned int numberOfMeasurementBases() const ;
 
@@ -125,21 +128,21 @@ class FitQuality;
       friend class ::SegmentCnv_p1;
       
       /** The fit quality of the Segment */
-      FitQuality*                           m_fitQuality;
-      
+      FitQuality* m_fitQuality;  
+       
       /** The vector of contained (generic) Trk::MeasurementBase objects */
-      DataVector<const MeasurementBase>*    m_containedMeasBases;
-     
+      DataVector<const MeasurementBase>* m_containedMeasBases;   
+  
       /** number of objects of this type in memory */
-      static unsigned int                   s_numberOfInstantiations;
+      static unsigned int  s_numberOfInstantiations;
 
       /** segment author */
-      Author                         m_author;
+      Author m_author;
 };
 
 inline const FitQuality* Segment::fitQuality() const 
 { 
-    return m_fitQuality; 
+    return m_fitQuality;  
 }
 
 inline const std::vector<const MeasurementBase*>& Segment::containedMeasurements() const
diff --git a/Tracking/TrkEvent/TrkSegment/TrkSegment/TrackSegment.h b/Tracking/TrkEvent/TrkSegment/TrkSegment/TrackSegment.h
index 5171c1e3c12..b778595f719 100755
--- a/Tracking/TrkEvent/TrkSegment/TrkSegment/TrackSegment.h
+++ b/Tracking/TrkEvent/TrkSegment/TrkSegment/TrackSegment.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 ///////////////////////////////////////////////////////////////////
@@ -54,9 +54,13 @@ class FitQuality;
       TrackSegment();
       /** Copy Constructor */
       TrackSegment(const TrackSegment& seg);
+      /** Move Constructor */
+      TrackSegment(TrackSegment&&); 
       /** Assignment operator */
-      TrackSegment& operator=(const TrackSegment& seg);
-  
+      TrackSegment& operator=(const TrackSegment& seg); 
+      /** Move assignment operator*/
+      TrackSegment& operator=(TrackSegment&&);
+    
       /** Constructor with parameters */
       TrackSegment( const LocalParameters& locpars,
                     const Amg::MatrixX& locerr,
diff --git a/Tracking/TrkEvent/TrkSegment/src/Segment.cxx b/Tracking/TrkEvent/TrkSegment/src/Segment.cxx
index d69b3973276..9ad904a4813 100755
--- a/Tracking/TrkEvent/TrkSegment/src/Segment.cxx
+++ b/Tracking/TrkEvent/TrkSegment/src/Segment.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 ///////////////////////////////////////////////////////////////////
@@ -13,11 +13,10 @@ unsigned int Trk::Segment::s_numberOfInstantiations=0;
 
 // default constructor
 Trk::Segment::Segment()
-    :
-    Trk::MeasurementBase(),
-    m_fitQuality(nullptr),
-     m_containedMeasBases(nullptr),
-     m_author(AuthorUnknown)
+    : Trk::MeasurementBase(),
+      m_fitQuality(nullptr),
+      m_containedMeasBases( nullptr ),
+      m_author(AuthorUnknown)
 {
 #ifndef NDEBUG
   s_numberOfInstantiations++; // new Segment, so increment total count
@@ -26,22 +25,22 @@ Trk::Segment::Segment()
 
 // copy constructor
 Trk::Segment::Segment(const Trk::Segment& seg)
-    :
-    Trk::MeasurementBase(seg),
+    : Trk::MeasurementBase(seg),
     m_fitQuality(seg.m_fitQuality ? seg.m_fitQuality->clone() : nullptr),
+    m_containedMeasBases( new DataVector<const Trk::MeasurementBase>  ),
     m_author( seg.m_author)
 {
-    m_containedMeasBases = new DataVector<const Trk::MeasurementBase>;
-    DataVector<const Trk::MeasurementBase>::const_iterator rotIter = seg.m_containedMeasBases->begin();
-    DataVector<const Trk::MeasurementBase>::const_iterator rotEnd  = seg.m_containedMeasBases->end();
-    for (; rotIter!=rotEnd; ++rotIter)
-       m_containedMeasBases->push_back((*rotIter)->clone());
+    m_containedMeasBases->reserve(seg.m_containedMeasBases->size());
+    for(const Trk::MeasurementBase *const measurement : *(seg.m_containedMeasBases)) {
+       m_containedMeasBases->push_back(measurement->clone());
+    }
 #ifndef NDEBUG
   s_numberOfInstantiations++; // new Segment, so increment total count
 #endif
 }
 
 
+
 // copy constructor
 Trk::Segment::Segment(const Trk::LocalParameters& locpars,
                       const Amg::MatrixX& locerr,
@@ -59,11 +58,29 @@ Trk::Segment::Segment(const Trk::LocalParameters& locpars,
 #endif
 }
 
+
+// move constructor
+Trk::Segment::Segment(Trk::Segment&& seg)
+     : Trk::MeasurementBase(seg),
+       m_author( seg.m_author)
+{
+     m_fitQuality = seg.m_fitQuality;
+     seg.m_fitQuality = nullptr;
+     m_containedMeasBases = seg.m_containedMeasBases;
+     seg.m_containedMeasBases = nullptr;
+#ifndef NDEBUG
+     s_numberOfInstantiations++; // new Segment, so increment total count
+#endif 
+}
+
+
 // destructor - child save
 Trk::Segment::~Segment()
 {
-   delete m_fitQuality; m_fitQuality                = nullptr;
-   delete m_containedMeasBases; m_containedMeasBases= nullptr;
+
+   delete m_containedMeasBases;
+   delete m_fitQuality;
+
 #ifndef NDEBUG
    s_numberOfInstantiations--; // delete Segment, so decrement total count
 #endif
@@ -74,27 +91,50 @@ Trk::Segment::~Segment()
 Trk::Segment& Trk::Segment::operator=(const Trk::Segment& seg)
 {
   if (this!=&seg){
-    delete m_fitQuality;
-    delete m_containedMeasBases;
     Trk::MeasurementBase::operator=(seg);
-    m_fitQuality         = seg.m_fitQuality ? seg.m_fitQuality->clone() : nullptr;
-
+    delete m_fitQuality;
+    
+    m_fitQuality = seg.m_fitQuality ? seg.m_fitQuality->clone() : nullptr;
     if (seg.m_containedMeasBases) {
-      m_containedMeasBases = new DataVector<const Trk::MeasurementBase>;
-      DataVector<const Trk::MeasurementBase>::const_iterator rotIter = seg.m_containedMeasBases->begin();
-      DataVector<const Trk::MeasurementBase>::const_iterator rotEnd  = seg.m_containedMeasBases->end();
-      for (; rotIter!=rotEnd; ++rotIter){
-        m_containedMeasBases->push_back((*rotIter)->clone());
-      }
+      if (!m_containedMeasBases) {
+         m_containedMeasBases = new DataVector<const Trk::MeasurementBase>;
+      }  
+       else {
+           m_containedMeasBases->clear();
+       }
+      m_containedMeasBases->reserve(seg.m_containedMeasBases->size());
+      for(const Trk::MeasurementBase *const measurement : *(seg.m_containedMeasBases)) {
+       m_containedMeasBases->push_back(measurement->clone());
+      } 
+    }
+    else {
+      delete m_containedMeasBases;
+      m_containedMeasBases = nullptr; 
     }
-    else
-      m_containedMeasBases = nullptr;
-
     m_author = seg.m_author;
   }
   return (*this);
 }
 
+
+// move assignment operator
+Trk::Segment& Trk::Segment::operator=(Trk::Segment&& seg) {
+   if (this!=&seg){
+     Trk::MeasurementBase::operator=(seg);
+     delete m_fitQuality;
+     m_fitQuality = seg.m_fitQuality;
+     seg.m_fitQuality = nullptr;
+     delete m_containedMeasBases;
+     m_containedMeasBases = seg.m_containedMeasBases;
+     seg.m_containedMeasBases = nullptr;
+     m_author = seg.m_author;
+   }
+   return (*this);
+ } 
+
+
+
+
 unsigned int Trk::Segment::numberOfInstantiations()
 {
   return s_numberOfInstantiations;
diff --git a/Tracking/TrkEvent/TrkSegment/src/TrackSegment.cxx b/Tracking/TrkEvent/TrkSegment/src/TrackSegment.cxx
index 5f3bb155020..0fc9735461d 100755
--- a/Tracking/TrkEvent/TrkSegment/src/TrackSegment.cxx
+++ b/Tracking/TrkEvent/TrkSegment/src/TrackSegment.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 ///////////////////////////////////////////////////////////////////
@@ -46,15 +46,42 @@ Trk::Segment(locpars, locerr, crots, fqual,author),
 {
 }
 
+
+// move constructor
+Trk::TrackSegment::TrackSegment(Trk::TrackSegment&& tseg)
+     : Trk::Segment(tseg)
+{
+     m_associatedSurface = tseg.m_associatedSurface;
+     tseg.m_associatedSurface = nullptr;
+     m_globalPosition = tseg.m_globalPosition;
+     tseg.m_globalPosition = nullptr;
+}
+
+
+// move assignment operator
+Trk::TrackSegment& Trk::TrackSegment::operator=(Trk::TrackSegment&& tseg) {
+   if (this!=&tseg){
+     Trk::Segment::operator=(tseg);
+     delete m_associatedSurface;
+     m_associatedSurface = tseg.m_associatedSurface;
+     tseg.m_associatedSurface = nullptr;
+     delete m_globalPosition;
+     m_globalPosition = tseg.m_globalPosition;
+     tseg.m_globalPosition = nullptr;
+   }
+   return (*this);
+ }
+
+
+
 Trk::TrackSegment& Trk::TrackSegment::operator=(const Trk::TrackSegment& tseg)
 {
    if (this!=&tseg){
     // assingment operator of base class
-    Trk::Segment::operator=(tseg);
-    delete m_containedMeasBases;
+    Trk::Segment::operator=(tseg); 
     if (m_associatedSurface && !m_associatedSurface->associatedDetectorElement()) delete m_associatedSurface;
     delete m_globalPosition;
-    m_containedMeasBases = new DataVector<const Trk::MeasurementBase>;
+    
     if (tseg.m_associatedSurface){
        // copy only if surface is not one owned by a detector Element
        m_associatedSurface = (!tseg.m_associatedSurface->associatedDetectorElement()) ? tseg.m_associatedSurface->clone() : tseg.m_associatedSurface;
@@ -95,3 +122,4 @@ std::ostream& Trk::TrackSegment::dump( std::ostream& out ) const
     //TODO - out proper output (see MuonSegment) EJWM
     return out;
  }
+
-- 
GitLab