add to all_tracks_iterator: copy constructor, operator=, GetIter
This commit is contained in:
@@ -922,7 +922,7 @@ void NoteData::_all_tracks_iterator<ND, iter, TN>::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<ND, iter, TN>::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<ND, iter, TN>::Find( bool bReverse )
|
||||
|
||||
template<typename ND, typename iter, typename TN>
|
||||
NoteData::_all_tracks_iterator<ND, iter, TN>::_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<ND, iter, TN>::_all_tracks_iterator( ND &nd, int
|
||||
Find( bReverse );
|
||||
}
|
||||
|
||||
template<typename ND, typename iter, typename TN>
|
||||
NoteData::_all_tracks_iterator<ND, iter, TN>::_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<typename ND, typename iter, typename TN>
|
||||
NoteData::_all_tracks_iterator<ND, iter, TN> &NoteData::_all_tracks_iterator<ND, iter, TN>::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<typename ND, typename iter, typename TN>
|
||||
NoteData::_all_tracks_iterator<ND, iter, TN> &NoteData::_all_tracks_iterator<ND, iter, TN>::operator++() // preincrement
|
||||
{
|
||||
|
||||
@@ -48,7 +48,7 @@ public:
|
||||
template<typename ND, typename iter, typename TN>
|
||||
class _all_tracks_iterator
|
||||
{
|
||||
ND &m_NoteData;
|
||||
ND *m_pNoteData;
|
||||
vector<iter> 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<iter> 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; }
|
||||
|
||||
Reference in New Issue
Block a user