11use {
2- crate :: { size_hint, Arbitrary , Result , Unstructured } ,
2+ crate :: { size_hint, Arbitrary , MaxRecursionReached , Result , Unstructured } ,
33 core:: {
44 mem,
55 ops:: { Bound , Range , RangeBounds , RangeFrom , RangeInclusive , RangeTo , RangeToInclusive } ,
@@ -25,53 +25,57 @@ macro_rules! impl_range {
2525
2626 #[ inline]
2727 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 > {
2833 #[ allow( clippy:: redundant_closure_call) ]
2934 $size_hint_closure( depth)
3035 }
3136 }
3237 } ;
3338}
34-
3539impl_range ! (
3640 Range <A >,
3741 |r: & Range <A >| ( r. start. clone( ) , r. end. clone( ) ) ,
3842 ( A , A ) ,
3943 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+ ) )
4448) ;
4549impl_range ! (
4650 RangeFrom <A >,
4751 |r: & RangeFrom <A >| r. start. clone( ) ,
4852 A ,
4953 unbounded_range( |a| a..) ,
50- |depth| <A as Arbitrary >:: size_hint ( depth)
54+ |depth| <A as Arbitrary >:: try_size_hint ( depth)
5155) ;
5256impl_range ! (
5357 RangeInclusive <A >,
5458 |r: & RangeInclusive <A >| ( r. start( ) . clone( ) , r. end( ) . clone( ) ) ,
5559 ( A , A ) ,
5660 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+ ) )
6165) ;
6266impl_range ! (
6367 RangeTo <A >,
6468 |r: & RangeTo <A >| r. end. clone( ) ,
6569 A ,
6670 unbounded_range( |b| ..b) ,
67- |depth| <A as Arbitrary >:: size_hint ( depth)
71+ |depth| <A as Arbitrary >:: try_size_hint ( depth)
6872) ;
6973impl_range ! (
7074 RangeToInclusive <A >,
7175 |r: & RangeToInclusive <A >| r. end. clone( ) ,
7276 A ,
7377 unbounded_range( |b| ..=b) ,
74- |depth| <A as Arbitrary >:: size_hint ( depth)
78+ |depth| <A as Arbitrary >:: try_size_hint ( depth)
7579) ;
7680
7781pub ( crate ) fn bounded_range < CB , I , R > ( bounds : ( I , I ) , cb : CB ) -> R
@@ -110,9 +114,14 @@ where
110114
111115 #[ inline]
112116 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) ?) ,
115124 ( 1 , Some ( 1 ) ) ,
116- )
125+ ) )
117126 }
118127}
0 commit comments