num_bigint/biguint/
arbitrary.rs

1#![cfg(any(feature = "quickcheck", feature = "arbitrary"))]
2
3use super::{biguint_from_vec, BigUint};
4
5use crate::big_digit::BigDigit;
6#[cfg(feature = "quickcheck")]
7use alloc::boxed::Box;
8use alloc::vec::Vec;
9
10#[cfg(feature = "quickcheck")]
11#[cfg_attr(docsrs, doc(cfg(feature = "quickcheck")))]
12impl quickcheck::Arbitrary for BigUint {
13    fn arbitrary(g: &mut quickcheck::Gen) -> Self {
14        // Use arbitrary from Vec
15        biguint_from_vec(Vec::<BigDigit>::arbitrary(g))
16    }
17
18    fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
19        // Use shrinker from Vec
20        Box::new(self.data.shrink().map(biguint_from_vec))
21    }
22}
23
24#[cfg(feature = "arbitrary")]
25#[cfg_attr(docsrs, doc(cfg(feature = "arbitrary")))]
26impl arbitrary::Arbitrary<'_> for BigUint {
27    fn arbitrary(u: &mut arbitrary::Unstructured<'_>) -> arbitrary::Result<Self> {
28        Ok(biguint_from_vec(Vec::<BigDigit>::arbitrary(u)?))
29    }
30
31    fn arbitrary_take_rest(u: arbitrary::Unstructured<'_>) -> arbitrary::Result<Self> {
32        Ok(biguint_from_vec(Vec::<BigDigit>::arbitrary_take_rest(u)?))
33    }
34
35    fn size_hint(depth: usize) -> (usize, Option<usize>) {
36        Vec::<BigDigit>::size_hint(depth)
37    }
38}