Move class template's member function definitions out of the header, explicitly instantiate all_tracks_iterator and all_tracks_const_iterator.
Apart from cleaning up the header (the main goal), this should improve compile time by instantiating in a single place so the linker doesn't have to combine multiple definitions.
This commit is contained in:
@@ -945,6 +945,73 @@ void NoteData::LoadFromNode( const XNode* pNode )
|
|||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename ND, typename iter, typename TN>
|
||||||
|
void NoteData::_all_tracks_iterator<ND, iter, TN>::NextRowAllTracks()
|
||||||
|
{
|
||||||
|
int iMinRow = INT_MAX;
|
||||||
|
|
||||||
|
for( int iTrack = 0; iTrack < m_NoteData.GetNumTracks(); ++iTrack )
|
||||||
|
{
|
||||||
|
int iRow = m_iRow;
|
||||||
|
|
||||||
|
if( m_NoteData.GetNextTapNoteRowForTrack(iTrack, iRow) )
|
||||||
|
iMinRow = min( iMinRow, iRow );
|
||||||
|
}
|
||||||
|
m_iRow = iMinRow;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename ND, typename iter, typename TN>
|
||||||
|
void NoteData::_all_tracks_iterator<ND, iter, TN>::Find()
|
||||||
|
{
|
||||||
|
m_iRow = max( m_iRow, m_iStartRow );
|
||||||
|
while( m_iRow <= m_iEndRow )
|
||||||
|
{
|
||||||
|
while( m_iTrack < m_NoteData.GetNumTracks() )
|
||||||
|
{
|
||||||
|
m_Iterator = m_NoteData.FindTapNote( m_iTrack, m_iRow );
|
||||||
|
|
||||||
|
if( m_Iterator != m_NoteData.end(m_iTrack) && m_Cond(m_Iterator->second) )
|
||||||
|
return;
|
||||||
|
++m_iTrack;
|
||||||
|
}
|
||||||
|
m_iTrack = 0;
|
||||||
|
++m_iRow;
|
||||||
|
int oldRow = m_iRow;
|
||||||
|
NextRowAllTracks();
|
||||||
|
ASSERT( oldRow < m_iRow );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename ND, typename iter, typename TN>
|
||||||
|
NoteData::_all_tracks_iterator<ND, iter, TN>::_all_tracks_iterator( ND &nd, int iStartRow, int iEndRow, NoteData::IteratorCond cond ) :
|
||||||
|
m_NoteData(nd), m_iTrack(0), m_iRow(0), m_iStartRow(iStartRow), m_iEndRow(iEndRow), m_Cond(cond)
|
||||||
|
{
|
||||||
|
ASSERT( m_NoteData.GetNumTracks() > 0 );
|
||||||
|
NextRowAllTracks();
|
||||||
|
Find();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename ND, typename iter, typename TN>
|
||||||
|
NoteData::_all_tracks_iterator<ND, iter, TN> &NoteData::_all_tracks_iterator<ND, iter, TN>::operator++() // preincrement
|
||||||
|
{
|
||||||
|
DEBUG_ASSERT( m_iRow <= m_iEndRow );
|
||||||
|
++m_iTrack;
|
||||||
|
Find();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename ND, typename iter, typename TN>
|
||||||
|
NoteData::_all_tracks_iterator<ND, iter, TN> NoteData::_all_tracks_iterator<ND, iter, TN>::operator++( int dummy ) // postincrement
|
||||||
|
{
|
||||||
|
DEBUG_ASSERT( m_iRow <= m_iEndRow );
|
||||||
|
_all_tracks_iterator<ND, iter, TN> ret(*this);
|
||||||
|
operator++();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Explicit instantiation.
|
||||||
|
template class NoteData::all_tracks_iterator;
|
||||||
|
template class NoteData::all_tracks_const_iterator;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (c) 2001-2004 Chris Danford, Glenn Maynard
|
* (c) 2001-2004 Chris Danford, Glenn Maynard
|
||||||
|
|||||||
@@ -47,69 +47,17 @@ public:
|
|||||||
iter m_Iterator;
|
iter m_Iterator;
|
||||||
IteratorCond m_Cond;
|
IteratorCond m_Cond;
|
||||||
|
|
||||||
void NextRowAllTracks()
|
void NextRowAllTracks();
|
||||||
{
|
void Find();
|
||||||
int iMinRow = INT_MAX;
|
public:
|
||||||
|
_all_tracks_iterator( ND &nd, int iStartRow, int iEndRow, IteratorCond cond );
|
||||||
for( int iTrack = 0; iTrack < m_NoteData.GetNumTracks(); ++iTrack )
|
_all_tracks_iterator operator++( int dummy ); // Preincrement.
|
||||||
{
|
_all_tracks_iterator &operator++(); // Postincrement.
|
||||||
int iRow = m_iRow;
|
|
||||||
|
|
||||||
if( m_NoteData.GetNextTapNoteRowForTrack(iTrack, iRow) )
|
|
||||||
iMinRow = min( iMinRow, iRow );
|
|
||||||
}
|
|
||||||
m_iRow = iMinRow;
|
|
||||||
}
|
|
||||||
void Find()
|
|
||||||
{
|
|
||||||
m_iRow = max( m_iRow, m_iStartRow );
|
|
||||||
while( m_iRow <= m_iEndRow )
|
|
||||||
{
|
|
||||||
while( m_iTrack < m_NoteData.GetNumTracks() )
|
|
||||||
{
|
|
||||||
m_Iterator = m_NoteData.FindTapNote( m_iTrack, m_iRow );
|
|
||||||
|
|
||||||
if( m_Iterator != m_NoteData.end(m_iTrack) && m_Cond(m_Iterator->second) )
|
|
||||||
return;
|
|
||||||
++m_iTrack;
|
|
||||||
}
|
|
||||||
m_iTrack = 0;
|
|
||||||
++m_iRow;
|
|
||||||
int oldRow = m_iRow;
|
|
||||||
NextRowAllTracks();
|
|
||||||
ASSERT( oldRow < m_iRow );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public:
|
|
||||||
_all_tracks_iterator( ND &nd, int iStartRow, int iEndRow, IteratorCond cond ) :
|
|
||||||
m_NoteData(nd), m_iTrack(0), m_iRow(0), m_iStartRow(iStartRow), m_iEndRow(iEndRow), m_Cond(cond)
|
|
||||||
{
|
|
||||||
ASSERT( m_NoteData.GetNumTracks() > 0 );
|
|
||||||
NextRowAllTracks();
|
|
||||||
Find();
|
|
||||||
}
|
|
||||||
|
|
||||||
#define CHECK DEBUG_ASSERT( m_iRow <= m_iEndRow )
|
|
||||||
inline int Track() const { return m_iTrack; }
|
inline int Track() const { return m_iTrack; }
|
||||||
inline int Row() const { return m_iRow; }
|
inline int Row() const { return m_iRow; }
|
||||||
inline bool IsAtEnd() const { return m_iRow > m_iEndRow; }
|
inline bool IsAtEnd() const { return m_iRow > m_iEndRow; }
|
||||||
inline _all_tracks_iterator &operator++() // preincrement
|
inline TN &operator*() { DEBUG_ASSERT( m_iRow <= m_iEndRow ); return m_Iterator->second; }
|
||||||
{
|
inline TN *operator->() { DEBUG_ASSERT( m_iRow <= m_iEndRow ); return &m_Iterator->second; }
|
||||||
CHECK;
|
|
||||||
++m_iTrack;
|
|
||||||
Find();
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
inline _all_tracks_iterator operator++( int dummy ) // postincrement
|
|
||||||
{
|
|
||||||
CHECK;
|
|
||||||
all_tracks_iterator ret(*this);
|
|
||||||
operator++();
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
inline TN &operator*() { CHECK; return m_Iterator->second; }
|
|
||||||
inline TN *operator->() { CHECK; return &m_Iterator->second; }
|
|
||||||
#undef CHECK
|
|
||||||
};
|
};
|
||||||
typedef _all_tracks_iterator<NoteData, iterator, TapNote> all_tracks_iterator;
|
typedef _all_tracks_iterator<NoteData, iterator, TapNote> all_tracks_iterator;
|
||||||
typedef _all_tracks_iterator<const NoteData, const_iterator, const TapNote> all_tracks_const_iterator;
|
typedef _all_tracks_iterator<const NoteData, const_iterator, const TapNote> all_tracks_const_iterator;
|
||||||
|
|||||||
Reference in New Issue
Block a user