use malachite_base::named::Named;
#[cfg(feature = "test_build")]
use malachite_base::num::arithmetic::traits::CoprimeWith;
use malachite_base::num::basic::traits::{NegativeOne, One, OneHalf, Two, Zero};
use malachite_base::num::logic::traits::SignificantBits;
use malachite_nz::natural::Natural;
#[derive(Clone, Hash, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
#[cfg_attr(
feature = "serde",
serde(try_from = "SerdeRational", into = "SerdeRational")
)]
pub struct Rational {
pub(crate) sign: bool,
pub(crate) numerator: Natural,
pub(crate) denominator: Natural,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub(crate) struct SerdeRational {
#[cfg_attr(feature = "serde", serde(rename = "s"))]
pub(crate) sign: bool,
#[cfg_attr(feature = "serde", serde(rename = "n"))]
pub(crate) numerator: Natural,
#[cfg_attr(feature = "serde", serde(rename = "d"))]
pub(crate) denominator: Natural,
}
impl Rational {
#[cfg(feature = "test_build")]
pub fn is_valid(&self) -> bool {
self.denominator != 0
&& (self.sign || self.numerator != 0)
&& (&self.numerator).coprime_with(&self.denominator)
}
}
impl SignificantBits for &Rational {
fn significant_bits(self) -> u64 {
self.numerator.significant_bits() + self.denominator.significant_bits()
}
}
impl Zero for Rational {
const ZERO: Self = Self {
sign: true,
numerator: Natural::ZERO,
denominator: Natural::ONE,
};
}
impl One for Rational {
const ONE: Self = Self {
sign: true,
numerator: Natural::ONE,
denominator: Natural::ONE,
};
}
impl Two for Rational {
const TWO: Self = Self {
sign: true,
numerator: Natural::TWO,
denominator: Natural::ONE,
};
}
impl NegativeOne for Rational {
const NEGATIVE_ONE: Self = Self {
sign: false,
numerator: Natural::ONE,
denominator: Natural::ONE,
};
}
impl OneHalf for Rational {
const ONE_HALF: Self = Self {
sign: true,
numerator: Natural::ONE,
denominator: Natural::TWO,
};
}
impl Default for Rational {
fn default() -> Self {
Self::ZERO
}
}
impl_named!(Rational);
pub mod arithmetic;
pub mod comparison;
pub mod conversion;
pub mod exhaustive;
#[cfg(feature = "random")]
pub mod random;