@@ -342,38 +342,82 @@ fn chunked_bitset() {
342342 b10000b. assert_valid ( ) ;
343343}
344344
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+
345381#[ test]
346382fn 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) ;
351389 }
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) ;
353397 }
354398
355399 // Empty
356400 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 ) ;
359403
360404 // Filled
361405 let n = 10000 ;
362406 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 ) ;
365409
366410 // Filled with trailing zeros
367411 let n = 10000 ;
368412 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 ) ;
371415
372416 // Mixed
373417 let n = 12345 ;
374418 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 ) ;
377421}
378422
379423#[ test]
0 commit comments