@@ -1370,7 +1370,10 @@ class Rank
1370
1370
else
1371
1371
m_mintree.insert ( x );
1372
1372
#else
1373
- m_tree.insert ( x );
1373
+ if ( m_method == MAX )
1374
+ m_maxtree.insert ( x );
1375
+ else
1376
+ m_mintree.insert ( x );
1374
1377
#endif
1375
1378
}
1376
1379
}
@@ -1385,21 +1388,20 @@ class Rank
1385
1388
else
1386
1389
ost_erase ( m_mintree, x );
1387
1390
#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 ) );
1389
1395
#endif
1390
1396
}
1391
1397
}
1392
1398
1393
1399
void reset ()
1394
1400
{
1395
- #ifdef __linux__
1396
1401
if ( m_method == MAX )
1397
1402
m_maxtree.clear ();
1398
1403
else
1399
1404
m_mintree.clear ();
1400
- #else
1401
- m_tree.clear ();
1402
- #endif
1403
1405
}
1404
1406
1405
1407
double compute () const
@@ -1442,30 +1444,39 @@ class Rank
1442
1444
}
1443
1445
}
1444
1446
#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 ) ) )
1446
1448
{
1447
1449
switch ( m_method )
1448
1450
{
1449
1451
case MIN:
1450
1452
{
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 );
1452
1456
}
1453
1457
case MAX:
1454
1458
{
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 );
1457
1462
}
1458
1463
case AVG:
1459
1464
{
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 ;
1462
1474
}
1463
1475
default :
1464
1476
break ;
1465
1477
}
1466
1478
}
1467
1479
#endif
1468
-
1469
1480
return std::numeric_limits<double >::quiet_NaN ();
1470
1481
}
1471
1482
@@ -1475,7 +1486,8 @@ class Rank
1475
1486
ost<std::less_equal<double >> m_mintree;
1476
1487
ost<std::greater_equal<double >> m_maxtree;
1477
1488
#else
1478
- std::multiset<double > m_tree;
1489
+ ost<std::less<double >> m_mintree;
1490
+ ost<std::greater<double >> m_maxtree;
1479
1491
#endif
1480
1492
double m_lastval;
1481
1493
0 commit comments