mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-17 16:40:07 +02:00
Thanks for nothing, MSVC std::list<T>::iterator implementation...
... I worked around the unhelpful helps that made gratuitous runtime errors, in debug builds but not in release.
This commit is contained in:
parent
e094dcbaf2
commit
bab8ea8393
@ -2911,7 +2911,7 @@ void AudacityProject::SortTracks(int flags)
|
|||||||
int cmpValue;
|
int cmpValue;
|
||||||
// This one place outside of TrackList where we must use undisguised
|
// This one place outside of TrackList where we must use undisguised
|
||||||
// std::list iterators! Avoid this elsewhere!
|
// std::list iterators! Avoid this elsewhere!
|
||||||
std::vector<ListOfTracks::iterator> arr;
|
std::vector<TrackNodePointer> arr;
|
||||||
arr.reserve(mTracks->size());
|
arr.reserve(mTracks->size());
|
||||||
bool lastTrackLinked = false;
|
bool lastTrackLinked = false;
|
||||||
//sort by linked tracks. Assumes linked track follows owner in list.
|
//sort by linked tracks. Assumes linked track follows owner in list.
|
||||||
@ -2927,7 +2927,7 @@ void AudacityProject::SortTracks(int flags)
|
|||||||
else {
|
else {
|
||||||
bool bArrayTrackLinked = false;
|
bool bArrayTrackLinked = false;
|
||||||
for (ndx = 0; ndx < arr.size(); ++ndx) {
|
for (ndx = 0; ndx < arr.size(); ++ndx) {
|
||||||
Track &arrTrack = **arr[ndx];
|
Track &arrTrack = **arr[ndx].first;
|
||||||
// Don't insert between channels of a stereo track!
|
// Don't insert between channels of a stereo track!
|
||||||
if( bArrayTrackLinked ){
|
if( bArrayTrackLinked ){
|
||||||
bArrayTrackLinked = false;
|
bArrayTrackLinked = false;
|
||||||
@ -2968,7 +2968,7 @@ void AudacityProject::SortTracks(int flags)
|
|||||||
time2 = std::min(time2, tempTime);
|
time2 = std::min(time2, tempTime);
|
||||||
if(tempTrack->GetLinked() && (ndx+candidatesLookedAt < arr.size()-1) ) {
|
if(tempTrack->GetLinked() && (ndx+candidatesLookedAt < arr.size()-1) ) {
|
||||||
candidatesLookedAt++;
|
candidatesLookedAt++;
|
||||||
tempTrack = &**arr[ndx+candidatesLookedAt];
|
tempTrack = &**arr[ndx+candidatesLookedAt].first;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
tempTrack = NULL;
|
tempTrack = NULL;
|
||||||
@ -2982,7 +2982,7 @@ void AudacityProject::SortTracks(int flags)
|
|||||||
bArrayTrackLinked = arrTrack.GetLinked();
|
bArrayTrackLinked = arrTrack.GetLinked();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
arr.insert(arr.begin() + ndx, iter);
|
arr.insert(arr.begin() + ndx, TrackNodePointer{iter, mTracks.get()});
|
||||||
|
|
||||||
lastTrackLinked = track->GetLinked();
|
lastTrackLinked = track->GetLinked();
|
||||||
}
|
}
|
||||||
|
113
src/Track.cpp
113
src/Track.cpp
@ -113,7 +113,7 @@ Track::~Track()
|
|||||||
|
|
||||||
TrackNodePointer Track::GetNode() const
|
TrackNodePointer Track::GetNode() const
|
||||||
{
|
{
|
||||||
wxASSERT(mList.lock() == NULL || this == mNode->get());
|
wxASSERT(mList.lock() == NULL || this == mNode.first->get());
|
||||||
return mNode;
|
return mNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,12 +274,12 @@ Track *Track::GetLink() const
|
|||||||
if (mLinked) {
|
if (mLinked) {
|
||||||
auto next = pList->getNext( mNode );
|
auto next = pList->getNext( mNode );
|
||||||
if ( !pList->isNull( next ) )
|
if ( !pList->isNull( next ) )
|
||||||
return next->get();
|
return next.first->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto prev = pList->getPrev( mNode );
|
auto prev = pList->getPrev( mNode );
|
||||||
if ( !pList->isNull( prev ) ) {
|
if ( !pList->isNull( prev ) ) {
|
||||||
auto track = prev->get();
|
auto track = prev.first->get();
|
||||||
if (track && track->GetLinked())
|
if (track && track->GetLinked())
|
||||||
return track;
|
return track;
|
||||||
}
|
}
|
||||||
@ -408,7 +408,7 @@ Track *TrackListIterator::StartWith(Track * val)
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
cur = val->GetNode();
|
cur = val->GetNode();
|
||||||
return cur->get();
|
return cur.first->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
Track *TrackListIterator::First(TrackList * val)
|
Track *TrackListIterator::First(TrackList * val)
|
||||||
@ -424,7 +424,7 @@ Track *TrackListIterator::First(TrackList * val)
|
|||||||
cur = l->getBegin();
|
cur = l->getBegin();
|
||||||
|
|
||||||
if (!l->isNull(cur)) {
|
if (!l->isNull(cur)) {
|
||||||
return cur->get();
|
return cur.first->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -444,13 +444,13 @@ Track *TrackListIterator::Last(bool skiplinked)
|
|||||||
if (skiplinked) {
|
if (skiplinked) {
|
||||||
auto prev = l->getPrev( cur );
|
auto prev = l->getPrev( cur );
|
||||||
if ( !l->isNull( prev ) &&
|
if ( !l->isNull( prev ) &&
|
||||||
!(*cur)->GetLinked() &&
|
!(*cur.first)->GetLinked() &&
|
||||||
(*cur)->GetLink()
|
(*cur.first)->GetLink()
|
||||||
)
|
)
|
||||||
cur = prev;
|
cur = prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
return cur->get();
|
return cur.first->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
Track *TrackListIterator::Next(bool skipLinked)
|
Track *TrackListIterator::Next(bool skipLinked)
|
||||||
@ -463,7 +463,7 @@ Track *TrackListIterator::Next(bool skipLinked)
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
if (skipLinked &&
|
if (skipLinked &&
|
||||||
(*cur)->GetLinked())
|
(*cur.first)->GetLinked())
|
||||||
cur = l->getNext( cur );
|
cur = l->getNext( cur );
|
||||||
|
|
||||||
#ifdef DEBUG_TLI // if we are debugging this bit
|
#ifdef DEBUG_TLI // if we are debugging this bit
|
||||||
@ -478,7 +478,7 @@ Track *TrackListIterator::Next(bool skipLinked)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!l->isNull(cur))
|
if (!l->isNull(cur))
|
||||||
return cur->get();
|
return cur.first->get();
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -494,11 +494,11 @@ Track *TrackListIterator::Prev(bool skiplinked)
|
|||||||
|
|
||||||
if ( skiplinked ) {
|
if ( skiplinked ) {
|
||||||
auto prev = l->getPrev( cur );
|
auto prev = l->getPrev( cur );
|
||||||
if( !l->isNull( prev ) && (*prev)->GetLinked() )
|
if( !l->isNull( prev ) && (*prev.first)->GetLinked() )
|
||||||
cur = prev;
|
cur = prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
return cur->get();
|
return cur.first->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
Track *TrackListIterator::operator *() const
|
Track *TrackListIterator::operator *() const
|
||||||
@ -506,7 +506,7 @@ Track *TrackListIterator::operator *() const
|
|||||||
if ( !l || l->isNull( cur ) )
|
if ( !l || l->isNull( cur ) )
|
||||||
return nullptr;
|
return nullptr;
|
||||||
else
|
else
|
||||||
return cur->get();
|
return cur.first->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
Track *TrackListIterator::RemoveCurrent()
|
Track *TrackListIterator::RemoveCurrent()
|
||||||
@ -514,14 +514,14 @@ Track *TrackListIterator::RemoveCurrent()
|
|||||||
if ( !l || l->isNull( cur ) )
|
if ( !l || l->isNull( cur ) )
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
cur = l->Remove( cur->get() );
|
cur = l->Remove( cur.first->get() );
|
||||||
|
|
||||||
#ifdef DEBUG_TLI // if we are debugging this bit
|
#ifdef DEBUG_TLI // if we are debugging this bit
|
||||||
wxASSERT_MSG((!cur || (*l).Contains((*cur).t)), wxT("cur invalid after deletion of track.")); // check that cur is in the list
|
wxASSERT_MSG((!cur || (*l).Contains((*cur).t)), wxT("cur invalid after deletion of track.")); // check that cur is in the list
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ( !l->isNull( cur ) )
|
if ( !l->isNull( cur ) )
|
||||||
return cur->get();
|
return cur.first->get();
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -754,7 +754,7 @@ Track *SyncLockedTracksIterator::Last(bool skiplinked)
|
|||||||
if ( !l || l->isNull( cur ) )
|
if ( !l || l->isNull( cur ) )
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
Track *t = cur->get();
|
Track *t = cur.first->get();
|
||||||
|
|
||||||
while (const auto next = l->GetNext(t, skiplinked)) {
|
while (const auto next = l->GetNext(t, skiplinked)) {
|
||||||
if ( ! IsGoodNextTrack(next) )
|
if ( ! IsGoodNextTrack(next) )
|
||||||
@ -809,9 +809,9 @@ void TrackList::Swap(TrackList &that)
|
|||||||
{
|
{
|
||||||
a.swap(b);
|
a.swap(b);
|
||||||
for (auto it = a.begin(), last = a.end(); it != last; ++it)
|
for (auto it = a.begin(), last = a.end(); it != last; ++it)
|
||||||
(*it)->SetOwner(aSelf, it);
|
(*it)->SetOwner(aSelf, {it, &a});
|
||||||
for (auto it = b.begin(), last = b.end(); it != last; ++it)
|
for (auto it = b.begin(), last = b.end(); it != last; ++it)
|
||||||
(*it)->SetOwner(bSelf, it);
|
(*it)->SetOwner(bSelf, {it, &b});
|
||||||
};
|
};
|
||||||
|
|
||||||
SwapLOTs( *this, mSelf, that, that.mSelf );
|
SwapLOTs( *this, mSelf, that, that.mSelf );
|
||||||
@ -835,7 +835,7 @@ void TrackList::RecalcPositions(TrackNodePointer node)
|
|||||||
|
|
||||||
auto prev = getPrev( node );
|
auto prev = getPrev( node );
|
||||||
if ( !isNull( prev ) ) {
|
if ( !isNull( prev ) ) {
|
||||||
t = prev->get();
|
t = prev.first->get();
|
||||||
i = t->GetIndex() + 1;
|
i = t->GetIndex() + 1;
|
||||||
y = t->GetY() + t->GetHeight();
|
y = t->GetY() + t->GetHeight();
|
||||||
}
|
}
|
||||||
@ -868,7 +868,7 @@ void TrackList::DeletionEvent()
|
|||||||
void TrackList::ResizingEvent(TrackNodePointer node)
|
void TrackList::ResizingEvent(TrackNodePointer node)
|
||||||
{
|
{
|
||||||
auto e = std::make_unique<TrackListEvent>(EVT_TRACKLIST_RESIZING);
|
auto e = std::make_unique<TrackListEvent>(EVT_TRACKLIST_RESIZING);
|
||||||
e->mpTrack = *node;
|
e->mpTrack = *node.first;
|
||||||
// wxWidgets will own the event object
|
// wxWidgets will own the event object
|
||||||
QueueEvent(e.release());
|
QueueEvent(e.release());
|
||||||
}
|
}
|
||||||
@ -876,10 +876,11 @@ void TrackList::ResizingEvent(TrackNodePointer node)
|
|||||||
void TrackList::Permute(const std::vector<TrackNodePointer> &permutation)
|
void TrackList::Permute(const std::vector<TrackNodePointer> &permutation)
|
||||||
{
|
{
|
||||||
for (const auto iter : permutation) {
|
for (const auto iter : permutation) {
|
||||||
ListOfTracks::value_type track = std::move(*iter);
|
ListOfTracks::value_type track = std::move(*iter.first);
|
||||||
erase(iter);
|
erase(iter.first);
|
||||||
Track *pTrack = track.get();
|
Track *pTrack = track.get();
|
||||||
pTrack->SetOwner(mSelf, insert(ListOfTracks::end(), std::move(track)));
|
pTrack->SetOwner(mSelf,
|
||||||
|
{ insert(ListOfTracks::end(), std::move(track)), this });
|
||||||
}
|
}
|
||||||
auto n = getBegin();
|
auto n = getBegin();
|
||||||
RecalcPositions(n);
|
RecalcPositions(n);
|
||||||
@ -963,10 +964,10 @@ auto TrackList::Replace(Track * t, ListOfTracks::value_type &&with) ->
|
|||||||
auto node = t->GetNode();
|
auto node = t->GetNode();
|
||||||
t->SetOwner({}, {});
|
t->SetOwner({}, {});
|
||||||
|
|
||||||
holder = std::move(*node);
|
holder = std::move(*node.first);
|
||||||
|
|
||||||
Track *pTrack = with.get();
|
Track *pTrack = with.get();
|
||||||
*node = std::move(with);
|
*node.first = std::move(with);
|
||||||
pTrack->SetOwner(mSelf, node);
|
pTrack->SetOwner(mSelf, node);
|
||||||
pTrack->SetId( t->GetId() );
|
pTrack->SetId( t->GetId() );
|
||||||
RecalcPositions(node);
|
RecalcPositions(node);
|
||||||
@ -985,10 +986,10 @@ TrackNodePointer TrackList::Remove(Track *t)
|
|||||||
t->SetOwner({}, {});
|
t->SetOwner({}, {});
|
||||||
|
|
||||||
if ( !isNull( node ) ) {
|
if ( !isNull( node ) ) {
|
||||||
ListOfTracks::value_type holder = std::move( *node );
|
ListOfTracks::value_type holder = std::move( *node.first );
|
||||||
|
|
||||||
result = getNext( node );
|
result = getNext( node );
|
||||||
erase(node);
|
erase(node.first);
|
||||||
if ( !isNull( result ) )
|
if ( !isNull( result ) )
|
||||||
RecalcPositions(result);
|
RecalcPositions(result);
|
||||||
|
|
||||||
@ -1028,12 +1029,12 @@ void TrackList::Select(Track * t, bool selected /* = true */ )
|
|||||||
if ( t->GetLinked() ) {
|
if ( t->GetLinked() ) {
|
||||||
auto next = getNext( node );
|
auto next = getNext( node );
|
||||||
if ( !isNull( next ) )
|
if ( !isNull( next ) )
|
||||||
(*next)->SetSelected( selected );
|
(*next.first)->SetSelected( selected );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
auto prev = getPrev( node );
|
auto prev = getPrev( node );
|
||||||
if ( !isNull( prev ) && (*prev)->GetLinked() )
|
if ( !isNull( prev ) && (*prev.first)->GetLinked() )
|
||||||
(*prev)->SetSelected( selected );
|
(*prev.first)->SetSelected( selected );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1052,7 +1053,7 @@ Track *TrackList::GetNext(Track * t, bool linked) const
|
|||||||
node = getNext( node );
|
node = getNext( node );
|
||||||
|
|
||||||
if ( !isNull( node ) )
|
if ( !isNull( node ) )
|
||||||
return node->get();
|
return node.first->get();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1083,11 +1084,11 @@ Track *TrackList::GetPrev(Track * t, bool linked) const
|
|||||||
if (linked) {
|
if (linked) {
|
||||||
prev = getPrev( node );
|
prev = getPrev( node );
|
||||||
if( !isNull( prev ) &&
|
if( !isNull( prev ) &&
|
||||||
!(*node)->GetLinked() && (*node)->GetLink() )
|
!(*node.first)->GetLinked() && (*node.first)->GetLink() )
|
||||||
node = prev;
|
node = prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
return node->get();
|
return node.first->get();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1131,15 +1132,15 @@ void TrackList::SwapNodes(TrackNodePointer s1, TrackNodePointer s2)
|
|||||||
|
|
||||||
// Deal with first track in each team
|
// Deal with first track in each team
|
||||||
Track *link;
|
Track *link;
|
||||||
link = (*s1)->GetLink();
|
link = (*s1.first)->GetLink();
|
||||||
bool linked1 = link != nullptr;
|
bool linked1 = link != nullptr;
|
||||||
if (linked1 && !(*s1)->GetLinked()) {
|
if (linked1 && !(*s1.first)->GetLinked()) {
|
||||||
s1 = link->GetNode();
|
s1 = link->GetNode();
|
||||||
}
|
}
|
||||||
|
|
||||||
link = (*s2)->GetLink();
|
link = (*s2.first)->GetLink();
|
||||||
bool linked2 = link != nullptr;
|
bool linked2 = link != nullptr;
|
||||||
if (linked2 && !(*s2)->GetLinked()) {
|
if (linked2 && !(*s2.first)->GetLinked()) {
|
||||||
s2 = link->GetNode();
|
s2 = link->GetNode();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1148,24 +1149,24 @@ void TrackList::SwapNodes(TrackNodePointer s1, TrackNodePointer s2)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// Be sure s1 is the earlier iterator
|
// Be sure s1 is the earlier iterator
|
||||||
if ((*s1)->GetIndex() >= (*s2)->GetIndex()) {
|
if ((*s1.first)->GetIndex() >= (*s2.first)->GetIndex()) {
|
||||||
std::swap(s1, s2);
|
std::swap(s1, s2);
|
||||||
std::swap(linked1, linked2);
|
std::swap(linked1, linked2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove tracks
|
// Remove tracks
|
||||||
ListOfTracks::value_type save11 = std::move(*s1), save12{};
|
ListOfTracks::value_type save11 = std::move(*s1.first), save12{};
|
||||||
s1 = erase(s1);
|
s1.first = erase(s1.first);
|
||||||
if (linked1) {
|
if (linked1) {
|
||||||
wxASSERT(s1 != s2);
|
wxASSERT(s1 != s2);
|
||||||
save12 = std::move(*s1), s1 = erase(s1);
|
save12 = std::move(*s1.first), s1.first = erase(s1.first);
|
||||||
}
|
}
|
||||||
const bool same = (s1 == s2);
|
const bool same = (s1 == s2);
|
||||||
|
|
||||||
ListOfTracks::value_type save21 = std::move(*s2), save22{};
|
ListOfTracks::value_type save21 = std::move(*s2.first), save22{};
|
||||||
s2 = erase(s2);
|
s2.first = erase(s2.first);
|
||||||
if (linked2)
|
if (linked2)
|
||||||
save22 = std::move(*s2), s2 = erase(s2);
|
save22 = std::move(*s2.first), s2.first = erase(s2.first);
|
||||||
|
|
||||||
if (same)
|
if (same)
|
||||||
// We invalidated s1!
|
// We invalidated s1!
|
||||||
@ -1174,12 +1175,16 @@ void TrackList::SwapNodes(TrackNodePointer s1, TrackNodePointer s2)
|
|||||||
// Reinsert them
|
// Reinsert them
|
||||||
Track *pTrack;
|
Track *pTrack;
|
||||||
if (save22)
|
if (save22)
|
||||||
pTrack = save22.get(), pTrack->SetOwner(mSelf, s1 = insert(s1, std::move(save22)));
|
pTrack = save22.get(),
|
||||||
pTrack = save21.get(), pTrack->SetOwner(mSelf, s1 = insert(s1, std::move(save21)));
|
pTrack->SetOwner(mSelf, s1 = { insert(s1.first, std::move(save22)), this });
|
||||||
|
pTrack = save21.get(),
|
||||||
|
pTrack->SetOwner(mSelf, s1 = { insert(s1.first, std::move(save21)), this });
|
||||||
|
|
||||||
if (save12)
|
if (save12)
|
||||||
pTrack = save12.get(), pTrack->SetOwner(mSelf, s2 = insert(s2, std::move(save12)));
|
pTrack = save12.get(),
|
||||||
pTrack = save11.get(), pTrack->SetOwner(mSelf, s2 = insert(s2, std::move(save11)));
|
pTrack->SetOwner(mSelf, s2 = { insert(s2.first, std::move(save12)), this });
|
||||||
|
pTrack = save11.get(),
|
||||||
|
pTrack->SetOwner(mSelf, s2 = { insert(s2.first, std::move(save11)), this });
|
||||||
|
|
||||||
// Now correct the Index in the tracks, and other things
|
// Now correct the Index in the tracks, and other things
|
||||||
RecalcPositions(s1);
|
RecalcPositions(s1);
|
||||||
@ -1227,7 +1232,7 @@ size_t TrackList::size() const
|
|||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
|
|
||||||
if (!empty())
|
if (!empty())
|
||||||
cnt = getPrev( getEnd() )->get()->GetIndex() + 1;
|
cnt = getPrev( getEnd() ).first->get()->GetIndex() + 1;
|
||||||
|
|
||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
@ -1365,7 +1370,7 @@ int TrackList::GetHeight() const
|
|||||||
int height = 0;
|
int height = 0;
|
||||||
|
|
||||||
if (!empty()) {
|
if (!empty()) {
|
||||||
auto track = getPrev( getEnd() )->get();
|
auto track = getPrev( getEnd() ).first->get();
|
||||||
height = track->GetY() + track->GetHeight();
|
height = track->GetY() + track->GetHeight();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1424,7 +1429,7 @@ TrackList::RegisterPendingChangedTrack( Updater updater, Track *src )
|
|||||||
mPendingUpdates.push_back( pTrack );
|
mPendingUpdates.push_back( pTrack );
|
||||||
auto n = mPendingUpdates.end();
|
auto n = mPendingUpdates.end();
|
||||||
--n;
|
--n;
|
||||||
pTrack->SetOwner(mSelf, n);
|
pTrack->SetOwner(mSelf, {n, &mPendingUpdates});
|
||||||
}
|
}
|
||||||
|
|
||||||
return pTrack;
|
return pTrack;
|
||||||
@ -1480,7 +1485,7 @@ void TrackList::ClearPendingTracks( ListOfTracks *pAdded )
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!empty())
|
if (!empty())
|
||||||
RecalcPositions(ListOfTracks::begin());
|
RecalcPositions(getBegin());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TrackList::ApplyPendingTracks()
|
bool TrackList::ApplyPendingTracks()
|
||||||
@ -1528,7 +1533,7 @@ bool TrackList::ApplyPendingTracks()
|
|||||||
auto iter = ListOfTracks::begin();
|
auto iter = ListOfTracks::begin();
|
||||||
std::advance( iter, pendingTrack->GetIndex() );
|
std::advance( iter, pendingTrack->GetIndex() );
|
||||||
iter = ListOfTracks::insert( iter, pendingTrack );
|
iter = ListOfTracks::insert( iter, pendingTrack );
|
||||||
pendingTrack->SetOwner( mSelf, iter );
|
pendingTrack->SetOwner( mSelf, {iter, this} );
|
||||||
pendingTrack->SetId( TrackId{ ++sCounter } );
|
pendingTrack->SetId( TrackId{ ++sCounter } );
|
||||||
if (!inserted) {
|
if (!inserted) {
|
||||||
first = iter;
|
first = iter;
|
||||||
@ -1537,7 +1542,7 @@ bool TrackList::ApplyPendingTracks()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (inserted) {
|
if (inserted) {
|
||||||
RecalcPositions(first);
|
RecalcPositions({first, this});
|
||||||
result = true;
|
result = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
28
src/Track.h
28
src/Track.h
@ -60,7 +60,8 @@ class TrackList;
|
|||||||
|
|
||||||
using ListOfTracks = std::list< std::shared_ptr< Track > >;
|
using ListOfTracks = std::list< std::shared_ptr< Track > >;
|
||||||
|
|
||||||
using TrackNodePointer = ListOfTracks::iterator;
|
using TrackNodePointer =
|
||||||
|
std::pair< ListOfTracks::iterator, ListOfTracks* >;
|
||||||
|
|
||||||
class ViewInfo;
|
class ViewInfo;
|
||||||
|
|
||||||
@ -131,7 +132,7 @@ class AUDACITY_DLL_API Track /* not final */
|
|||||||
if (t) {
|
if (t) {
|
||||||
auto pList = t->mList.lock();
|
auto pList = t->mList.lock();
|
||||||
if (pList)
|
if (pList)
|
||||||
return std::static_pointer_cast<Subclass>(*t->mNode);
|
return std::static_pointer_cast<Subclass>(*t->mNode.first);
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -142,7 +143,7 @@ class AUDACITY_DLL_API Track /* not final */
|
|||||||
if (t) {
|
if (t) {
|
||||||
auto pList = t->mList.lock();
|
auto pList = t->mList.lock();
|
||||||
if (pList) {
|
if (pList) {
|
||||||
std::shared_ptr<const Track> p{ *t->mNode };
|
std::shared_ptr<const Track> p{ *t->mNode.first };
|
||||||
// Let you change the type, but not cast away the const
|
// Let you change the type, but not cast away the const
|
||||||
return std::static_pointer_cast<Subclass>(p);
|
return std::static_pointer_cast<Subclass>(p);
|
||||||
}
|
}
|
||||||
@ -640,7 +641,8 @@ class TrackList final : public wxEvtHandler, public ListOfTracks
|
|||||||
using iterator = TrackListIterator;
|
using iterator = TrackListIterator;
|
||||||
using const_iterator = TrackListConstIterator;
|
using const_iterator = TrackListConstIterator;
|
||||||
using value_type = Track *;
|
using value_type = Track *;
|
||||||
iterator begin() { return iterator{ this, ListOfTracks::begin() }; }
|
iterator begin() { return iterator{
|
||||||
|
this, { ListOfTracks::begin(), this } }; }
|
||||||
iterator end() { return {}; }
|
iterator end() { return {}; }
|
||||||
const_iterator begin() const { return const_iterator{ this }; }
|
const_iterator begin() const { return const_iterator{ this }; }
|
||||||
const_iterator end() const { return {}; }
|
const_iterator end() const { return {}; }
|
||||||
@ -750,12 +752,14 @@ class TrackList final : public wxEvtHandler, public ListOfTracks
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
bool isNull(TrackNodePointer p) const
|
bool isNull(TrackNodePointer p) const
|
||||||
{ return p == ListOfTracks::end()
|
{ return (p.second == this && p.first == ListOfTracks::end())
|
||||||
|| p == mPendingUpdates.end(); }
|
|| (p.second == &mPendingUpdates && p.first == mPendingUpdates.end()); }
|
||||||
TrackNodePointer getEnd() const
|
TrackNodePointer getEnd() const
|
||||||
{ return const_cast<TrackList*>(this)->ListOfTracks::end(); }
|
{ return { const_cast<TrackList*>(this)->ListOfTracks::end(),
|
||||||
|
const_cast<TrackList*>(this)}; }
|
||||||
TrackNodePointer getBegin() const
|
TrackNodePointer getBegin() const
|
||||||
{ return const_cast<TrackList*>(this)->ListOfTracks::begin(); }
|
{ return { const_cast<TrackList*>(this)->ListOfTracks::begin(),
|
||||||
|
const_cast<TrackList*>(this)}; }
|
||||||
|
|
||||||
// Move an iterator to the next node, if any; else stay at end
|
// Move an iterator to the next node, if any; else stay at end
|
||||||
TrackNodePointer getNext(TrackNodePointer p) const
|
TrackNodePointer getNext(TrackNodePointer p) const
|
||||||
@ -763,17 +767,19 @@ private:
|
|||||||
if ( isNull(p) )
|
if ( isNull(p) )
|
||||||
return p;
|
return p;
|
||||||
auto q = p;
|
auto q = p;
|
||||||
return ++q;
|
++q.first;
|
||||||
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move an iterator to the previous node, if any; else wrap to end
|
// Move an iterator to the previous node, if any; else wrap to end
|
||||||
TrackNodePointer getPrev(TrackNodePointer p) const
|
TrackNodePointer getPrev(TrackNodePointer p) const
|
||||||
{
|
{
|
||||||
if (p == this->ListOfTracks::begin())
|
if (p == getBegin())
|
||||||
return getEnd();
|
return getEnd();
|
||||||
else {
|
else {
|
||||||
auto q = p;
|
auto q = p;
|
||||||
return --q;
|
--q.first;
|
||||||
|
return q;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user