-
Notifications
You must be signed in to change notification settings - Fork 89
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) } |