1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-10-25 15:53:52 +02:00

Simplify iterations over cutlines in WaveClip.cpp; stl idioms

This commit is contained in:
Paul Licameli
2016-02-20 02:00:00 -05:00
committed by Paul Licameli
parent 77a3647922
commit bd57f6392f

View File

@@ -321,8 +321,8 @@ WaveClip::WaveClip(const WaveClip& orig, DirManager *projDirManager)
mSpecCache = std::make_unique<SpecCache>(); mSpecCache = std::make_unique<SpecCache>();
mSpecPxCache = std::make_unique<SpecPxCache>(1); mSpecPxCache = std::make_unique<SpecPxCache>(1);
for (WaveClipList::compatibility_iterator it=orig.mCutLines.GetFirst(); it; it=it->GetNext()) for (const auto &clip: orig.mCutLines)
mCutLines.Append(new WaveClip(*it->GetData(), projDirManager)); mCutLines.push_back(new WaveClip(*clip, projDirManager));
mAppendBufferLen = 0; mAppendBufferLen = 0;
mDirty = 0; mDirty = 0;
@@ -331,8 +331,9 @@ WaveClip::WaveClip(const WaveClip& orig, DirManager *projDirManager)
WaveClip::~WaveClip() WaveClip::~WaveClip()
{ {
mCutLines.DeleteContents(true); for (const auto &clip : mCutLines)
mCutLines.Clear(); delete clip;
mCutLines.clear();
} }
void WaveClip::SetOffset(double offset) void WaveClip::SetOffset(double offset)
@@ -1365,7 +1366,7 @@ XMLTagHandler *WaveClip::HandleXMLChild(const wxChar *tag)
// Nested wave clips are cut lines // Nested wave clips are cut lines
WaveClip *newCutLine = new WaveClip(mSequence->GetDirManager(), WaveClip *newCutLine = new WaveClip(mSequence->GetDirManager(),
mSequence->GetSampleFormat(), mRate); mSequence->GetSampleFormat(), mRate);
mCutLines.Append(newCutLine); mCutLines.push_back(newCutLine);
return newCutLine; return newCutLine;
} else } else
return NULL; return NULL;
@@ -1379,8 +1380,8 @@ void WaveClip::WriteXML(XMLWriter &xmlFile)
mSequence->WriteXML(xmlFile); mSequence->WriteXML(xmlFile);
mEnvelope->WriteXML(xmlFile); mEnvelope->WriteXML(xmlFile);
for (WaveClipList::compatibility_iterator it=mCutLines.GetFirst(); it; it=it->GetNext()) for (const auto &clip: mCutLines)
it->GetData()->WriteXML(xmlFile); clip->WriteXML(xmlFile);
xmlFile.EndTag(wxT("waveclip")); xmlFile.EndTag(wxT("waveclip"));
} }
@@ -1444,13 +1445,12 @@ bool WaveClip::Paste(double t0, const WaveClip* other)
OffsetCutLines(t0, pastedClip->GetEndTime() - pastedClip->GetStartTime()); OffsetCutLines(t0, pastedClip->GetEndTime() - pastedClip->GetStartTime());
// Paste cut lines contained in pasted clip // Paste cut lines contained in pasted clip
for (WaveClipList::compatibility_iterator it = pastedClip->mCutLines.GetFirst(); it; it=it->GetNext()) for (const auto &cutline: pastedClip->mCutLines)
{ {
WaveClip* cutline = it->GetData();
WaveClip* newCutLine = new WaveClip(*cutline, WaveClip* newCutLine = new WaveClip(*cutline,
mSequence->GetDirManager()); mSequence->GetDirManager());
newCutLine->Offset(t0 - mOffset); newCutLine->Offset(t0 - mOffset);
mCutLines.Append(newCutLine); mCutLines.push_back(newCutLine);
} }
result = true; result = true;
@@ -1505,22 +1505,24 @@ bool WaveClip::Clear(double t0, double t1)
if (clip_t1 > GetEndTime()) if (clip_t1 > GetEndTime())
clip_t1 = GetEndTime(); clip_t1 = GetEndTime();
WaveClipList::compatibility_iterator nextIt; // May delete as we iterate, so don't use range-for
for (auto it = mCutLines.begin(); it != mCutLines.end();)
for (WaveClipList::compatibility_iterator it = mCutLines.GetFirst(); it; it=nextIt)
{ {
nextIt = it->GetNext(); WaveClip* clip = *it;
WaveClip* clip = it->GetData();
double cutlinePosition = mOffset + clip->GetOffset(); double cutlinePosition = mOffset + clip->GetOffset();
if (cutlinePosition >= t0 && cutlinePosition <= t1) if (cutlinePosition >= t0 && cutlinePosition <= t1)
{ {
// This cutline is within the area, DELETE it // This cutline is within the area, DELETE it
delete clip; delete clip;
mCutLines.DeleteNode(it); it = mCutLines.erase(it);
} else }
if (cutlinePosition >= t1) else
{ {
clip->Offset(clip_t0-clip_t1); if (cutlinePosition >= t1)
{
clip->Offset(clip_t0 - clip_t1);
}
++it;
} }
} }
@@ -1556,22 +1558,24 @@ bool WaveClip::ClearAndAddCutLine(double t0, double t1)
newClip->SetOffset(clip_t0-mOffset); newClip->SetOffset(clip_t0-mOffset);
// Sort out cutlines that belong to the NEW cutline // Sort out cutlines that belong to the NEW cutline
WaveClipList::compatibility_iterator nextIt; // May delete as we iterate, so don't use range-for
for (auto it = mCutLines.begin(); it != mCutLines.end();)
for (WaveClipList::compatibility_iterator it = mCutLines.GetFirst(); it; it=nextIt)
{ {
nextIt = it->GetNext(); WaveClip* clip = *it;
WaveClip* clip = it->GetData();
double cutlinePosition = mOffset + clip->GetOffset(); double cutlinePosition = mOffset + clip->GetOffset();
if (cutlinePosition >= t0 && cutlinePosition <= t1) if (cutlinePosition >= t0 && cutlinePosition <= t1)
{ {
clip->SetOffset(cutlinePosition - newClip->GetOffset() - mOffset); clip->SetOffset(cutlinePosition - newClip->GetOffset() - mOffset);
newClip->mCutLines.Append(clip); newClip->mCutLines.push_back(clip);
mCutLines.DeleteNode(it); it = mCutLines.erase(it);
} else }
if (cutlinePosition >= t1) else
{ {
clip->Offset(clip_t0-clip_t1); if (cutlinePosition >= t1)
{
clip->Offset(clip_t0 - clip_t1);
}
++it;
} }
} }
@@ -1590,9 +1594,10 @@ bool WaveClip::ClearAndAddCutLine(double t0, double t1)
MarkChanged(); MarkChanged();
mCutLines.Append(newClip); mCutLines.push_back(newClip);
return true; return true;
} else }
else
{ {
delete newClip; delete newClip;
return false; return false;
@@ -1603,9 +1608,8 @@ bool WaveClip::FindCutLine(double cutLinePosition,
double* cutlineStart /* = NULL */, double* cutlineStart /* = NULL */,
double* cutlineEnd /* = NULL */) double* cutlineEnd /* = NULL */)
{ {
for (WaveClipList::compatibility_iterator it = mCutLines.GetFirst(); it; it=it->GetNext()) for (const auto &cutline: mCutLines)
{ {
WaveClip* cutline = it->GetData();
if (fabs(mOffset + cutline->GetOffset() - cutLinePosition) < 0.0001) if (fabs(mOffset + cutline->GetOffset() - cutLinePosition) < 0.0001)
{ {
if (cutlineStart) if (cutlineStart)
@@ -1621,15 +1625,15 @@ bool WaveClip::FindCutLine(double cutLinePosition,
bool WaveClip::ExpandCutLine(double cutLinePosition) bool WaveClip::ExpandCutLine(double cutLinePosition)
{ {
for (WaveClipList::compatibility_iterator it = mCutLines.GetFirst(); it; it=it->GetNext()) for (auto it = mCutLines.begin(); it != mCutLines.end(); ++it)
{ {
WaveClip* cutline = it->GetData(); const auto &cutline = *it;
if (fabs(mOffset + cutline->GetOffset() - cutLinePosition) < 0.0001) if (fabs(mOffset + cutline->GetOffset() - cutLinePosition) < 0.0001)
{ {
if (!Paste(mOffset+cutline->GetOffset(), cutline)) if (!Paste(mOffset+cutline->GetOffset(), cutline))
return false; return false;
delete cutline; delete cutline;
mCutLines.DeleteNode(it); mCutLines.erase(it);
return true; return true;
} }
} }
@@ -1639,12 +1643,13 @@ bool WaveClip::ExpandCutLine(double cutLinePosition)
bool WaveClip::RemoveCutLine(double cutLinePosition) bool WaveClip::RemoveCutLine(double cutLinePosition)
{ {
for (WaveClipList::compatibility_iterator it = mCutLines.GetFirst(); it; it=it->GetNext()) for (auto it = mCutLines.begin(); it != mCutLines.end(); ++it)
{ {
if (fabs(mOffset + it->GetData()->GetOffset() - cutLinePosition) < 0.0001) const auto &cutline = *it;
if (fabs(mOffset + cutline->GetOffset() - cutLinePosition) < 0.0001)
{ {
delete it->GetData(); delete cutline;
mCutLines.DeleteNode(it); mCutLines.erase(it);
return true; return true;
} }
} }
@@ -1654,19 +1659,15 @@ bool WaveClip::RemoveCutLine(double cutLinePosition)
void WaveClip::RemoveAllCutLines() void WaveClip::RemoveAllCutLines()
{ {
while (!mCutLines.IsEmpty()) for (const auto &cutLine : mCutLines)
{ delete cutLine;
WaveClipList::compatibility_iterator head = mCutLines.GetFirst(); mCutLines.clear();
delete head->GetData();
mCutLines.DeleteNode(head);
}
} }
void WaveClip::OffsetCutLines(double t0, double len) void WaveClip::OffsetCutLines(double t0, double len)
{ {
for (WaveClipList::compatibility_iterator it = mCutLines.GetFirst(); it; it=it->GetNext()) for (const auto &cutLine : mCutLines)
{ {
WaveClip* cutLine = it->GetData();
if (mOffset + cutLine->GetOffset() >= t0) if (mOffset + cutLine->GetOffset() >= t0)
cutLine->Offset(len); cutLine->Offset(len);
} }
@@ -1675,22 +1676,22 @@ void WaveClip::OffsetCutLines(double t0, double len)
void WaveClip::Lock() void WaveClip::Lock()
{ {
GetSequence()->Lock(); GetSequence()->Lock();
for (WaveClipList::compatibility_iterator it = mCutLines.GetFirst(); it; it=it->GetNext()) for (const auto &cutline: mCutLines)
it->GetData()->Lock(); cutline->Lock();
} }
void WaveClip::CloseLock() void WaveClip::CloseLock()
{ {
GetSequence()->CloseLock(); GetSequence()->CloseLock();
for (WaveClipList::compatibility_iterator it = mCutLines.GetFirst(); it; it=it->GetNext()) for (const auto &cutline: mCutLines)
it->GetData()->CloseLock(); cutline->CloseLock();
} }
void WaveClip::Unlock() void WaveClip::Unlock()
{ {
GetSequence()->Unlock(); GetSequence()->Unlock();
for (WaveClipList::compatibility_iterator it = mCutLines.GetFirst(); it; it=it->GetNext()) for (const auto &cutline: mCutLines)
it->GetData()->Unlock(); cutline->Unlock();
} }
void WaveClip::SetRate(int rate) void WaveClip::SetRate(int rate)