From f42a9537523f228ec0c56cd2eb6ce4f783d18d25 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Wed, 2 Mar 2016 14:37:47 -0500 Subject: [PATCH] Track duplication methods return unique_ptr, although some callers... ... simply release() them for now. --- src/LabelTrack.cpp | 4 ++-- src/LabelTrack.h | 3 ++- src/NoteTrack.cpp | 20 +++++++++----------- src/NoteTrack.h | 3 ++- src/Project.cpp | 7 +++---- src/TimeTrack.cpp | 4 ++-- src/TimeTrack.h | 4 +++- src/Track.cpp | 2 +- src/Track.h | 4 +++- src/UndoManager.cpp | 4 ++-- src/WaveTrack.cpp | 6 +++--- src/WaveTrack.h | 5 ++++- src/effects/Effect.cpp | 2 +- src/toolbars/ControlToolBar.cpp | 4 ++-- 14 files changed, 39 insertions(+), 33 deletions(-) diff --git a/src/LabelTrack.cpp b/src/LabelTrack.cpp index f78374f7f..e24f256e7 100644 --- a/src/LabelTrack.cpp +++ b/src/LabelTrack.cpp @@ -1136,9 +1136,9 @@ double LabelTrack::GetEndTime() const return end; } -Track *LabelTrack::Duplicate() const +Track::Holder LabelTrack::Duplicate() const { - return new LabelTrack(*this); + return std::make_unique( *this ); } void LabelTrack::SetSelected(bool s) diff --git a/src/LabelTrack.h b/src/LabelTrack.h index 921d1d8bd..e5ecddc6e 100644 --- a/src/LabelTrack.h +++ b/src/LabelTrack.h @@ -139,7 +139,8 @@ class AUDACITY_DLL_API LabelTrack final : public Track double GetStartTime() const override; double GetEndTime() const override; - Track *Duplicate() const override; + using Holder = std::unique_ptr; + Track::Holder Duplicate() const override; void SetSelected(bool s) override; diff --git a/src/NoteTrack.cpp b/src/NoteTrack.cpp index 6e92c2c14..29408d1b8 100644 --- a/src/NoteTrack.cpp +++ b/src/NoteTrack.cpp @@ -135,9 +135,9 @@ NoteTrack::~NoteTrack() } } -Track *NoteTrack::Duplicate() const +Track::Holder NoteTrack::Duplicate() const { - NoteTrack *duplicate = new NoteTrack(mDirManager); + auto duplicate = std::make_unique(mDirManager); duplicate->Init(*this); // Duplicate on NoteTrack moves data from mSeq to mSerializationBuffer // and from mSerializationBuffer to mSeq on alternate calls. Duplicate @@ -169,7 +169,7 @@ Track *NoteTrack::Duplicate() const #ifdef EXPERIMENTAL_MIDI_OUT duplicate->SetGain(GetGain()); #endif - return duplicate; + return std::move(duplicate); } @@ -196,10 +196,10 @@ void NoteTrack::WarpAndTransposeNotes(double t0, double t1, // Since this is a duplicate and duplicates convert mSeq to // a text string for saving as XML, we probably have to // duplicate again to get back an mSeq - NoteTrack *nt = this; - double offset = nt->GetOffset(); // track is shifted this amount + double offset = this->GetOffset(); // track is shifted this amount if (!mSeq) { // replace saveme with an (unserialized) duplicate - nt = (NoteTrack *) this->Duplicate(); + Track::Holder unt{ Duplicate() }; + const auto nt = static_cast(unt.get()); wxASSERT(!mSeq && nt->mSeq && !nt->mSerializationBuffer); // swap mSeq and Buffer between this and nt nt->mSerializationBuffer = mSerializationBuffer; @@ -208,7 +208,6 @@ void NoteTrack::WarpAndTransposeNotes(double t0, double t1, mSerializationLength = 0; mSeq = nt->mSeq; nt->mSeq = NULL; - delete nt; // delete the duplicate } mSeq->convert_to_seconds(); // make sure time units are right t1 -= offset; // adjust time range to compensate for track offset @@ -821,9 +820,11 @@ void NoteTrack::WriteXML(XMLWriter &xmlFile) // NoteTrack.) In this case, mSeq will be NULL. To avoid a crash // and perform WriteXML, we may need to restore NoteTracks from binary // blobs to regular data structures (with an Alg_seq member). + Track::Holder holder; NoteTrack *saveme = this; if (!mSeq) { // replace saveme with an (unserialized) duplicate - saveme = (NoteTrack *) this->Duplicate(); + holder = Duplicate(); + saveme = static_cast(holder.get()); assert(saveme->mSeq); } saveme->mSeq->write(data, true); @@ -841,9 +842,6 @@ void NoteTrack::WriteXML(XMLWriter &xmlFile) xmlFile.WriteAttr(wxT("bottomnote"), saveme->mBottomNote); xmlFile.WriteAttr(wxT("data"), wxString(data.str().c_str(), wxConvUTF8)); xmlFile.EndTag(wxT("notetrack")); - if (this != saveme) { - delete saveme; // DELETE the duplicate - } } void NoteTrack::StartVScroll() diff --git a/src/NoteTrack.h b/src/NoteTrack.h index 84436d471..f7c8077ed 100644 --- a/src/NoteTrack.h +++ b/src/NoteTrack.h @@ -57,7 +57,8 @@ class AUDACITY_DLL_API NoteTrack final : public Track { NoteTrack(DirManager * projDirManager); virtual ~NoteTrack(); - Track *Duplicate() const override; + using Holder = std::unique_ptr; + Track::Holder Duplicate() const override; int GetKind() const override { return Note; } diff --git a/src/Project.cpp b/src/Project.cpp index 6350d64ae..9c82a0693 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -2751,7 +2751,7 @@ void AudacityProject::OpenFile(const wxString &fileNameArg, bool addtohistory) } } - mLastSavedTracks->Add(t->Duplicate()); + mLastSavedTracks->Add(t->Duplicate().release()); t = iter.Next(); } @@ -3549,7 +3549,7 @@ bool AudacityProject::Save(bool overwrite /* = true */ , Track *t = iter.First(); Track *dupT; while (t) { - dupT = t->Duplicate(); + dupT = t->Duplicate().release(); mLastSavedTracks->Add(dupT); //only after the xml has been saved we can mark it saved. @@ -4066,8 +4066,7 @@ void AudacityProject::PopState(const UndoState &state) while (t) { - copyTrack=t->Duplicate(); - mTracks->Add(copyTrack); + mTracks->Add(copyTrack = t->Duplicate().release()); //add the track to OD if the manager exists. later we might do a more rigorous check... if (copyTrack->GetKind() == Track::Wave) diff --git a/src/TimeTrack.cpp b/src/TimeTrack.cpp index ce1dbb0e1..8749afdbf 100644 --- a/src/TimeTrack.cpp +++ b/src/TimeTrack.cpp @@ -109,9 +109,9 @@ TimeTrack::~TimeTrack() delete mRuler; } -Track *TimeTrack::Duplicate() const +Track::Holder TimeTrack::Duplicate() const { - return new TimeTrack(*this); + return std::make_unique(*this); } bool TimeTrack::GetInterpolateLog() const diff --git a/src/TimeTrack.h b/src/TimeTrack.h index 506b434b2..c5dd239d8 100644 --- a/src/TimeTrack.h +++ b/src/TimeTrack.h @@ -132,7 +132,9 @@ class TimeTrack final : public Track { * @param orig the TimeTrack to copy from */ void Init(const TimeTrack &orig); - Track *Duplicate() const override; + + using Holder = std::unique_ptr; + Track::Holder Duplicate() const override; friend class TrackFactory; diff --git a/src/Track.cpp b/src/Track.cpp index c43942123..ddc1f4ab4 100644 --- a/src/Track.cpp +++ b/src/Track.cpp @@ -746,7 +746,7 @@ void TrackList::DoAssign(const TrackList &that) mDestructorDeletesTracks = true; TrackListConstIterator it(&that); for (const Track *track = it.First(); track; track = it.Next()) - Add(track->Duplicate()); + Add(track->Duplicate().release()); } void TrackList::Swap(TrackList &that) diff --git a/src/Track.h b/src/Track.h index d10da410d..4a0bfa0b7 100644 --- a/src/Track.h +++ b/src/Track.h @@ -165,7 +165,9 @@ class AUDACITY_DLL_API Track /* not final */ : public XMLTagHandler virtual ~ Track(); void Init(const Track &orig); - virtual Track *Duplicate() const = 0; + + using Holder = std::unique_ptr; + virtual Holder Duplicate() const = 0; // Called when this track is merged to stereo with another, and should // take on some paramaters of its partner. diff --git a/src/UndoManager.cpp b/src/UndoManager.cpp index 30dc26271..8aad8cd35 100644 --- a/src/UndoManager.cpp +++ b/src/UndoManager.cpp @@ -214,7 +214,7 @@ void UndoManager::ModifyState(const TrackList * l, TrackListConstIterator iter(l); const Track *t = iter.First(); while (t) { - tracksCopy->Add(t->Duplicate()); + tracksCopy->Add(t->Duplicate().release()); t = iter.Next(); } @@ -259,7 +259,7 @@ void UndoManager::PushState(const TrackList * l, TrackListConstIterator iter(l); const Track *t = iter.First(); while (t) { - tracksCopy->Add(t->Duplicate()); + tracksCopy->Add(t->Duplicate().release()); t = iter.Next(); } diff --git a/src/WaveTrack.cpp b/src/WaveTrack.cpp index 064931fca..f95992e29 100644 --- a/src/WaveTrack.cpp +++ b/src/WaveTrack.cpp @@ -65,7 +65,7 @@ bool WaveTrack::mMonoAsVirtualStereo; WaveTrack* TrackFactory::DuplicateWaveTrack(WaveTrack &orig) { - return (WaveTrack*)(orig.Duplicate()); + return (WaveTrack*)(orig.Duplicate().release()); } @@ -355,9 +355,9 @@ void WaveTrack::SetSpectrumBounds(float min, float max) const mSpectrumMax = max; } -Track *WaveTrack::Duplicate() const +Track::Holder WaveTrack::Duplicate() const { - return new WaveTrack(*this); + return Track::Holder{ safenew WaveTrack{ *this } }; } double WaveTrack::GetRate() const diff --git a/src/WaveTrack.h b/src/WaveTrack.h index e664beaf6..5e9d4216a 100644 --- a/src/WaveTrack.h +++ b/src/WaveTrack.h @@ -75,7 +75,9 @@ class AUDACITY_DLL_API WaveTrack final : public Track { WaveTrack(const WaveTrack &orig); void Init(const WaveTrack &orig); - virtual Track *Duplicate() const override; + + Track::Holder Duplicate() const override; + #ifdef EXPERIMENTAL_OUTPUT_DISPLAY void VirtualStereoInit(); #endif @@ -87,6 +89,7 @@ class AUDACITY_DLL_API WaveTrack final : public Track { #endif typedef WaveTrackLocation Location; + using Holder = std::unique_ptr; virtual ~WaveTrack(); double GetOffset() const override; diff --git a/src/effects/Effect.cpp b/src/effects/Effect.cpp index 3c234179a..770444abb 100644 --- a/src/effects/Effect.cpp +++ b/src/effects/Effect.cpp @@ -2117,7 +2117,7 @@ void Effect::CopyInputTracks(int trackType) if (aTrack->GetSelected() || (trackType == Track::All && aTrack->IsSyncLockSelected())) { - Track *o = aTrack->Duplicate(); + Track *o = aTrack->Duplicate().release(); mOutputTracks->Add(o); mIMap.Add(aTrack); mOMap.Add(o); diff --git a/src/toolbars/ControlToolBar.cpp b/src/toolbars/ControlToolBar.cpp index ac40bc819..130785904 100644 --- a/src/toolbars/ControlToolBar.cpp +++ b/src/toolbars/ControlToolBar.cpp @@ -1098,11 +1098,11 @@ void ControlToolBar::SetupCutPreviewTracks(double WXUNUSED(playStart), double cu if (track1) { // Duplicate and change tracks - track1 = track1->Duplicate(); + track1 = track1->Duplicate().release(); track1->Clear(cutStart, cutEnd); if (track2) { - track2 = track2->Duplicate(); + track2 = track2->Duplicate().release(); track2->Clear(cutStart, cutEnd); }