@@ -323,35 +323,23 @@ impl Store {
323
323
pub fn intersect_with ( & mut self , other : & Self ) {
324
324
match ( self , other) {
325
325
( & mut Array ( ref mut vec1) , & Array ( ref vec2) ) => {
326
- let mut i1 = 0usize ;
327
- let mut iter2 = vec2. iter ( ) ;
328
- let mut current2 = iter2. next ( ) ;
329
- while i1 < vec1. len ( ) {
330
- match current2. map ( |c2| vec1[ i1] . cmp ( c2) ) {
331
- None | Some ( Less ) => {
332
- vec1. remove ( i1) ;
333
- }
334
- Some ( Greater ) => {
335
- current2 = iter2. next ( ) ;
336
- }
337
- Some ( Equal ) => {
338
- i1 += 1 ;
339
- current2 = iter2. next ( ) ;
340
- }
341
- }
342
- }
326
+ let mut i = 0 ;
327
+ vec1. retain ( |x| {
328
+ i += vec2
329
+ . iter ( )
330
+ . skip ( i)
331
+ . position ( |y| y >= x)
332
+ . unwrap_or ( vec2. len ( ) ) ;
333
+ vec2. get ( i) . map_or ( false , |y| x == y)
334
+ } ) ;
343
335
}
344
336
( & mut Bitmap ( ref mut bits1) , & Bitmap ( ref bits2) ) => {
345
337
for ( index1, & index2) in bits1. iter_mut ( ) . zip ( bits2. iter ( ) ) {
346
338
* index1 &= index2;
347
339
}
348
340
}
349
341
( & mut Array ( ref mut vec) , store @ & Bitmap ( ..) ) => {
350
- for i in ( 0 ..( vec. len ( ) ) ) . rev ( ) {
351
- if !store. contains ( vec[ i] ) {
352
- vec. remove ( i) ;
353
- }
354
- }
342
+ vec. retain ( |x| store. contains ( * x) ) ;
355
343
}
356
344
( this @ & mut Bitmap ( ..) , & Array ( ..) ) => {
357
345
let mut new = other. clone ( ) ;
@@ -364,24 +352,15 @@ impl Store {
364
352
pub fn difference_with ( & mut self , other : & Self ) {
365
353
match ( self , other) {
366
354
( & mut Array ( ref mut vec1) , & Array ( ref vec2) ) => {
367
- let mut i1 = 0usize ;
368
- let mut iter2 = vec2. iter ( ) ;
369
- let mut current2 = iter2. next ( ) ;
370
- while i1 < vec1. len ( ) {
371
- match current2. map ( |c2| vec1[ i1] . cmp ( c2) ) {
372
- None => break ,
373
- Some ( Less ) => {
374
- i1 += 1 ;
375
- }
376
- Some ( Greater ) => {
377
- current2 = iter2. next ( ) ;
378
- }
379
- Some ( Equal ) => {
380
- vec1. remove ( i1) ;
381
- current2 = iter2. next ( ) ;
382
- }
383
- }
384
- }
355
+ let mut i = 0 ;
356
+ vec1. retain ( |x| {
357
+ i += vec2
358
+ . iter ( )
359
+ . skip ( i)
360
+ . position ( |y| y >= x)
361
+ . unwrap_or ( vec2. len ( ) ) ;
362
+ vec2. get ( i) . map_or ( true , |y| x != y)
363
+ } ) ;
385
364
}
386
365
( ref mut this @ & mut Bitmap ( ..) , & Array ( ref vec2) ) => {
387
366
for index in vec2. iter ( ) {
@@ -394,11 +373,7 @@ impl Store {
394
373
}
395
374
}
396
375
( & mut Array ( ref mut vec) , store @ & Bitmap ( ..) ) => {
397
- for i in ( 0 ..vec. len ( ) ) . rev ( ) {
398
- if store. contains ( vec[ i] ) {
399
- vec. remove ( i) ;
400
- }
401
- }
376
+ vec. retain ( |x| !store. contains ( * x) ) ;
402
377
}
403
378
}
404
379
}
0 commit comments