@@ -412,6 +412,8 @@ pub(crate) mod extend_with {
412
412
}
413
413
414
414
pub ( crate ) mod extend_anti {
415
+ use std:: ops:: Range ;
416
+
415
417
use super :: { binary_search, Leaper , Relation } ;
416
418
use crate :: join:: gallop;
417
419
@@ -425,6 +427,7 @@ pub(crate) mod extend_anti {
425
427
{
426
428
relation : & ' leap Relation < ( Key , Val ) > ,
427
429
key_func : Func ,
430
+ old_key : Option < ( Key , Range < usize > ) > ,
428
431
phantom : :: std:: marker:: PhantomData < Tuple > ,
429
432
}
430
433
@@ -440,6 +443,7 @@ pub(crate) mod extend_anti {
440
443
ExtendAnti {
441
444
relation,
442
445
key_func,
446
+ old_key : None ,
443
447
phantom : :: std:: marker:: PhantomData ,
444
448
}
445
449
}
@@ -461,10 +465,23 @@ pub(crate) mod extend_anti {
461
465
}
462
466
fn intersect ( & mut self , prefix : & Tuple , values : & mut Vec < & ' leap Val > ) {
463
467
let key = ( self . key_func ) ( prefix) ;
464
- let start = binary_search ( & self . relation . elements , |x| & x. 0 < & key) ;
465
- let slice1 = & self . relation [ start..] ;
466
- let slice2 = gallop ( slice1, |x| & x. 0 <= & key) ;
467
- let mut slice = & slice1[ ..( slice1. len ( ) - slice2. len ( ) ) ] ;
468
+
469
+ let range = match self . old_key . as_ref ( ) {
470
+ Some ( ( old, range) ) if old == & key => range. clone ( ) ,
471
+
472
+ _ => {
473
+ let start = binary_search ( & self . relation . elements , |x| & x. 0 < & key) ;
474
+ let slice1 = & self . relation [ start..] ;
475
+ let slice2 = gallop ( slice1, |x| & x. 0 <= & key) ;
476
+ let range = start..self . relation . len ( ) -slice2. len ( ) ;
477
+
478
+ self . old_key = Some ( ( key, range. clone ( ) ) ) ;
479
+
480
+ range
481
+ }
482
+ } ;
483
+
484
+ let mut slice = & self . relation [ range] ;
468
485
if !slice. is_empty ( ) {
469
486
values. retain ( |v| {
470
487
slice = gallop ( slice, |kv| & kv. 1 < v) ;
0 commit comments