use crate::natural::Natural;
use alloc::string::String;
use malachite_base::named::Named;
use malachite_base::num::basic::traits::{NegativeOne, One, Two, Zero};
#[derive(Clone, Hash, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
#[cfg_attr(
feature = "serde",
serde(try_from = "SerdeInteger", into = "SerdeInteger")
)]
pub struct Integer {
pub(crate) sign: bool,
pub(crate) abs: Natural,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(transparent))]
pub(crate) struct SerdeInteger(String);
impl Integer {
#[cfg(feature = "test_build")]
pub fn is_valid(&self) -> bool {
self.abs.is_valid() && (self.sign || self.abs != 0)
}
}
macro_rules! integer_zero {
() => {
Integer {
sign: true,
abs: Natural::ZERO,
}
};
}
macro_rules! integer_one {
() => {
Integer {
sign: true,
abs: Natural::ONE,
}
};
}
macro_rules! integer_two {
() => {
Integer {
sign: true,
abs: Natural::TWO,
}
};
}
macro_rules! integer_negative_one {
() => {
Integer {
sign: false,
abs: Natural::ONE,
}
};
}
impl Zero for Integer {
const ZERO: Self = integer_zero!();
}
impl One for Integer {
const ONE: Self = integer_one!();
}
impl Two for Integer {
const TWO: Self = integer_two!();
}
impl NegativeOne for Integer {
const NEGATIVE_ONE: Self = integer_negative_one!();
}
impl Default for Integer {
fn default() -> Self {
Self::ZERO
}
}
impl_named!(Integer);
pub mod arithmetic;
pub mod comparison;
pub mod conversion;
pub mod exhaustive;
pub mod logic;
#[cfg(feature = "random")]
pub mod random;