@@ -801,3 +801,170 @@ fn overaligned_allocations() {
801801 assert ! ( v. as_ptr( ) as usize & 0xff == 0 ) ;
802802 }
803803}
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