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