malachite_nz/integer/
mod.rs1use crate::natural::Natural;
10use alloc::string::String;
11use malachite_base::named::Named;
12use malachite_base::num::basic::traits::{NegativeOne, One, Two, Zero};
13
14#[derive(Clone, Hash, Eq, PartialEq)]
19#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
20#[cfg_attr(
21 feature = "serde",
22 serde(try_from = "SerdeInteger", into = "SerdeInteger")
23)]
24pub struct Integer {
25 pub(crate) sign: bool,
27 pub(crate) abs: Natural,
28}
29
30#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
31#[cfg_attr(feature = "serde", serde(transparent))]
32pub(crate) struct SerdeInteger(String);
33
34impl Integer {
35 #[cfg(feature = "test_build")]
40 pub fn is_valid(&self) -> bool {
41 self.abs.is_valid() && (self.sign || self.abs != 0)
42 }
43}
44
45macro_rules! integer_zero {
46 () => {
47 Integer {
48 sign: true,
49 abs: Natural::ZERO,
50 }
51 };
52}
53
54macro_rules! integer_one {
55 () => {
56 Integer {
57 sign: true,
58 abs: Natural::ONE,
59 }
60 };
61}
62
63macro_rules! integer_two {
64 () => {
65 Integer {
66 sign: true,
67 abs: Natural::TWO,
68 }
69 };
70}
71
72macro_rules! integer_negative_one {
73 () => {
74 Integer {
75 sign: false,
76 abs: Natural::ONE,
77 }
78 };
79}
80
81impl Zero for Integer {
83 const ZERO: Self = integer_zero!();
84}
85
86impl One for Integer {
88 const ONE: Self = integer_one!();
89}
90
91impl Two for Integer {
93 const TWO: Self = integer_two!();
94}
95
96impl NegativeOne for Integer {
98 const NEGATIVE_ONE: Self = integer_negative_one!();
99}
100
101impl Default for Integer {
102 fn default() -> Self {
104 Self::ZERO
105 }
106}
107
108impl_named!(Integer);
110
111pub mod arithmetic;
113pub mod comparison;
115pub mod conversion;
118pub mod exhaustive;
120pub mod logic;
122#[cfg(feature = "random")]
123pub mod random;