arbitrary/foreign/core/
tuple.rs

1use crate::{size_hint, Arbitrary, MaxRecursionReached, Result, Unstructured};
2
3macro_rules! arbitrary_tuple {
4    () => {};
5    ($last: ident $($xs: ident)*) => {
6        arbitrary_tuple!($($xs)*);
7
8        impl<'a, $($xs,)* $last> Arbitrary<'a> for ($($xs,)* $last,)
9        where
10            $($xs: Arbitrary<'a>,)*
11            $last: Arbitrary<'a>,
12        {
13            fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
14                Ok(($($xs::arbitrary(u)?,)* Arbitrary::arbitrary(u)?,))
15            }
16
17            #[allow(unused_mut, non_snake_case)]
18            fn arbitrary_take_rest(mut u: Unstructured<'a>) -> Result<Self> {
19                $(let $xs = $xs::arbitrary(&mut u)?;)*
20                let $last = $last::arbitrary_take_rest(u)?;
21                Ok(($($xs,)* $last,))
22            }
23
24            #[inline]
25            fn size_hint(depth: usize) -> (usize, Option<usize>) {
26                Self::try_size_hint(depth).unwrap_or_default()
27            }
28            #[inline]
29            fn try_size_hint(depth: usize) -> Result<(usize, Option<usize>), MaxRecursionReached> {
30                Ok(size_hint::and_all(&[
31                    <$last as Arbitrary>::try_size_hint(depth)?,
32                    $( <$xs as Arbitrary>::try_size_hint(depth)?),*
33                ]))
34            }
35        }
36    };
37}
38arbitrary_tuple!(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z);