@@ -626,3 +626,190 @@ fn test_unpack() {
626626 assert_eq ! ( bv. unpack_element( 8 , 10 ) , None ) ;
627627 assert_eq ! ( bv. unpack_element( 1000 , 10 ) , None ) ;
628628}
629+
630+ #[ test]
631+ fn test_extend ( ) {
632+ // test bitvec extend
633+ let mut bv = BitVec :: from_zeros ( 10 ) ;
634+ let bv_ones = BitVec :: from_ones ( 10 ) ;
635+ bv. extend_bitvec ( & bv_ones) ;
636+ assert_eq ! ( bv. len, 20 ) ;
637+ assert_eq ! ( bv. get_bits( 0 , 20 ) , Some ( 0b11111111110000000000 ) ) ;
638+
639+ // extend with an empty bitvec
640+ let mut bv = BitVec :: from_zeros ( 10 ) ;
641+ bv. extend_bitvec ( & BitVec :: default ( ) ) ;
642+ assert_eq ! ( bv. len, 10 ) ;
643+ assert_eq ! ( bv. get_bits( 0 , 10 ) , Some ( 0 ) ) ;
644+
645+ // test extend of empty bitvec
646+ let mut bv = BitVec :: default ( ) ;
647+ let bv_ones = BitVec :: from_ones ( 10 ) ;
648+ bv. extend_bitvec ( & bv_ones) ;
649+ assert_eq ! ( bv. len, 10 ) ;
650+ assert_eq ! ( bv. get_bits( 0 , 10 ) , Some ( 0b1111111111 ) ) ;
651+
652+ // test large vectors
653+ let mut bv = BitVec :: from_zeros ( 1000 ) ;
654+ let bv_ones = BitVec :: from_ones ( 1000 ) ;
655+ bv. extend_bitvec ( & bv_ones) ;
656+ assert_eq ! ( bv. len, 2000 ) ;
657+ // sanity check:
658+ assert_eq ! ( bv. get_bits( 64 , 64 ) , Some ( 0 ) ) ;
659+ assert_eq ! ( bv. get_bits( 1064 , 64 ) , Some ( u64 :: MAX ) ) ;
660+
661+ // test aligned vectors
662+ let mut bv = BitVec :: from_zeros ( 64 ) ;
663+ let bv_ones = BitVec :: from_ones ( 64 ) ;
664+ bv. extend_bitvec ( & bv_ones) ;
665+ assert_eq ! ( bv. len, 128 ) ;
666+ assert_eq ! ( bv. get_bits( 0 , 64 ) , Some ( 0 ) ) ;
667+ assert_eq ! ( bv. get_bits( 64 , 64 ) , Some ( u64 :: MAX ) ) ;
668+ }
669+
670+ #[ test]
671+ fn test_split_at ( ) {
672+ // test the split_at(_unchecked) function
673+ let mut bv = BitVec :: from_zeros ( 64 ) ;
674+ bv. flip_bit ( 1 ) ;
675+ bv. flip_bit ( 3 ) ;
676+
677+ // check splitting at 1
678+ let ( left, right) = bv. split_at_unchecked ( 2 ) ;
679+ assert_eq ! ( left. len, 2 ) ;
680+ assert_eq ! ( right. len, 62 ) ;
681+ assert_eq ! ( left. get( 0 ) , Some ( 0 ) ) ;
682+ assert_eq ! ( left. get( 1 ) , Some ( 1 ) ) ;
683+ assert_eq ! ( right. get( 0 ) , Some ( 0 ) ) ;
684+ assert_eq ! ( right. get( 1 ) , Some ( 1 ) ) ;
685+ assert_eq ! ( right. get_bits( 2 , 60 ) , Some ( 0 ) ) ;
686+
687+ // check splitting at 0
688+ let bv = BitVec :: from_zeros ( 1000 ) ;
689+ let ( left, right) = bv. split_at_unchecked ( 0 ) ;
690+ assert_eq ! ( left. len, 0 ) ;
691+ assert_eq ! ( right. len, 1000 ) ;
692+ assert_eq ! ( right. get( 999 ) , Some ( 0 ) ) ;
693+
694+ // check splitting at the end
695+ let bv = BitVec :: from_zeros ( 1000 ) ;
696+ let ( left, right) = bv. split_at_unchecked ( 1000 ) ;
697+ assert_eq ! ( left. len, 1000 ) ;
698+ assert_eq ! ( right. len, 0 ) ;
699+ assert_eq ! ( left. get( 999 ) , Some ( 0 ) ) ;
700+
701+ // check splitting aligned
702+ let bv = BitVec :: from_ones ( 128 ) ;
703+ let ( left, right) = bv. split_at_unchecked ( 64 ) ;
704+ assert_eq ! ( left. len, 64 ) ;
705+ assert_eq ! ( right. len, 64 ) ;
706+ assert_eq ! ( left. get_bits( 0 , 64 ) , Some ( u64 :: MAX ) ) ;
707+ assert_eq ! ( right. get_bits( 0 , 64 ) , Some ( u64 :: MAX ) ) ;
708+
709+ // check splitting in single limb
710+ let bv = BitVec :: from_ones ( 20 ) ;
711+ let ( left, right) = bv. split_at_unchecked ( 10 ) ;
712+ assert_eq ! ( left. len, 10 ) ;
713+ assert_eq ! ( right. len, 10 ) ;
714+
715+ // check splitting empty vector
716+ let bv = BitVec :: default ( ) ;
717+ let ( left, right) = bv. split_at_unchecked ( 0 ) ;
718+ assert_eq ! ( left. len, 0 ) ;
719+ assert_eq ! ( right. len, 0 ) ;
720+ }
721+
722+ #[ test]
723+ fn test_split_at_result ( ) {
724+ // check splitting at 1
725+ let mut bv = BitVec :: from_zeros ( 2 ) ;
726+ bv. flip_bit ( 1 ) ;
727+ let ( left, right) = bv. split_at ( 1 ) . expect ( "failed to split" ) ;
728+ assert_eq ! ( left. len, 1 ) ;
729+ assert_eq ! ( right. len, 1 ) ;
730+ assert_eq ! ( left. get( 0 ) , Some ( 0 ) ) ;
731+ assert_eq ! ( right. get( 0 ) , Some ( 1 ) ) ;
732+
733+ // check splitting at 0
734+ let bv = BitVec :: from_zeros ( 2 ) ;
735+ let ( left, right) = bv. split_at ( 0 ) . expect ( "failed to split" ) ;
736+ assert_eq ! ( left. len, 0 ) ;
737+ assert_eq ! ( right. len, 2 ) ;
738+
739+ // check splitting at the end
740+ let bv = BitVec :: from_zeros ( 2 ) ;
741+ let ( left, right) = bv. split_at ( 2 ) . expect ( "failed to split" ) ;
742+ assert_eq ! ( left. len, 2 ) ;
743+ assert_eq ! ( right. len, 0 ) ;
744+
745+ // check splitting past the end
746+ let bv = BitVec :: from_zeros ( 2 ) ;
747+ let result = bv. split_at ( 3 ) ;
748+ assert ! ( result. is_err( ) ) ;
749+
750+ // check splitting empty vec
751+ let bv = BitVec :: default ( ) ;
752+ let ( left, right) = bv. split_at ( 0 ) . expect ( "failed to split" ) ;
753+ assert ! ( left. is_empty( ) ) ;
754+ assert ! ( right. is_empty( ) ) ;
755+ }
756+
757+ #[ test]
758+ fn test_splitting_limbs ( ) {
759+ // this test might overlap with test_split_at.
760+ // we test all variations of splitting in limbs of bit vecs
761+
762+ // check splitting inside a limb, with the end inside the next limb
763+ let mut bv = BitVec :: from_zeros ( 68 ) ;
764+ bv. flip_bit ( 60 ) ;
765+ let ( left, right) = bv. split_at ( 60 ) . expect ( "failed to split" ) ;
766+ assert_eq ! ( left. len, 60 ) ;
767+ assert_eq ! ( right. len, 8 ) ;
768+ assert_eq ! ( left. get( 0 ) , Some ( 0 ) ) ;
769+ assert_eq ! ( right. get( 0 ) , Some ( 1 ) ) ;
770+
771+ // check splitting inside a limb, with the complete next limb being the final limb
772+ let mut bv = BitVec :: from_zeros ( 128 ) ;
773+ bv. flip_bit ( 60 ) ;
774+ let ( left, right) = bv. split_at ( 60 ) . expect ( "failed to split" ) ;
775+ assert_eq ! ( left. len, 60 ) ;
776+ assert_eq ! ( right. len, 68 ) ;
777+ assert_eq ! ( left. get( 0 ) , Some ( 0 ) ) ;
778+ assert_eq ! ( right. get( 0 ) , Some ( 1 ) ) ;
779+
780+ // check splitting inside a limb, with a complete and then partial limb following
781+ let mut bv = BitVec :: from_zeros ( 140 ) ;
782+ bv. flip_bit ( 60 ) ;
783+ let ( left, right) = bv. split_at ( 60 ) . expect ( "failed to split" ) ;
784+ assert_eq ! ( left. len, 60 ) ;
785+ assert_eq ! ( right. len, 80 ) ;
786+ assert_eq ! ( left. get( 0 ) , Some ( 0 ) ) ;
787+ assert_eq ! ( right. get( 0 ) , Some ( 1 ) ) ;
788+
789+ // check splitting at the beginning of a limb, with the end inside the next limb
790+ let mut bv = BitVec :: from_zeros ( 144 ) ;
791+ bv. flip_bit ( 64 ) ;
792+ let ( left, right) = bv. split_at ( 64 ) . expect ( "failed to split" ) ;
793+ assert_eq ! ( left. len, 64 ) ;
794+ assert_eq ! ( right. len, 80 ) ;
795+ assert_eq ! ( left. get( 0 ) , Some ( 0 ) ) ;
796+ assert_eq ! ( right. get( 0 ) , Some ( 1 ) ) ;
797+
798+ // check splitting at the beginning of a limb, with the complete next limb being the final limb
799+ let mut bv = BitVec :: from_zeros ( 192 ) ;
800+ bv. flip_bit ( 64 ) ;
801+ let ( left, right) = bv. split_at ( 64 ) . expect ( "failed to split" ) ;
802+ assert_eq ! ( left. len, 64 ) ;
803+ assert_eq ! ( right. len, 128 ) ;
804+ assert_eq ! ( left. get( 0 ) , Some ( 0 ) ) ;
805+ assert_eq ! ( right. get( 0 ) , Some ( 1 ) ) ;
806+
807+ // check splitting at the beginning of a limb, with a complete and then partial limb following
808+ let mut bv = BitVec :: from_zeros ( 200 ) ;
809+ bv. flip_bit ( 64 ) ;
810+ let ( left, right) = bv. split_at ( 64 ) . expect ( "failed to split" ) ;
811+ assert_eq ! ( left. len, 64 ) ;
812+ assert_eq ! ( right. len, 136 ) ;
813+ assert_eq ! ( left. get( 0 ) , Some ( 0 ) ) ;
814+ assert_eq ! ( right. get( 0 ) , Some ( 1 ) ) ;
815+ }
0 commit comments