Optimize. It's a bit tricky to think about but pleasantly symmetric.
This commit is contained in:
+15
-12
@@ -10,8 +10,9 @@
|
|||||||
#include "RageLog.h"
|
#include "RageLog.h"
|
||||||
#include "XmlFile.h"
|
#include "XmlFile.h"
|
||||||
#include "Foreach.h"
|
#include "Foreach.h"
|
||||||
|
|
||||||
#include "RageUtil_AutoPtr.h"
|
#include "RageUtil_AutoPtr.h"
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
REGISTER_CLASS_TRAITS( NoteData, new NoteData(*pCopy) )
|
REGISTER_CLASS_TRAITS( NoteData, new NoteData(*pCopy) )
|
||||||
|
|
||||||
void NoteData::Init()
|
void NoteData::Init()
|
||||||
@@ -899,21 +900,23 @@ void NoteData::LoadFromNode( const XNode* pNode )
|
|||||||
|
|
||||||
NoteData::reverse_iterator NoteData::rlower_bound( int iTrack, int iRow )
|
NoteData::reverse_iterator NoteData::rlower_bound( int iTrack, int iRow )
|
||||||
{
|
{
|
||||||
// TODO: optimize this
|
/* This is annoyingly tricky. First, find the upper bound for iRow. The map upper bound is the first
|
||||||
reverse_iterator i = m_TapNotes[iTrack].rbegin();
|
* key that is greater than iRow. If no such key exists in the map, then every key is less than or
|
||||||
for( ; i != m_TapNotes[iTrack].rend(); ++i )
|
* equal to iRow so we want the first. Note that if the map is empty, rbegin() will be the same as
|
||||||
{
|
* rend(). If the first key in the map is is greater than iRow then all are so return rend(). If i
|
||||||
if( i->first <= iRow )
|
* is neither begin() nor end(), then i - 1 (which isn't defined!) is last key in the map that is
|
||||||
return i;
|
* less than or equal to iRow. */
|
||||||
}
|
iterator i = m_TapNotes[iTrack].upper_bound( iRow );
|
||||||
|
if( i == m_TapNotes[iTrack].end() )
|
||||||
return i;
|
return m_TapNotes[iTrack].rbegin();
|
||||||
|
if( i == m_TapNotes[iTrack].begin() )
|
||||||
|
return m_TapNotes[iTrack].rend();
|
||||||
|
return reverse_iterator( --i );
|
||||||
}
|
}
|
||||||
|
|
||||||
NoteData::const_reverse_iterator NoteData::rlower_bound( int iTrack, int iRow ) const
|
NoteData::const_reverse_iterator NoteData::rlower_bound( int iTrack, int iRow ) const
|
||||||
{
|
{
|
||||||
NoteData::reverse_iterator iter = ((NoteData*)this)->rlower_bound( iTrack, iRow );
|
return const_cast<NoteData*>(this)->rlower_bound( iTrack, iRow );
|
||||||
return iter;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ND, typename iter, typename TN, bool bReverse, typename iterMethodInt, iterMethodInt mybegin, iterMethodInt myend, typename iterMethodIntInt, iterMethodIntInt mylower_bound>
|
template<typename ND, typename iter, typename TN, bool bReverse, typename iterMethodInt, iterMethodInt mybegin, iterMethodInt myend, typename iterMethodIntInt, iterMethodIntInt mylower_bound>
|
||||||
|
|||||||
Reference in New Issue
Block a user