bolero_generator/
array.rs1use crate::{Driver, TypeGenerator, TypeGeneratorWithParams, TypeValueGenerator, ValueGenerator};
2
3impl<T: TypeGenerator, const LEN: usize> TypeGenerator for [T; LEN] {
4 fn generate<D: Driver>(driver: &mut D) -> Option<Self> {
5 driver.enter_product::<Self, _, _>(|driver| {
6 let mut maybe_init: [Option<T>; LEN] = [(); LEN].map(|_| None);
10
11 for value in &mut maybe_init {
12 *value = Some(T::generate(driver)?);
13 }
14
15 Some(maybe_init.map(|t| t.unwrap()))
16 })
17 }
18
19 fn mutate<D: Driver>(&mut self, driver: &mut D) -> Option<()> {
20 driver.enter_product::<Self, _, _>(|driver| {
21 for item in self.iter_mut() {
22 item.mutate(driver)?;
23 }
24 Some(())
25 })
26 }
27}
28
29impl<G: ValueGenerator, const LEN: usize> ValueGenerator for [G; LEN] {
30 type Output = [G::Output; LEN];
31
32 fn generate<D: Driver>(&self, driver: &mut D) -> Option<Self::Output> {
33 driver.enter_product::<Self::Output, _, _>(|driver| {
34 let mut maybe_init: [Option<G::Output>; LEN] = [(); LEN].map(|_| None);
38
39 for (generator, value) in self.iter().zip(&mut maybe_init) {
40 *value = Some(generator.generate(driver)?);
41 }
42
43 Some(maybe_init.map(|t| t.unwrap()))
44 })
45 }
46
47 fn mutate<D: Driver>(&self, driver: &mut D, value: &mut Self::Output) -> Option<()> {
48 driver.enter_product::<Self::Output, _, _>(|driver| {
49 for (generator, value) in self.iter().zip(value.iter_mut()) {
50 generator.mutate(driver, value)?;
51 }
52 Some(())
53 })
54 }
55}
56
57impl<T: TypeGenerator, const LEN: usize> TypeGeneratorWithParams for [T; LEN] {
58 type Output = [TypeValueGenerator<T>; LEN];
59
60 fn gen_with() -> Self::Output {
61 [T::produce(); LEN]
62 }
63}
64
65#[test]
66fn array_type_test() {
67 let _ = generator_test!(produce::<[u8; 10]>());
68}
69
70#[test]
71fn array_gen_test() {
72 let _ = generator_test!([produce::<u8>(), produce::<u8>()]);
73}