Skip to main content

enum_map/
arbitrary.rs

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