enum_map/
arbitrary.rs

1// SPDX-FileCopyrightText: 2021 Bruno CorrĂȘa Zimmermann <brunoczim@gmail.com>
2// SPDX-FileCopyrightText: 2021 Kamila Borowska <kamila@borowska.pw>
3//
4// SPDX-License-Identifier: MIT OR Apache-2.0
5
6use crate::{enum_map, EnumArray, EnumMap};
7use arbitrary::{Arbitrary, Result, Unstructured};
8
9/// Requires crate feature `"arbitrary"`
10impl<'a, K: EnumArray<V>, V: Arbitrary<'a>> Arbitrary<'a> for EnumMap<K, V> {
11    fn arbitrary(u: &mut Unstructured<'a>) -> Result<EnumMap<K, V>> {
12        Ok(enum_map! {
13            _ => Arbitrary::arbitrary(u)?,
14        })
15    }
16
17    fn size_hint(depth: usize) -> (usize, Option<usize>) {
18        if K::LENGTH == 0 {
19            (0, Some(0))
20        } else {
21            let (lo, hi) = V::size_hint(depth);
22            (
23                lo.saturating_mul(K::LENGTH),
24                hi.and_then(|hi| hi.checked_mul(K::LENGTH)),
25            )
26        }
27    }
28}