-
Notifications
You must be signed in to change notification settings - Fork 90
Closed
Labels
Description
Lines 716 to 797 in ab4adcf
| macro_rules! arbitrary_array { | |
| {$n:expr, ($t:ident, $a:ident) $(($ts:ident, $as:ident))*} => { | |
| arbitrary_array!{($n - 1), $(($ts, $as))*} | |
| impl<T: Arbitrary> Arbitrary for [T; $n] { | |
| fn arbitrary(u: &mut Unstructured<'_>) -> Result<[T; $n]> { | |
| Ok([ | |
| Arbitrary::arbitrary(u)?, | |
| $(<$ts as Arbitrary>::arbitrary(u)?),* | |
| ]) | |
| } | |
| #[allow(unused_mut)] | |
| fn arbitrary_take_rest(mut u: Unstructured<'_>) -> Result<[T; $n]> { | |
| $(let $as = $ts::arbitrary(&mut u)?;)* | |
| let last = Arbitrary::arbitrary_take_rest(u)?; | |
| Ok([ | |
| $($as,)* last | |
| ]) | |
| } | |
| #[inline] | |
| fn size_hint(depth: usize) -> (usize, Option<usize>) { | |
| crate::size_hint::and_all(&[ | |
| <$t as Arbitrary>::size_hint(depth), | |
| $( <$ts as Arbitrary>::size_hint(depth) ),* | |
| ]) | |
| } | |
| #[allow(unused_mut)] // For the `[T; 1]` case. | |
| fn shrink(&self) -> Box<dyn Iterator<Item = Self>> { | |
| let mut i = 0; | |
| let mut shrinkers = [ | |
| self[i].shrink(), | |
| $({ | |
| i += 1; | |
| let t: &$ts = &self[i]; | |
| t.shrink() | |
| }),* | |
| ]; | |
| Box::new(iter::from_fn(move || { | |
| let mut i = 0; | |
| Some([ | |
| shrinkers[i].next()?, | |
| $({ | |
| i += 1; | |
| let t: $ts = shrinkers[i].next()?; | |
| t | |
| }),* | |
| ]) | |
| })) | |
| } | |
| } | |
| }; | |
| ($n: expr,) => {}; | |
| } | |
| impl<T: Arbitrary> Arbitrary for [T; 0] { | |
| fn arbitrary(_: &mut Unstructured<'_>) -> Result<[T; 0]> { | |
| Ok([]) | |
| } | |
| fn arbitrary_take_rest(_: Unstructured<'_>) -> Result<[T; 0]> { | |
| Ok([]) | |
| } | |
| #[inline] | |
| fn size_hint(_: usize) -> (usize, Option<usize>) { | |
| crate::size_hint::and_all(&[]) | |
| } | |
| fn shrink(&self) -> Box<dyn Iterator<Item = Self>> { | |
| Box::new(iter::from_fn(|| None)) | |
| } | |
| } | |
| arbitrary_array! { 32, (T, a) (T, b) (T, c) (T, d) (T, e) (T, f) (T, g) (T, h) | |
| (T, i) (T, j) (T, k) (T, l) (T, m) (T, n) (T, o) (T, p) | |
| (T, q) (T, r) (T, s) (T, u) (T, v) (T, w) (T, x) (T, y) | |
| (T, z) (T, aa) (T, ab) (T, ac) (T, ad) (T, ae) (T, af) | |
| (T, ag) } |