@@ -630,6 +630,109 @@ fn test_bit_vec_extend() {
630
630
0b01001001 , 0b10010010 , 0b10111101 ] ) ) ;
631
631
}
632
632
633
+ #[ test]
634
+ fn test_bit_vec_append ( ) {
635
+ // Append to BitVec, that holds a multiple of u32::BITS bits
636
+ let mut a = BitVec :: from_bytes ( & [ 0b10100000 , 0b00010010 , 0b10010010 , 0b00110011 ] ) ;
637
+ let mut b = BitVec :: new ( ) ;
638
+ b. push ( false ) ;
639
+ b. push ( true ) ;
640
+ b. push ( true ) ;
641
+
642
+ a. append ( & mut b) ;
643
+
644
+ assert_eq ! ( a. len( ) , 35 ) ;
645
+ assert_eq ! ( b. len( ) , 0 ) ;
646
+ assert ! ( b. capacity( ) >= 3 ) ;
647
+
648
+ assert ! ( a. eq_vec( & [ true , false , true , false , false , false , false , false ,
649
+ false , false , false , true , false , false , true , false ,
650
+ true , false , false , true , false , false , true , false ,
651
+ false , false , true , true , false , false , true , true ,
652
+ false , true , true ] ) ) ;
653
+
654
+ // Append to arbitrary BitVec
655
+ let mut a = BitVec :: new ( ) ;
656
+ a. push ( true ) ;
657
+ a. push ( false ) ;
658
+
659
+ let mut b = BitVec :: from_bytes ( & [ 0b10100000 , 0b00010010 , 0b10010010 , 0b00110011 , 0b10010101 ] ) ;
660
+
661
+ a. append ( & mut b) ;
662
+
663
+ assert_eq ! ( a. len( ) , 42 ) ;
664
+ assert_eq ! ( b. len( ) , 0 ) ;
665
+ assert ! ( b. capacity( ) >= 40 ) ;
666
+
667
+ assert ! ( a. eq_vec( & [ true , false , true , false , true , false , false , false ,
668
+ false , false , false , false , false , true , false , false ,
669
+ true , false , true , false , false , true , false , false ,
670
+ true , false , false , false , true , true , false , false ,
671
+ true , true , true , false , false , true , false , true ,
672
+ false , true ] ) ) ;
673
+ }
674
+
675
+ #[ test]
676
+ fn test_bit_vec_split_off ( ) {
677
+ // Split at 0
678
+ let mut a = BitVec :: new ( ) ;
679
+ a. push ( true ) ;
680
+ a. push ( false ) ;
681
+ a. push ( false ) ;
682
+ a. push ( true ) ;
683
+
684
+ let b = a. split_off ( 0 ) ;
685
+
686
+ assert_eq ! ( a. len( ) , 0 ) ;
687
+ assert_eq ! ( b. len( ) , 4 ) ;
688
+
689
+ assert ! ( b. eq_vec( & [ true , false , false , true ] ) ) ;
690
+
691
+ // Split behind last bit
692
+ a. truncate ( 0 ) ;
693
+ a. push ( true ) ;
694
+ a. push ( false ) ;
695
+ a. push ( false ) ;
696
+ a. push ( true ) ;
697
+
698
+ let b = a. split_off ( 5 ) ;
699
+
700
+ assert_eq ! ( a. len( ) , 4 ) ;
701
+ assert_eq ! ( b. len( ) , 0 ) ;
702
+
703
+ assert ! ( a. eq_vec( & [ true , false , false , true ] ) ) ;
704
+
705
+ // Split at block boundary
706
+ let mut a = BitVec :: from_bytes ( & [ 0b10100000 , 0b00010010 , 0b10010010 , 0b00110011 , 0b11110011 ] ) ;
707
+
708
+ let b = a. split_off ( 32 ) ;
709
+
710
+ assert_eq ! ( a. len( ) , 32 ) ;
711
+ assert_eq ! ( b. len( ) , 8 ) ;
712
+
713
+ assert ! ( a. eq_vec( & [ true , false , true , false , false , false , false , false ,
714
+ false , false , false , true , false , false , true , false ,
715
+ true , false , false , true , false , false , true , false ,
716
+ false , false , true , true , false , false , true , true ] ) ) ;
717
+ assert ! ( b. eq_vec( & [ true , true , true , true , false , false , true , true ] ) ) ;
718
+
719
+ // Don't split at block boundary
720
+ let mut a = BitVec :: from_bytes ( & [ 0b10100000 , 0b00010010 , 0b10010010 , 0b00110011 , 0b01101011 , 0b10101101 ] ) ;
721
+
722
+ let b = a. split_off ( 13 ) ;
723
+
724
+ assert_eq ! ( a. len( ) , 13 ) ;
725
+ assert_eq ! ( b. len( ) , 35 ) ;
726
+
727
+ assert ! ( a. eq_vec( & [ true , false , true , false , false , false , false , false ,
728
+ false , false , false , true , false ] ) ) ;
729
+ assert ! ( b. eq_vec( & [ false , true , false , true , false , false , true , false ,
730
+ false , true , false , false , false , true , true , false ,
731
+ false , true , true , false , true , true , false , true ,
732
+ false , true , true , true , false , true , false , true ,
733
+ true , false , true ] ) ) ;
734
+ }
735
+
633
736
mod bench {
634
737
use std:: collections:: BitVec ;
635
738
use std:: u32;
0 commit comments