@@ -801,3 +801,170 @@ fn overaligned_allocations() {
801
801
assert ! ( v. as_ptr( ) as usize & 0xff == 0 ) ;
802
802
}
803
803
}
804
+
805
+ #[ test]
806
+ fn drain_filter_empty ( ) {
807
+ let mut vec: Vec < i32 > = vec ! [ ] ;
808
+
809
+ {
810
+ let mut iter = vec. drain_filter ( |_| true ) ;
811
+ assert_eq ! ( iter. size_hint( ) , ( 0 , Some ( 0 ) ) ) ;
812
+ assert_eq ! ( iter. next( ) , None ) ;
813
+ assert_eq ! ( iter. size_hint( ) , ( 0 , Some ( 0 ) ) ) ;
814
+ assert_eq ! ( iter. next( ) , None ) ;
815
+ assert_eq ! ( iter. size_hint( ) , ( 0 , Some ( 0 ) ) ) ;
816
+ }
817
+ assert_eq ! ( vec. len( ) , 0 ) ;
818
+ assert_eq ! ( vec, vec![ ] ) ;
819
+ }
820
+
821
+ #[ test]
822
+ fn drain_filter_zst ( ) {
823
+ let mut vec = vec ! [ ( ) , ( ) , ( ) , ( ) , ( ) ] ;
824
+ let initial_len = vec. len ( ) ;
825
+ let mut count = 0 ;
826
+ {
827
+ let mut iter = vec. drain_filter ( |_| true ) ;
828
+ assert_eq ! ( iter. size_hint( ) , ( 0 , Some ( initial_len) ) ) ;
829
+ while let Some ( _) = iter. next ( ) {
830
+ count += 1 ;
831
+ assert_eq ! ( iter. size_hint( ) , ( 0 , Some ( initial_len - count) ) ) ;
832
+ }
833
+ assert_eq ! ( iter. size_hint( ) , ( 0 , Some ( 0 ) ) ) ;
834
+ assert_eq ! ( iter. next( ) , None ) ;
835
+ assert_eq ! ( iter. size_hint( ) , ( 0 , Some ( 0 ) ) ) ;
836
+ }
837
+
838
+ assert_eq ! ( count, initial_len) ;
839
+ assert_eq ! ( vec. len( ) , 0 ) ;
840
+ assert_eq ! ( vec, vec![ ] ) ;
841
+ }
842
+
843
+ #[ test]
844
+ fn drain_filter_false ( ) {
845
+ let mut vec = vec ! [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] ;
846
+
847
+ let initial_len = vec. len ( ) ;
848
+ let mut count = 0 ;
849
+ {
850
+ let mut iter = vec. drain_filter ( |_| false ) ;
851
+ assert_eq ! ( iter. size_hint( ) , ( 0 , Some ( initial_len) ) ) ;
852
+ for _ in iter. by_ref ( ) {
853
+ count += 1 ;
854
+ }
855
+ assert_eq ! ( iter. size_hint( ) , ( 0 , Some ( 0 ) ) ) ;
856
+ assert_eq ! ( iter. next( ) , None ) ;
857
+ assert_eq ! ( iter. size_hint( ) , ( 0 , Some ( 0 ) ) ) ;
858
+ }
859
+
860
+ assert_eq ! ( count, 0 ) ;
861
+ assert_eq ! ( vec. len( ) , initial_len) ;
862
+ assert_eq ! ( vec, vec![ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] ) ;
863
+ }
864
+
865
+ #[ test]
866
+ fn drain_filter_true ( ) {
867
+ let mut vec = vec ! [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] ;
868
+
869
+ let initial_len = vec. len ( ) ;
870
+ let mut count = 0 ;
871
+ {
872
+ let mut iter = vec. drain_filter ( |_| true ) ;
873
+ assert_eq ! ( iter. size_hint( ) , ( 0 , Some ( initial_len) ) ) ;
874
+ while let Some ( _) = iter. next ( ) {
875
+ count += 1 ;
876
+ assert_eq ! ( iter. size_hint( ) , ( 0 , Some ( initial_len - count) ) ) ;
877
+ }
878
+ assert_eq ! ( iter. size_hint( ) , ( 0 , Some ( 0 ) ) ) ;
879
+ assert_eq ! ( iter. next( ) , None ) ;
880
+ assert_eq ! ( iter. size_hint( ) , ( 0 , Some ( 0 ) ) ) ;
881
+ }
882
+
883
+ assert_eq ! ( count, initial_len) ;
884
+ assert_eq ! ( vec. len( ) , 0 ) ;
885
+ assert_eq ! ( vec, vec![ ] ) ;
886
+ }
887
+
888
+ #[ test]
889
+ fn drain_filter_complex ( ) {
890
+
891
+ { // [+xxx++++++xxxxx++++x+x++]
892
+ let mut vec = vec ! [ 1 ,
893
+ 2 , 4 , 6 ,
894
+ 7 , 9 , 11 , 13 , 15 , 17 ,
895
+ 18 , 20 , 22 , 24 , 26 ,
896
+ 27 , 29 , 31 , 33 ,
897
+ 34 ,
898
+ 35 ,
899
+ 36 ,
900
+ 37 , 39 ] ;
901
+
902
+ let removed = vec. drain_filter ( |x| * x % 2 == 0 ) . collect :: < Vec < _ > > ( ) ;
903
+ assert_eq ! ( removed. len( ) , 10 ) ;
904
+ assert_eq ! ( removed, vec![ 2 , 4 , 6 , 18 , 20 , 22 , 24 , 26 , 34 , 36 ] ) ;
905
+
906
+ assert_eq ! ( vec. len( ) , 14 ) ;
907
+ assert_eq ! ( vec, vec![ 1 , 7 , 9 , 11 , 13 , 15 , 17 , 27 , 29 , 31 , 33 , 35 , 37 , 39 ] ) ;
908
+ }
909
+
910
+ { // [xxx++++++xxxxx++++x+x++]
911
+ let mut vec = vec ! [ 2 , 4 , 6 ,
912
+ 7 , 9 , 11 , 13 , 15 , 17 ,
913
+ 18 , 20 , 22 , 24 , 26 ,
914
+ 27 , 29 , 31 , 33 ,
915
+ 34 ,
916
+ 35 ,
917
+ 36 ,
918
+ 37 , 39 ] ;
919
+
920
+ let removed = vec. drain_filter ( |x| * x % 2 == 0 ) . collect :: < Vec < _ > > ( ) ;
921
+ assert_eq ! ( removed. len( ) , 10 ) ;
922
+ assert_eq ! ( removed, vec![ 2 , 4 , 6 , 18 , 20 , 22 , 24 , 26 , 34 , 36 ] ) ;
923
+
924
+ assert_eq ! ( vec. len( ) , 13 ) ;
925
+ assert_eq ! ( vec, vec![ 7 , 9 , 11 , 13 , 15 , 17 , 27 , 29 , 31 , 33 , 35 , 37 , 39 ] ) ;
926
+ }
927
+
928
+ { // [xxx++++++xxxxx++++x+x]
929
+ let mut vec = vec ! [ 2 , 4 , 6 ,
930
+ 7 , 9 , 11 , 13 , 15 , 17 ,
931
+ 18 , 20 , 22 , 24 , 26 ,
932
+ 27 , 29 , 31 , 33 ,
933
+ 34 ,
934
+ 35 ,
935
+ 36 ] ;
936
+
937
+ let removed = vec. drain_filter ( |x| * x % 2 == 0 ) . collect :: < Vec < _ > > ( ) ;
938
+ assert_eq ! ( removed. len( ) , 10 ) ;
939
+ assert_eq ! ( removed, vec![ 2 , 4 , 6 , 18 , 20 , 22 , 24 , 26 , 34 , 36 ] ) ;
940
+
941
+ assert_eq ! ( vec. len( ) , 11 ) ;
942
+ assert_eq ! ( vec, vec![ 7 , 9 , 11 , 13 , 15 , 17 , 27 , 29 , 31 , 33 , 35 ] ) ;
943
+ }
944
+
945
+ { // [xxxxxxxxxx+++++++++++]
946
+ let mut vec = vec ! [ 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 , 18 , 20 ,
947
+ 1 , 3 , 5 , 7 , 9 , 11 , 13 , 15 , 17 , 19 ] ;
948
+
949
+ let removed = vec. drain_filter ( |x| * x % 2 == 0 ) . collect :: < Vec < _ > > ( ) ;
950
+ assert_eq ! ( removed. len( ) , 10 ) ;
951
+ assert_eq ! ( removed, vec![ 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 , 18 , 20 ] ) ;
952
+
953
+ assert_eq ! ( vec. len( ) , 10 ) ;
954
+ assert_eq ! ( vec, vec![ 1 , 3 , 5 , 7 , 9 , 11 , 13 , 15 , 17 , 19 ] ) ;
955
+ }
956
+
957
+ { // [+++++++++++xxxxxxxxxx]
958
+ let mut vec = vec ! [ 1 , 3 , 5 , 7 , 9 , 11 , 13 , 15 , 17 , 19 ,
959
+ 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 , 18 , 20 ] ;
960
+
961
+ let removed = vec. drain_filter ( |x| * x % 2 == 0 ) . collect :: < Vec < _ > > ( ) ;
962
+ assert_eq ! ( removed. len( ) , 10 ) ;
963
+ assert_eq ! ( removed, vec![ 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 , 18 , 20 ] ) ;
964
+
965
+ assert_eq ! ( vec. len( ) , 10 ) ;
966
+ assert_eq ! ( vec, vec![ 1 , 3 , 5 , 7 , 9 , 11 , 13 , 15 , 17 , 19 ] ) ;
967
+ }
968
+ }
969
+
970
+
0 commit comments