From 79191d985d4958312e1567d0691b50648eb495d7 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sun, 18 Nov 2018 20:15:26 -0500 Subject: [PATCH] Separate Track::Clone (protected virtual) from Track::Duplicate --- src/LabelTrack.cpp | 2 +- src/LabelTrack.h | 5 ++++- src/NoteTrack.cpp | 4 ++-- src/NoteTrack.h | 7 +++++-- src/TimeTrack.cpp | 2 +- src/TimeTrack.h | 4 +++- src/Track.cpp | 10 ++++++++++ src/Track.h | 7 ++++++- src/WaveTrack.cpp | 2 +- src/WaveTrack.h | 2 +- 10 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/LabelTrack.cpp b/src/LabelTrack.cpp index d85dd4db0..b56abd4a3 100644 --- a/src/LabelTrack.cpp +++ b/src/LabelTrack.cpp @@ -1171,7 +1171,7 @@ double LabelTrack::GetEndTime() const return end; } -Track::Holder LabelTrack::Duplicate() const +Track::Holder LabelTrack::Clone() const { return std::make_shared( *this ); } diff --git a/src/LabelTrack.h b/src/LabelTrack.h index 96c839ca0..ae0b4488a 100644 --- a/src/LabelTrack.h +++ b/src/LabelTrack.h @@ -156,8 +156,11 @@ class AUDACITY_DLL_API LabelTrack final : public Track double GetEndTime() const override; using Holder = std::shared_ptr; - Track::Holder Duplicate() const override; + +private: + Track::Holder Clone() const override; +public: void SetSelected(bool s) override; bool HandleXMLTag(const wxChar *tag, const wxChar **attrs) override; diff --git a/src/NoteTrack.cpp b/src/NoteTrack.cpp index ef5b3527c..8e63380dd 100644 --- a/src/NoteTrack.cpp +++ b/src/NoteTrack.cpp @@ -163,7 +163,7 @@ Alg_seq &NoteTrack::GetSeq() const return *mSeq; } -Track::Holder NoteTrack::Duplicate() const +Track::Holder NoteTrack::Clone() const { auto duplicate = std::make_shared(mDirManager); duplicate->Init(*this); @@ -925,7 +925,7 @@ void NoteTrack::WriteXML(XMLWriter &xmlFile) const if (!mSeq) { // replace saveme with an (unserialized) duplicate, which is // destroyed at end of function. - holder = Duplicate(); + holder = Clone(); saveme = static_cast(holder.get()); } saveme->GetSeq().write(data, true); diff --git a/src/NoteTrack.h b/src/NoteTrack.h index 2fccefff4..a47f56629 100644 --- a/src/NoteTrack.h +++ b/src/NoteTrack.h @@ -67,7 +67,7 @@ class StretchHandle; class AUDACITY_DLL_API NoteTrack final : public NoteTrackBase { - public: +public: NoteTrack(const std::shared_ptr &projDirManager); virtual ~NoteTrack(); @@ -77,8 +77,11 @@ class AUDACITY_DLL_API NoteTrack final override; using Holder = std::shared_ptr; - Track::Holder Duplicate() const override; + +private: + Track::Holder Clone() const override; +public: double GetOffset() const override; double GetStartTime() const override; double GetEndTime() const override; diff --git a/src/TimeTrack.cpp b/src/TimeTrack.cpp index 73af3310c..f7d2d97b7 100644 --- a/src/TimeTrack.cpp +++ b/src/TimeTrack.cpp @@ -177,7 +177,7 @@ void TimeTrack::InsertSilence(double t, double len) mEnvelope->InsertSpace(t, len); } -Track::Holder TimeTrack::Duplicate() const +Track::Holder TimeTrack::Clone() const { return std::make_shared(*this); } diff --git a/src/TimeTrack.h b/src/TimeTrack.h index 5c1e1fac1..ca0c049a4 100644 --- a/src/TimeTrack.h +++ b/src/TimeTrack.h @@ -118,7 +118,9 @@ class TimeTrack final : public Track { void Init(const TimeTrack &orig); using Holder = std::unique_ptr; - Track::Holder Duplicate() const override; + +private: + Track::Holder Clone() const override; friend class TrackFactory; diff --git a/src/Track.cpp b/src/Track.cpp index 03d89fd2e..81009df98 100644 --- a/src/Track.cpp +++ b/src/Track.cpp @@ -115,6 +115,16 @@ void Track::Merge(const Track &orig) mSelected = orig.mSelected; } +Track::Holder Track::Duplicate() const +{ + // invoke "virtual constructor" to copy track object proper: + auto result = Clone(); + + // other steps to be added here + + return result; +} + Track::~Track() { } diff --git a/src/Track.h b/src/Track.h index 1697ae8c1..19f8bf40e 100644 --- a/src/Track.h +++ b/src/Track.h @@ -370,7 +370,8 @@ private: void Init(const Track &orig); using Holder = std::shared_ptr; - virtual Holder Duplicate() const = 0; + // public nonvirtual duplication function that invokes Clone(): + virtual Holder Duplicate() const; // Called when this track is merged to stereo with another, and should // take on some paramaters of its partner. @@ -431,6 +432,10 @@ public: virtual void InsertSilence(double WXUNUSED(t), double WXUNUSED(len)) = 0; private: + // Subclass responsibility implements only a part of Duplicate(), copying + // the track data proper (not associated data such as for groups and views): + virtual Holder Clone() const = 0; + virtual TrackKind GetKind() const { return TrackKind::None; } template diff --git a/src/WaveTrack.cpp b/src/WaveTrack.cpp index b2fb5c4b2..7fc301a8e 100644 --- a/src/WaveTrack.cpp +++ b/src/WaveTrack.cpp @@ -401,7 +401,7 @@ int WaveTrack::ZeroLevelYCoordinate(wxRect rect) const (int)((mDisplayMax / (mDisplayMax - mDisplayMin)) * rect.height); } -Track::Holder WaveTrack::Duplicate() const +Track::Holder WaveTrack::Clone() const { return std::make_shared( *this ); } diff --git a/src/WaveTrack.h b/src/WaveTrack.h index 2d434ebef..4a4fa0b44 100644 --- a/src/WaveTrack.h +++ b/src/WaveTrack.h @@ -95,7 +95,7 @@ public: private: void Init(const WaveTrack &orig); - Track::Holder Duplicate() const override; + Track::Holder Clone() const override; friend class TrackFactory;