Define and use const version of WaveTrack::GetAllClips

This commit is contained in:
Paul Licameli 2019-04-25 16:23:51 -04:00
parent 3e5bfa0c12
commit c09edbb18a
4 changed files with 56 additions and 12 deletions

View File

@ -78,18 +78,18 @@ UndoManager::~UndoManager()
namespace {
SpaceArray::value_type
CalculateUsage(TrackList *tracks, Set *seen)
CalculateUsage(const TrackList &tracks, Set *seen)
{
SpaceArray::value_type result = 0;
//TIMER_START( "CalculateSpaceUsage", space_calc );
for (auto wt : tracks->Any< WaveTrack >())
for (auto wt : tracks.Any< const WaveTrack >())
{
// Scan all clips within current track
for(const auto &clip : wt->GetAllClips())
{
// Scan all blockfiles within current clip
BlockArray *blocks = clip->GetSequenceBlockArray();
auto blocks = clip->GetSequenceBlockArray();
for (const auto &block : *blocks)
{
const auto &file = block.f;
@ -137,12 +137,12 @@ void UndoManager::CalculateSpaceUsage()
for (size_t nn = stack.size(); nn--;)
{
// Scan all tracks at current level
auto tracks = stack[nn]->state.tracks.get();
auto &tracks = *stack[nn]->state.tracks;
space[nn] = CalculateUsage(tracks, &seen);
}
mClipboardSpaceUsage = CalculateUsage
(AudacityProject::GetClipboardTracks(), nullptr);
mClipboardSpaceUsage = CalculateUsage(
*AudacityProject::GetClipboardTracks(), nullptr);
//TIMER_STOP( space_calc );
}

View File

@ -416,6 +416,11 @@ BlockArray* WaveClip::GetSequenceBlockArray()
return &mSequence->GetBlockArray();
}
const BlockArray* WaveClip::GetSequenceBlockArray() const
{
return &mSequence->GetBlockArray();
}
double WaveClip::GetStartTime() const
{
// JS: mOffset is the minimum value and it is returned; no clipping to 0

View File

@ -238,6 +238,7 @@ public:
Envelope* GetEnvelope() { return mEnvelope.get(); }
const Envelope* GetEnvelope() const { return mEnvelope.get(); }
BlockArray* GetSequenceBlockArray();
const BlockArray* GetSequenceBlockArray() const;
// Get low-level access to the sequence. Whenever possible, don't use this,
// but use more high-level functions inside WaveClip (or add them if you

View File

@ -374,7 +374,7 @@ private:
const WaveClipConstHolders &GetClips() const
{ return reinterpret_cast< const WaveClipConstHolders& >( mClips ); }
// Get access to all clips (in some unspecified sequence),
// Get mutative access to all clips (in some unspecified sequence),
// including those hidden in cutlines.
class AllClipsIterator
: public ValueIterator< WaveClip * >
@ -400,12 +400,12 @@ private:
AllClipsIterator &operator ++ ();
// Define == well enough to serve for loop termination test
friend bool operator ==
(const AllClipsIterator &a, const AllClipsIterator &b)
friend bool operator == (
const AllClipsIterator &a, const AllClipsIterator &b)
{ return a.mStack.empty() == b.mStack.empty(); }
friend bool operator !=
(const AllClipsIterator &a, const AllClipsIterator &b)
friend bool operator != (
const AllClipsIterator &a, const AllClipsIterator &b)
{ return !( a == b ); }
private:
@ -419,11 +419,49 @@ private:
Stack mStack;
};
// Get const access to all clips (in some unspecified sequence),
// including those hidden in cutlines.
class AllClipsConstIterator
: public ValueIterator< const WaveClip * >
{
public:
// Constructs an "end" iterator
AllClipsConstIterator () {}
// Construct a "begin" iterator
explicit AllClipsConstIterator( const WaveTrack &track )
: mIter{ const_cast< WaveTrack& >( track ) }
{}
const WaveClip *operator * () const
{ return *mIter; }
AllClipsConstIterator &operator ++ ()
{ ++mIter; return *this; }
// Define == well enough to serve for loop termination test
friend bool operator == (
const AllClipsConstIterator &a, const AllClipsConstIterator &b)
{ return a.mIter == b.mIter; }
friend bool operator != (
const AllClipsConstIterator &a, const AllClipsConstIterator &b)
{ return !( a == b ); }
private:
AllClipsIterator mIter;
};
IteratorRange< AllClipsIterator > GetAllClips()
{
return { AllClipsIterator{ *this }, AllClipsIterator{ } };
}
IteratorRange< AllClipsConstIterator > GetAllClips() const
{
return { AllClipsConstIterator{ *this }, AllClipsConstIterator{ } };
}
// Create NEW clip and add it to this track. Returns a pointer
// to the newly created clip.
WaveClip* CreateClip();