From dc9361a4ef527fe71ca93719f3cc9428bbc34d9c Mon Sep 17 00:00:00 2001 From: Steve Checkoway Date: Wed, 16 Aug 2006 11:37:38 +0000 Subject: [PATCH] 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. --- stepmania/src/NoteData.cpp | 67 +++++++++++++++++++++++++++++++++++++ stepmania/src/NoteData.h | 68 +++++--------------------------------- 2 files changed, 75 insertions(+), 60 deletions(-) diff --git a/stepmania/src/NoteData.cpp b/stepmania/src/NoteData.cpp index a4117a3f99..2d3daab1fe 100644 --- a/stepmania/src/NoteData.cpp +++ b/stepmania/src/NoteData.cpp @@ -945,6 +945,73 @@ void NoteData::LoadFromNode( const XNode* pNode ) ASSERT(0); } +template +void NoteData::_all_tracks_iterator::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 +void NoteData::_all_tracks_iterator::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 +NoteData::_all_tracks_iterator::_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 +NoteData::_all_tracks_iterator &NoteData::_all_tracks_iterator::operator++() // preincrement +{ + DEBUG_ASSERT( m_iRow <= m_iEndRow ); + ++m_iTrack; + Find(); + return *this; +} + +template +NoteData::_all_tracks_iterator NoteData::_all_tracks_iterator::operator++( int dummy ) // postincrement +{ + DEBUG_ASSERT( m_iRow <= m_iEndRow ); + _all_tracks_iterator 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 diff --git a/stepmania/src/NoteData.h b/stepmania/src/NoteData.h index 13f929b8da..8f74a34975 100644 --- a/stepmania/src/NoteData.h +++ b/stepmania/src/NoteData.h @@ -47,69 +47,17 @@ public: iter m_Iterator; IteratorCond m_Cond; - void 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; - } - 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 ) + void NextRowAllTracks(); + void Find(); +public: + _all_tracks_iterator( ND &nd, int iStartRow, int iEndRow, IteratorCond cond ); + _all_tracks_iterator operator++( int dummy ); // Preincrement. + _all_tracks_iterator &operator++(); // Postincrement. inline int Track() const { return m_iTrack; } inline int Row() const { return m_iRow; } inline bool IsAtEnd() const { return m_iRow > m_iEndRow; } - inline _all_tracks_iterator &operator++() // preincrement - { - 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 + 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; } }; typedef _all_tracks_iterator all_tracks_iterator; typedef _all_tracks_iterator all_tracks_const_iterator;