cw_bigint/bigint/
arbitrary.rs

1use super::{BigInt, Sign};
2
3#[cfg(feature = "quickcheck")]
4use crate::std_alloc::Box;
5use crate::BigUint;
6
7#[cfg(feature = "quickcheck")]
8impl quickcheck::Arbitrary for BigInt {
9    fn arbitrary(g: &mut quickcheck::Gen) -> Self {
10        let positive = bool::arbitrary(g);
11        let sign = if positive { Sign::Plus } else { Sign::Minus };
12        Self::from_biguint(sign, BigUint::arbitrary(g))
13    }
14
15    fn shrink(&self) -> Box<dyn Iterator<Item = Self>> {
16        let sign = self.sign();
17        let unsigned_shrink = self.data.shrink();
18        Box::new(unsigned_shrink.map(move |x| BigInt::from_biguint(sign, x)))
19    }
20}
21
22#[cfg(feature = "arbitrary")]
23impl arbitrary::Arbitrary<'_> for BigInt {
24    fn arbitrary(u: &mut arbitrary::Unstructured<'_>) -> arbitrary::Result<Self> {
25        let positive = bool::arbitrary(u)?;
26        let sign = if positive { Sign::Plus } else { Sign::Minus };
27        Ok(Self::from_biguint(sign, BigUint::arbitrary(u)?))
28    }
29
30    fn arbitrary_take_rest(mut u: arbitrary::Unstructured<'_>) -> arbitrary::Result<Self> {
31        let positive = bool::arbitrary(&mut u)?;
32        let sign = if positive { Sign::Plus } else { Sign::Minus };
33        Ok(Self::from_biguint(sign, BigUint::arbitrary_take_rest(u)?))
34    }
35
36    fn size_hint(depth: usize) -> (usize, Option<usize>) {
37        arbitrary::size_hint::and(bool::size_hint(depth), BigUint::size_hint(depth))
38    }
39}