@@ -630,6 +630,141 @@ fn test_bit_vec_extend() {
630630 0b01001001 , 0b10010010 , 0b10111101 ] ) ) ;
631631}
632632
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+
633768mod bench {
634769 use std:: collections:: BitVec ;
635770 use std:: u32;
0 commit comments