1
1
use {
2
- crate :: { size_hint, Arbitrary , Result , Unstructured } ,
2
+ crate :: { size_hint, Arbitrary , MaxRecursionReached , Result , Unstructured } ,
3
3
core:: {
4
4
mem,
5
5
ops:: { Bound , Range , RangeBounds , RangeFrom , RangeInclusive , RangeTo , RangeToInclusive } ,
@@ -25,53 +25,57 @@ macro_rules! impl_range {
25
25
26
26
#[ inline]
27
27
fn size_hint( depth: usize ) -> ( usize , Option <usize >) {
28
+ Self :: try_size_hint( depth) . unwrap_or_default( )
29
+ }
30
+
31
+ #[ inline]
32
+ fn try_size_hint( depth: usize ) -> Result <( usize , Option <usize >) , MaxRecursionReached > {
28
33
#[ allow( clippy:: redundant_closure_call) ]
29
34
$size_hint_closure( depth)
30
35
}
31
36
}
32
37
} ;
33
38
}
34
-
35
39
impl_range ! (
36
40
Range <A >,
37
41
|r: & Range <A >| ( r. start. clone( ) , r. end. clone( ) ) ,
38
42
( A , A ) ,
39
43
bounded_range( |( a, b) | a..b) ,
40
- |depth| size_hint:: and(
41
- <A as Arbitrary >:: size_hint ( depth) ,
42
- <A as Arbitrary >:: size_hint ( depth)
43
- )
44
+ |depth| Ok ( crate :: size_hint:: and(
45
+ <A as Arbitrary >:: try_size_hint ( depth) ? ,
46
+ <A as Arbitrary >:: try_size_hint ( depth) ? ,
47
+ ) )
44
48
) ;
45
49
impl_range ! (
46
50
RangeFrom <A >,
47
51
|r: & RangeFrom <A >| r. start. clone( ) ,
48
52
A ,
49
53
unbounded_range( |a| a..) ,
50
- |depth| <A as Arbitrary >:: size_hint ( depth)
54
+ |depth| <A as Arbitrary >:: try_size_hint ( depth)
51
55
) ;
52
56
impl_range ! (
53
57
RangeInclusive <A >,
54
58
|r: & RangeInclusive <A >| ( r. start( ) . clone( ) , r. end( ) . clone( ) ) ,
55
59
( A , A ) ,
56
60
bounded_range( |( a, b) | a..=b) ,
57
- |depth| size_hint:: and(
58
- <A as Arbitrary >:: size_hint ( depth) ,
59
- <A as Arbitrary >:: size_hint ( depth)
60
- )
61
+ |depth| Ok ( crate :: size_hint:: and(
62
+ <A as Arbitrary >:: try_size_hint ( depth) ? ,
63
+ <A as Arbitrary >:: try_size_hint ( depth) ? ,
64
+ ) )
61
65
) ;
62
66
impl_range ! (
63
67
RangeTo <A >,
64
68
|r: & RangeTo <A >| r. end. clone( ) ,
65
69
A ,
66
70
unbounded_range( |b| ..b) ,
67
- |depth| <A as Arbitrary >:: size_hint ( depth)
71
+ |depth| <A as Arbitrary >:: try_size_hint ( depth)
68
72
) ;
69
73
impl_range ! (
70
74
RangeToInclusive <A >,
71
75
|r: & RangeToInclusive <A >| r. end. clone( ) ,
72
76
A ,
73
77
unbounded_range( |b| ..=b) ,
74
- |depth| <A as Arbitrary >:: size_hint ( depth)
78
+ |depth| <A as Arbitrary >:: try_size_hint ( depth)
75
79
) ;
76
80
77
81
pub ( crate ) fn bounded_range < CB , I , R > ( bounds : ( I , I ) , cb : CB ) -> R
@@ -110,9 +114,14 @@ where
110
114
111
115
#[ inline]
112
116
fn size_hint ( depth : usize ) -> ( usize , Option < usize > ) {
113
- size_hint:: or (
114
- size_hint:: and ( ( 1 , Some ( 1 ) ) , A :: size_hint ( depth) ) ,
117
+ Self :: try_size_hint ( depth) . unwrap_or_default ( )
118
+ }
119
+
120
+ #[ inline]
121
+ fn try_size_hint ( depth : usize ) -> Result < ( usize , Option < usize > ) , MaxRecursionReached > {
122
+ Ok ( size_hint:: or (
123
+ size_hint:: and ( ( 1 , Some ( 1 ) ) , A :: try_size_hint ( depth) ?) ,
115
124
( 1 , Some ( 1 ) ) ,
116
- )
125
+ ) )
117
126
}
118
127
}
0 commit comments