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