From 48a5f5517953e8ae16ee6cf511c715e3e8b97abf Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sat, 27 Feb 2016 17:29:21 -0500 Subject: [PATCH] More const qualifiers, for copying of tracks, and replacing in lists of tracks ... (the tracks may be const, not the list, when replacing) --- src/LabelTrack.cpp | 4 ++-- src/LabelTrack.h | 4 ++-- src/Menus.cpp | 4 ++-- src/NoteTrack.cpp | 2 +- src/NoteTrack.h | 2 +- src/Track.cpp | 18 +++++++++++------- src/Track.h | 7 ++++--- src/WaveClip.cpp | 2 +- src/WaveClip.h | 2 +- src/WaveTrack.cpp | 11 ++++++++--- src/WaveTrack.h | 3 ++- 11 files changed, 35 insertions(+), 24 deletions(-) diff --git a/src/LabelTrack.cpp b/src/LabelTrack.cpp index 58cc6bd1f..f78374f7f 100644 --- a/src/LabelTrack.cpp +++ b/src/LabelTrack.cpp @@ -1270,7 +1270,7 @@ void LabelStruct::MoveLabel( int iEdge, double fNewTime) } LabelStruct::TimeRelations LabelStruct::RegionRelation( - double reg_t0, double reg_t1, LabelTrack * WXUNUSED(parent)) + double reg_t0, double reg_t1, const LabelTrack * WXUNUSED(parent)) { bool retainLabels = false; @@ -2422,7 +2422,7 @@ bool LabelTrack::SplitCut(double t0, double t1, Track ** dest) } #endif -bool LabelTrack::Copy(double t0, double t1, Track ** dest) +bool LabelTrack::Copy(double t0, double t1, Track ** dest) const { *dest = new LabelTrack(GetDirManager()); int len = mLabels.Count(); diff --git a/src/LabelTrack.h b/src/LabelTrack.h index 83d3dfbd5..921d1d8bd 100644 --- a/src/LabelTrack.h +++ b/src/LabelTrack.h @@ -81,7 +81,7 @@ public: /// and end of parent to be within a region that borders them (this makes /// it possible to DELETE capture all labels with a Select All). TimeRelations RegionRelation(double reg_t0, double reg_t1, - LabelTrack *parent = NULL); + const LabelTrack *parent = NULL); public: SelectedRegion selectedRegion; @@ -157,7 +157,7 @@ class AUDACITY_DLL_API LabelTrack final : public Track // or Paste() because then it // is no longer recognised as a virtual function matching the // one in Track. - bool Copy (double t0, double t1, Track ** dest) override;// const; + bool Copy (double t0, double t1, Track ** dest) const override; bool Clear(double t0, double t1) override; bool Paste(double t, const Track * src) override; bool Repeat(double t0, double t1, int n); diff --git a/src/Menus.cpp b/src/Menus.cpp index 5fcd80ccf..77ca339ae 100644 --- a/src/Menus.cpp +++ b/src/Menus.cpp @@ -4592,7 +4592,7 @@ void AudacityProject::OnCutLabels() // Because of grouping the copy may need to operate on different tracks than // the clear, so we do these actions separately. - EditClipboardByLabel( &WaveTrack::Copy ); + EditClipboardByLabel( &WaveTrack::CopyNonconst ); if( gPrefs->Read( wxT( "/GUI/EnableCutLines" ), ( long )0 ) ) EditByLabel( &WaveTrack::ClearAndAddCutLine, true ); @@ -4635,7 +4635,7 @@ void AudacityProject::OnCopyLabels() if( mViewInfo.selectedRegion.isPoint() ) return; - EditClipboardByLabel( &WaveTrack::Copy ); + EditClipboardByLabel( &WaveTrack::CopyNonconst ); msClipProject = this; diff --git a/src/NoteTrack.cpp b/src/NoteTrack.cpp index ff778e1e6..6e92c2c14 100644 --- a/src/NoteTrack.cpp +++ b/src/NoteTrack.cpp @@ -469,7 +469,7 @@ bool NoteTrack::Cut(double t0, double t1, Track **dest){ return true; } -bool NoteTrack::Copy(double t0, double t1, Track **dest){ +bool NoteTrack::Copy(double t0, double t1, Track **dest) const { //dest goes onto clipboard *dest = NULL; // This is redundant and matches WaveTrack::Copy diff --git a/src/NoteTrack.h b/src/NoteTrack.h index c25b3632d..84436d471 100644 --- a/src/NoteTrack.h +++ b/src/NoteTrack.h @@ -90,7 +90,7 @@ class AUDACITY_DLL_API NoteTrack final : public Track { // High-level editing bool Cut (double t0, double t1, Track **dest) override; - bool Copy (double t0, double t1, Track **dest) override; + bool Copy (double t0, double t1, Track **dest) const override; bool Trim (double t0, double t1) /* not override */; bool Clear(double t0, double t1) override; bool Paste(double t, const Track *src) override; diff --git a/src/Track.cpp b/src/Track.cpp index 1de8e8685..05eccdc6b 100644 --- a/src/Track.cpp +++ b/src/Track.cpp @@ -132,7 +132,7 @@ Track::~Track() } -const TrackListNode *Track::GetNode() +const TrackListNode *Track::GetNode() const { return mNode; } @@ -837,18 +837,22 @@ void TrackList::AddToHead(Track * t) ResizedEvent(n); } -void TrackList::Replace(Track * t, Track * with, bool deletetrack) +void TrackList::Replace(const Track * t, const Track * with, bool deletetrack) { - if (t && with) { - TrackListNode *node = (TrackListNode *) t->GetNode(); + Track *const mutableT = const_cast(t); + Track *const mutableWith = const_cast(with); - t->SetOwner(NULL, NULL); + if (mutableT && with) { + TrackListNode *node = + const_cast(mutableT->GetNode()); + + mutableT->SetOwner(NULL, NULL); if (deletetrack) { delete t; } - node->t = with; - with->SetOwner(this, node); + node->t = mutableWith; + mutableWith->SetOwner(this, node); RecalcPositions(node); UpdatedEvent(node); ResizedEvent(node); diff --git a/src/Track.h b/src/Track.h index 811b80094..4fb666a98 100644 --- a/src/Track.h +++ b/src/Track.h @@ -102,7 +102,7 @@ class AUDACITY_DLL_API Track /* not final */ : public XMLTagHandler #endif Track *GetLink() const; - const TrackListNode *GetNode(); + const TrackListNode *GetNode() const; void SetOwner(TrackList *list, TrackListNode *node); // Keep in Track @@ -181,7 +181,7 @@ class AUDACITY_DLL_API Track /* not final */ : public XMLTagHandler DirManager* GetDirManager() const { return mDirManager; } virtual bool Cut (double WXUNUSED(t0), double WXUNUSED(t1), Track ** WXUNUSED(dest)) {return false;} - virtual bool Copy (double WXUNUSED(t0), double WXUNUSED(t1), Track ** WXUNUSED(dest)) {return false;} + virtual bool Copy (double WXUNUSED(t0), double WXUNUSED(t1), Track ** WXUNUSED(dest)) const {return false;} virtual bool Clear(double WXUNUSED(t0), double WXUNUSED(t1)) {return false;} virtual bool Paste(double WXUNUSED(t), const Track * WXUNUSED(src)) {return false;} @@ -385,7 +385,8 @@ class AUDACITY_DLL_API TrackList final : public wxEvtHandler void AddToHead(Track * t); /// Replace first track with second track - void Replace(Track * t, Track * with, bool deletetrack = false); + /// Non-const function of TrackList, but it can take pointers to const tracks + void Replace(const Track * t, const Track * with, bool deletetrack = false); /// Remove this Track or all children of this TrackList. void Remove(Track * t, bool deletetrack = false); diff --git a/src/WaveClip.cpp b/src/WaveClip.cpp index e00204dc1..964de70bb 100644 --- a/src/WaveClip.cpp +++ b/src/WaveClip.cpp @@ -1407,7 +1407,7 @@ void WaveClip::WriteXML(XMLWriter &xmlFile) xmlFile.EndTag(wxT("waveclip")); } -bool WaveClip::CreateFromCopy(double t0, double t1, WaveClip* other) +bool WaveClip::CreateFromCopy(double t0, double t1, const WaveClip* other) { sampleCount s0, s1; diff --git a/src/WaveClip.h b/src/WaveClip.h index bd8024819..1d46bb8fe 100644 --- a/src/WaveClip.h +++ b/src/WaveClip.h @@ -279,7 +279,7 @@ public: void MarkChanged() { mDirty++; } /// Create clip from copy, discarding previous information in the clip - bool CreateFromCopy(double t0, double t1, WaveClip* other); + bool CreateFromCopy(double t0, double t1, const WaveClip* other); /** Getting high-level data from the for screen display and clipping * calculations and Contrast */ diff --git a/src/WaveTrack.cpp b/src/WaveTrack.cpp index 82e263db1..134b36ba7 100644 --- a/src/WaveTrack.cpp +++ b/src/WaveTrack.cpp @@ -623,7 +623,7 @@ bool WaveTrack::Trim (double t0, double t1) -bool WaveTrack::Copy(double t0, double t1, Track **dest) +bool WaveTrack::Copy(double t0, double t1, Track **dest) const { *dest = NULL; @@ -636,9 +636,9 @@ bool WaveTrack::Copy(double t0, double t1, Track **dest) WaveClipList::compatibility_iterator it; - for (it=GetClipIterator(); it; it=it->GetNext()) + for (it = const_cast(this)->GetClipIterator(); it; it = it->GetNext()) { - WaveClip *clip = it->GetData(); + const WaveClip *clip = it->GetData(); if (t0 <= clip->GetStartTime() && t1 >= clip->GetEndTime()) { @@ -713,6 +713,11 @@ bool WaveTrack::Copy(double t0, double t1, Track **dest) return true; } +bool WaveTrack::CopyNonconst(double t0, double t1, Track **dest) +{ + return Copy(t0, t1, dest); +} + bool WaveTrack::Clear(double t0, double t1) { return HandleClear(t0, t1, false, false); diff --git a/src/WaveTrack.h b/src/WaveTrack.h index 5b4b24263..b2f670769 100644 --- a/src/WaveTrack.h +++ b/src/WaveTrack.h @@ -154,7 +154,8 @@ class AUDACITY_DLL_API WaveTrack final : public Track { // bool Cut(double t0, double t1, Track **dest) override; - bool Copy(double t0, double t1, Track **dest) override; + bool Copy(double t0, double t1, Track **dest) const override; + bool CopyNonconst(double t0, double t1, Track **dest) /* not override */; bool Clear(double t0, double t1) override; bool Paste(double t0, const Track *src) override; bool ClearAndPaste(double t0, double t1,