@@ -342,38 +342,82 @@ fn chunked_bitset() {
342
342
b10000b. assert_valid ( ) ;
343
343
}
344
344
345
+ fn with_elements_chunked ( elements : & [ usize ] , domain_size : usize ) -> ChunkedBitSet < usize > {
346
+ let mut s = ChunkedBitSet :: new_empty ( domain_size) ;
347
+ for & e in elements {
348
+ assert ! ( s. insert( e) ) ;
349
+ }
350
+ s
351
+ }
352
+
353
+ fn with_elements_standard ( elements : & [ usize ] , domain_size : usize ) -> BitSet < usize > {
354
+ let mut s = BitSet :: new_empty ( domain_size) ;
355
+ for & e in elements {
356
+ assert ! ( s. insert( e) ) ;
357
+ }
358
+ s
359
+ }
360
+
361
+ #[ test]
362
+ fn chunked_bitset_into_bitset_operations ( ) {
363
+ let a = vec ! [ 1 , 5 , 7 , 11 , 15 , 2000 , 3000 ] ;
364
+ let b = vec ! [ 3 , 4 , 11 , 3000 , 4000 ] ;
365
+ let aub = vec ! [ 1 , 3 , 4 , 5 , 7 , 11 , 15 , 2000 , 3000 , 4000 ] ;
366
+ let aib = vec ! [ 11 , 3000 ] ;
367
+
368
+ let b = with_elements_chunked ( & b, 9876 ) ;
369
+
370
+ let mut union = with_elements_standard ( & a, 9876 ) ;
371
+ assert ! ( union . union ( & b) ) ;
372
+ assert ! ( !union . union ( & b) ) ;
373
+ assert ! ( union . iter( ) . eq( aub. iter( ) . copied( ) ) ) ;
374
+
375
+ let mut intersection = with_elements_standard ( & a, 9876 ) ;
376
+ assert ! ( intersection. intersect( & b) ) ;
377
+ assert ! ( !intersection. intersect( & b) ) ;
378
+ assert ! ( intersection. iter( ) . eq( aib. iter( ) . copied( ) ) ) ;
379
+ }
380
+
345
381
#[ test]
346
382
fn chunked_bitset_iter ( ) {
347
- fn with_elements ( elements : & [ usize ] , domain_size : usize ) -> ChunkedBitSet < usize > {
348
- let mut s = ChunkedBitSet :: new_empty ( domain_size) ;
349
- for & e in elements {
350
- s. insert ( e) ;
383
+ fn check_iter ( bit : & ChunkedBitSet < usize > , vec : & Vec < usize > ) {
384
+ // Test collecting via both `.next()` and `.fold()` calls, to make sure both are correct
385
+ let mut collect_next = Vec :: new ( ) ;
386
+ let mut bit_iter = bit. iter ( ) ;
387
+ while let Some ( item) = bit_iter. next ( ) {
388
+ collect_next. push ( item) ;
351
389
}
352
- s
390
+ assert_eq ! ( vec, & collect_next) ;
391
+
392
+ let collect_fold = bit. iter ( ) . fold ( Vec :: new ( ) , |mut v, item| {
393
+ v. push ( item) ;
394
+ v
395
+ } ) ;
396
+ assert_eq ! ( vec, & collect_fold) ;
353
397
}
354
398
355
399
// Empty
356
400
let vec: Vec < usize > = Vec :: new ( ) ;
357
- let bit = with_elements ( & vec, 9000 ) ;
358
- assert_eq ! ( vec , bit . iter ( ) . collect :: < Vec <_>> ( ) ) ;
401
+ let bit = with_elements_chunked ( & vec, 9000 ) ;
402
+ check_iter ( & bit , & vec ) ;
359
403
360
404
// Filled
361
405
let n = 10000 ;
362
406
let vec: Vec < usize > = ( 0 ..n) . collect ( ) ;
363
- let bit = with_elements ( & vec, n) ;
364
- assert_eq ! ( vec , bit . iter ( ) . collect :: < Vec <_>> ( ) ) ;
407
+ let bit = with_elements_chunked ( & vec, n) ;
408
+ check_iter ( & bit , & vec ) ;
365
409
366
410
// Filled with trailing zeros
367
411
let n = 10000 ;
368
412
let vec: Vec < usize > = ( 0 ..n) . collect ( ) ;
369
- let bit = with_elements ( & vec, 2 * n) ;
370
- assert_eq ! ( vec , bit . iter ( ) . collect :: < Vec <_>> ( ) ) ;
413
+ let bit = with_elements_chunked ( & vec, 2 * n) ;
414
+ check_iter ( & bit , & vec ) ;
371
415
372
416
// Mixed
373
417
let n = 12345 ;
374
418
let vec: Vec < usize > = vec ! [ 0 , 1 , 2 , 2010 , 2047 , 2099 , 6000 , 6002 , 6004 ] ;
375
- let bit = with_elements ( & vec, n) ;
376
- assert_eq ! ( vec , bit . iter ( ) . collect :: < Vec <_>> ( ) ) ;
419
+ let bit = with_elements_chunked ( & vec, n) ;
420
+ check_iter ( & bit , & vec ) ;
377
421
}
378
422
379
423
#[ test]
0 commit comments