@@ -1370,7 +1370,10 @@ class Rank
13701370 else
13711371 m_mintree.insert ( x );
13721372 #else
1373- m_tree.insert ( x );
1373+ if ( m_method == MAX )
1374+ m_maxtree.insert ( x );
1375+ else
1376+ m_mintree.insert ( x );
13741377 #endif
13751378 }
13761379 }
@@ -1385,21 +1388,20 @@ class Rank
13851388 else
13861389 ost_erase ( m_mintree, x );
13871390 #else
1388- m_tree.erase ( m_tree.find ( x ) );
1391+ if ( m_method == MAX )
1392+ m_maxtree.erase ( m_maxtree.find ( x ) );
1393+ else
1394+ m_mintree.erase ( m_mintree.find ( x ) );
13891395 #endif
13901396 }
13911397 }
13921398
13931399 void reset ()
13941400 {
1395- #ifdef __linux__
13961401 if ( m_method == MAX )
13971402 m_maxtree.clear ();
13981403 else
13991404 m_mintree.clear ();
1400- #else
1401- m_tree.clear ();
1402- #endif
14031405 }
14041406
14051407 double compute () const
@@ -1442,30 +1444,39 @@ class Rank
14421444 }
14431445 }
14441446 #else
1445- if ( likely ( !isnan ( m_lastval ) && m_tree .size () > 0 ) )
1447+ if ( likely ( !isnan ( m_lastval ) && ( ( m_method == MAX && m_maxtree .size () > 0 ) || m_mintree. size () > 0 ) ) )
14461448 {
14471449 switch ( m_method )
14481450 {
14491451 case MIN:
14501452 {
1451- return std::distance ( m_tree.begin (), m_tree.find ( m_lastval ) );
1453+ if ( m_mintree.size () == 1 )
1454+ return 0 ;
1455+ return m_mintree.get <0 >().find_rank ( m_lastval );
14521456 }
14531457 case MAX:
14541458 {
1455- auto end_range = m_tree.equal_range ( m_lastval ).second ;
1456- return std::distance ( m_tree.begin (), std::prev ( end_range ) );
1459+ if ( m_maxtree.size () == 1 )
1460+ return 0 ;
1461+ return m_maxtree.size () - 1 - m_maxtree.get <0 >().find_rank ( m_lastval );
14571462 }
14581463 case AVG:
14591464 {
1460- auto range = m_tree.equal_range ( m_lastval );
1461- return std::distance ( m_tree.begin (), range.first ) + ( double )std::distance ( range.first , std::prev ( range.second ) ) / 2 ;
1465+ if ( m_mintree.size () == 1 )
1466+ return 0 ;
1467+
1468+ int min_rank = m_mintree.get <0 >().find_rank ( m_lastval );
1469+ int max_rank = min_rank;
1470+ auto it = m_mintree.get <0 >().nth ( min_rank );
1471+ it++;
1472+ for ( ; it != m_mintree.end () && *it == m_lastval ; it++ ) max_rank++;
1473+ return ( double )( min_rank + max_rank ) / 2 ;
14621474 }
14631475 default :
14641476 break ;
14651477 }
14661478 }
14671479 #endif
1468-
14691480 return std::numeric_limits<double >::quiet_NaN ();
14701481 }
14711482
@@ -1475,7 +1486,8 @@ class Rank
14751486 ost<std::less_equal<double >> m_mintree;
14761487 ost<std::greater_equal<double >> m_maxtree;
14771488 #else
1478- std::multiset<double > m_tree;
1489+ ost<std::less<double >> m_mintree;
1490+ ost<std::greater<double >> m_maxtree;
14791491 #endif
14801492 double m_lastval;
14811493
0 commit comments