@@ -993,6 +993,80 @@ fn test_rsplitnator() {
993
993
assert ! ( xs. rsplitn( 0 , |x| * x % 2 == 0 ) . next( ) . is_none( ) ) ;
994
994
}
995
995
996
+ #[ test]
997
+ fn test_split_iterators_size_hint ( ) {
998
+ for len in 0 ..=2 {
999
+ let mut v: Vec < u8 > = ( 0 ..len) . collect ( ) ;
1000
+ fn verify_descending ( sequence : & [ usize ] , context : & str ) {
1001
+ let len = sequence. len ( ) ;
1002
+ let target: Vec < usize > = ( 0 ..len) . rev ( ) . collect ( ) ;
1003
+ assert_eq ! ( sequence, target, "while testing: {}" , context) ;
1004
+ }
1005
+
1006
+ macro_rules! test_size_hint {
1007
+ ( $create_iterator: expr) => { {
1008
+ // with a predicate always returning false, the split*-iterators
1009
+ // become maximally short, so the size_hint lower bounds are correct
1010
+
1011
+ macro_rules! p {
1012
+ ( ) => {
1013
+ |_| false
1014
+ } ;
1015
+ }
1016
+ let mut short_iterator = $create_iterator;
1017
+ let mut lower_bounds = vec![ short_iterator. size_hint( ) . 0 ] ;
1018
+ while let Some ( _) = short_iterator. next( ) {
1019
+ lower_bounds. push( short_iterator. size_hint( ) . 0 ) ;
1020
+ }
1021
+ verify_descending( & lower_bounds, stringify!( $create_iterator) ) ;
1022
+ }
1023
+ {
1024
+ // with a predicate always returning true, the split*-iterators
1025
+ // become maximally long, so the size_hint upper bounds are correct
1026
+
1027
+ macro_rules! p {
1028
+ ( ) => {
1029
+ |_| true
1030
+ } ;
1031
+ }
1032
+ let mut long_iterator = $create_iterator;
1033
+ let mut upper_bounds = vec![
1034
+ long_iterator. size_hint( ) . 1 . expect( "split*-methods have known upper bound" ) ,
1035
+ ] ;
1036
+ while let Some ( _) = long_iterator. next( ) {
1037
+ upper_bounds. push(
1038
+ long_iterator. size_hint( ) . 1 . expect( "split*-methods have known upper bound" ) ,
1039
+ ) ;
1040
+ }
1041
+ verify_descending( & upper_bounds, stringify!( $create_iterator) ) ;
1042
+ } } ;
1043
+ }
1044
+
1045
+ test_size_hint ! ( v. split( p!( ) ) ) ;
1046
+ test_size_hint ! ( v. split_mut( p!( ) ) ) ;
1047
+ test_size_hint ! ( v. splitn( 0 , p!( ) ) ) ;
1048
+ test_size_hint ! ( v. splitn( 1 , p!( ) ) ) ;
1049
+ test_size_hint ! ( v. splitn( 2 , p!( ) ) ) ;
1050
+ test_size_hint ! ( v. splitn( 3 , p!( ) ) ) ;
1051
+ test_size_hint ! ( v. splitn_mut( 0 , p!( ) ) ) ;
1052
+ test_size_hint ! ( v. splitn_mut( 1 , p!( ) ) ) ;
1053
+ test_size_hint ! ( v. splitn_mut( 2 , p!( ) ) ) ;
1054
+ test_size_hint ! ( v. splitn_mut( 3 , p!( ) ) ) ;
1055
+ test_size_hint ! ( v. split_inclusive( p!( ) ) ) ;
1056
+ test_size_hint ! ( v. split_inclusive_mut( p!( ) ) ) ;
1057
+ test_size_hint ! ( v. rsplit( p!( ) ) ) ;
1058
+ test_size_hint ! ( v. rsplit_mut( p!( ) ) ) ;
1059
+ test_size_hint ! ( v. rsplitn( 0 , p!( ) ) ) ;
1060
+ test_size_hint ! ( v. rsplitn( 1 , p!( ) ) ) ;
1061
+ test_size_hint ! ( v. rsplitn( 2 , p!( ) ) ) ;
1062
+ test_size_hint ! ( v. rsplitn( 3 , p!( ) ) ) ;
1063
+ test_size_hint ! ( v. rsplitn_mut( 0 , p!( ) ) ) ;
1064
+ test_size_hint ! ( v. rsplitn_mut( 1 , p!( ) ) ) ;
1065
+ test_size_hint ! ( v. rsplitn_mut( 2 , p!( ) ) ) ;
1066
+ test_size_hint ! ( v. rsplitn_mut( 3 , p!( ) ) ) ;
1067
+ }
1068
+ }
1069
+
996
1070
#[ test]
997
1071
fn test_windowsator ( ) {
998
1072
let v = & [ 1 , 2 , 3 , 4 ] ;
0 commit comments