From c330dd6ae02ea4558a2966bb92f7716781ca1616 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Thu, 13 Sep 2007 05:18:05 +0000 Subject: [PATCH] add to all_tracks_iterator: copy constructor, operator=, GetIter --- stepmania/src/NoteData.cpp | 43 +++++++++++++++++++++++++++++++------- stepmania/src/NoteData.h | 7 +++++-- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/stepmania/src/NoteData.cpp b/stepmania/src/NoteData.cpp index 6b4fe1196a..e1d4418f93 100644 --- a/stepmania/src/NoteData.cpp +++ b/stepmania/src/NoteData.cpp @@ -922,7 +922,7 @@ void NoteData::_all_tracks_iterator::Find( bool bReverse ) if( bReverse ) { int iMaxRow = INT_MIN; - for( int iTrack = m_NoteData.GetNumTracks() - 1; iTrack >= 0; --iTrack ) + for( int iTrack = m_pNoteData->GetNumTracks() - 1; iTrack >= 0; --iTrack ) { iter &i( m_vCurrentIters[iTrack] ); const iter &begin = m_vBeginIters[iTrack]; @@ -948,7 +948,7 @@ void NoteData::_all_tracks_iterator::Find( bool bReverse ) { int iMinRow = INT_MAX; - for( int iTrack = 0; iTrack < m_NoteData.GetNumTracks(); ++iTrack ) + for( int iTrack = 0; iTrack < m_pNoteData->GetNumTracks(); ++iTrack ) { iter &i = m_vCurrentIters[iTrack]; const iter &end = m_vEndIters[iTrack]; @@ -968,17 +968,17 @@ void NoteData::_all_tracks_iterator::Find( bool bReverse ) template NoteData::_all_tracks_iterator::_all_tracks_iterator( ND &nd, int iStartRow, int iEndRow, bool bReverse, NoteData::IteratorCond cond, bool bInclusive ) : - m_NoteData(nd), m_iTrack(0), m_bReverse(bReverse), m_Cond(cond) + m_pNoteData(&nd), m_iTrack(0), m_bReverse(bReverse), m_Cond(cond) { - ASSERT( m_NoteData.GetNumTracks() > 0 ); + ASSERT( m_pNoteData->GetNumTracks() > 0 ); - for( int iTrack = 0; iTrack < m_NoteData.GetNumTracks(); ++iTrack ) + for( int iTrack = 0; iTrack < m_pNoteData->GetNumTracks(); ++iTrack ) { iter begin, end; if( bInclusive ) - m_NoteData.GetTapNoteRangeInclusive( iTrack, iStartRow, iEndRow, begin, end ); + m_pNoteData->GetTapNoteRangeInclusive( iTrack, iStartRow, iEndRow, begin, end ); else - m_NoteData.GetTapNoteRange( iTrack, iStartRow, iEndRow, begin, end ); + m_pNoteData->GetTapNoteRange( iTrack, iStartRow, iEndRow, begin, end ); m_vBeginIters.push_back( begin ); m_vEndIters.push_back( end ); @@ -1000,6 +1000,35 @@ NoteData::_all_tracks_iterator::_all_tracks_iterator( ND &nd, int Find( bReverse ); } +template +NoteData::_all_tracks_iterator::_all_tracks_iterator( const _all_tracks_iterator &other ) : +#define COPY_OTHER( x ) x( other.x ) + COPY_OTHER( m_pNoteData ), + COPY_OTHER( m_iTrack ), + COPY_OTHER( m_bReverse ), + COPY_OTHER( m_Cond ), + COPY_OTHER( m_vBeginIters ), + COPY_OTHER( m_vEndIters ), + COPY_OTHER( m_vCurrentIters ) +#undef COPY_OTHER +{ +} + +template +NoteData::_all_tracks_iterator &NoteData::_all_tracks_iterator::operator=( const _all_tracks_iterator &other ) +{ +#define COPY_OTHER( x ) x = other.x + COPY_OTHER( m_pNoteData ); + COPY_OTHER( m_iTrack ); + COPY_OTHER( m_bReverse ); + COPY_OTHER( m_Cond ); + COPY_OTHER( m_vBeginIters ); + COPY_OTHER( m_vEndIters ); + COPY_OTHER( m_vCurrentIters ); +#undef COPY_OTHER + return *this; +} + template NoteData::_all_tracks_iterator &NoteData::_all_tracks_iterator::operator++() // preincrement { diff --git a/stepmania/src/NoteData.h b/stepmania/src/NoteData.h index 47a4b9f1db..9b58b68e02 100644 --- a/stepmania/src/NoteData.h +++ b/stepmania/src/NoteData.h @@ -48,7 +48,7 @@ public: template class _all_tracks_iterator { - ND &m_NoteData; + ND *m_pNoteData; vector m_vBeginIters; /* There isn't a "past the beginning" iterator so this is hard to make a true bidirectional iterator. @@ -57,12 +57,14 @@ public: vector m_vEndIters; int m_iTrack; - const bool m_bReverse; + bool m_bReverse; IteratorCond m_Cond; void Find( bool bReverse ); public: _all_tracks_iterator( ND &nd, int iStartRow, int iEndRow, bool bReverse, IteratorCond cond, bool bInclusive ); + _all_tracks_iterator( const _all_tracks_iterator &other ); + _all_tracks_iterator &operator=( const _all_tracks_iterator &other ); _all_tracks_iterator &operator++(); // preincrement _all_tracks_iterator operator++( int dummy ); // postincrement //_all_tracks_iterator &operator--(); // predecrement @@ -70,6 +72,7 @@ public: inline int Track() const { return m_iTrack; } inline int Row() const { return m_vCurrentIters[m_iTrack]->first; } inline bool IsAtEnd() const { return m_iTrack == -1; } + inline iter GetIter( int iTrack ) const { return m_vCurrentIters[iTrack]; } inline TN &operator*() { DEBUG_ASSERT( !IsAtEnd() ); return m_vCurrentIters[m_iTrack]->second; } inline TN *operator->() { DEBUG_ASSERT( !IsAtEnd() ); return &m_vCurrentIters[m_iTrack]->second; } inline const TN &operator*() const { DEBUG_ASSERT( !IsAtEnd() ); return m_vCurrentIters[m_iTrack]->second; }