@@ -630,6 +630,141 @@ 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
+ // Append to empty BitVec
675
+ let mut a = BitVec :: new ( ) ;
676
+ let mut b = BitVec :: from_bytes ( & [ 0b10100000 , 0b00010010 , 0b10010010 , 0b00110011 , 0b10010101 ] ) ;
677
+
678
+ a. append ( & mut b) ;
679
+
680
+ assert_eq ! ( a. len( ) , 40 ) ;
681
+ assert_eq ! ( b. len( ) , 0 ) ;
682
+ assert ! ( b. capacity( ) >= 40 ) ;
683
+
684
+ assert ! ( a. eq_vec( & [ true , false , true , false , false , false , false , false ,
685
+ false , false , false , true , false , false , true , false ,
686
+ true , false , false , true , false , false , true , false ,
687
+ false , false , true , true , false , false , true , true ,
688
+ true , false , false , true , false , true , false , true ] ) ) ;
689
+
690
+ // Append empty BitVec
691
+ let mut a = BitVec :: from_bytes ( & [ 0b10100000 , 0b00010010 , 0b10010010 , 0b00110011 , 0b10010101 ] ) ;
692
+ let mut b = BitVec :: new ( ) ;
693
+
694
+ a. append ( & mut b) ;
695
+
696
+ assert_eq ! ( a. len( ) , 40 ) ;
697
+ assert_eq ! ( b. len( ) , 0 ) ;
698
+
699
+ assert ! ( a. eq_vec( & [ true , false , true , false , false , false , false , false ,
700
+ false , false , false , true , false , false , true , false ,
701
+ true , false , false , true , false , false , true , false ,
702
+ false , false , true , true , false , false , true , true ,
703
+ true , false , false , true , false , true , false , true ] ) ) ;
704
+ }
705
+
706
+ #[ test]
707
+ fn test_bit_vec_split_off ( ) {
708
+ // Split at 0
709
+ let mut a = BitVec :: new ( ) ;
710
+ a. push ( true ) ;
711
+ a. push ( false ) ;
712
+ a. push ( false ) ;
713
+ a. push ( true ) ;
714
+
715
+ let b = a. split_off ( 0 ) ;
716
+
717
+ assert_eq ! ( a. len( ) , 0 ) ;
718
+ assert_eq ! ( b. len( ) , 4 ) ;
719
+
720
+ assert ! ( b. eq_vec( & [ true , false , false , true ] ) ) ;
721
+
722
+ // Split at last bit
723
+ a. truncate ( 0 ) ;
724
+ a. push ( true ) ;
725
+ a. push ( false ) ;
726
+ a. push ( false ) ;
727
+ a. push ( true ) ;
728
+
729
+ let b = a. split_off ( 4 ) ;
730
+
731
+ assert_eq ! ( a. len( ) , 4 ) ;
732
+ assert_eq ! ( b. len( ) , 0 ) ;
733
+
734
+ assert ! ( a. eq_vec( & [ true , false , false , true ] ) ) ;
735
+
736
+ // Split at block boundary
737
+ let mut a = BitVec :: from_bytes ( & [ 0b10100000 , 0b00010010 , 0b10010010 , 0b00110011 , 0b11110011 ] ) ;
738
+
739
+ let b = a. split_off ( 32 ) ;
740
+
741
+ assert_eq ! ( a. len( ) , 32 ) ;
742
+ assert_eq ! ( b. len( ) , 8 ) ;
743
+
744
+ assert ! ( a. eq_vec( & [ true , false , true , false , false , false , false , false ,
745
+ false , false , false , true , false , false , true , false ,
746
+ true , false , false , true , false , false , true , false ,
747
+ false , false , true , true , false , false , true , true ] ) ) ;
748
+ assert ! ( b. eq_vec( & [ true , true , true , true , false , false , true , true ] ) ) ;
749
+
750
+ // Don't split at block boundary
751
+ let mut a = BitVec :: from_bytes ( & [ 0b10100000 , 0b00010010 , 0b10010010 , 0b00110011 ,
752
+ 0b01101011 , 0b10101101 ] ) ;
753
+
754
+ let b = a. split_off ( 13 ) ;
755
+
756
+ assert_eq ! ( a. len( ) , 13 ) ;
757
+ assert_eq ! ( b. len( ) , 35 ) ;
758
+
759
+ assert ! ( a. eq_vec( & [ true , false , true , false , false , false , false , false ,
760
+ false , false , false , true , false ] ) ) ;
761
+ assert ! ( b. eq_vec( & [ false , true , false , true , false , false , true , false ,
762
+ false , true , false , false , false , true , true , false ,
763
+ false , true , true , false , true , true , false , true ,
764
+ false , true , true , true , false , true , false , true ,
765
+ true , false , true ] ) ) ;
766
+ }
767
+
633
768
mod bench {
634
769
use std:: collections:: BitVec ;
635
770
use std:: u32;
0 commit comments