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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//! Signed big integer.

use crate::{
    primitive::Sign::{self, *},
    ubig::UBig,
};

/// Signed big integer.
///
/// Arbitrarily large signed integer.
///
/// # Examples
///
/// ```
/// # use ibig::{ibig, IBig, ParseError};
/// let a = ibig!(a2a123bbb127779cccc123123ccc base 32);
/// let b = ibig!(-0x1231abcd4134);
/// let c = IBig::from_str_radix("a2a123bbb127779cccc123123ccc", 32)?;
/// let d = IBig::from_str_radix("-1231abcd4134", 16)?;
/// assert_eq!(a, c);
/// assert_eq!(b, d);
/// Ok::<(), ParseError>(())
/// ```
#[derive(Eq, PartialEq)]
pub struct IBig {
    sign: Sign,
    magnitude: UBig,
}

impl IBig {
    pub(crate) fn from_sign_magnitude(mut sign: Sign, magnitude: UBig) -> IBig {
        if magnitude.is_zero() {
            sign = Positive;
        }
        IBig { sign, magnitude }
    }

    pub(crate) fn sign(&self) -> Sign {
        self.sign
    }

    pub(crate) fn magnitude(&self) -> &UBig {
        &self.magnitude
    }

    pub(crate) fn into_sign_magnitude(self) -> (Sign, UBig) {
        (self.sign, self.magnitude)
    }

    /// Is the number smaller than 0?
    ///
    /// # Examples
    /// ```
    /// # use ibig::ibig;
    /// assert_eq!(ibig!(-5).is_negative(), true);
    /// assert_eq!(ibig!(0).is_negative(), false);
    /// assert_eq!(ibig!(5).is_negative(), false);
    /// ```
    pub fn is_negative(&self) -> bool {
        self.sign == Negative
    }

    /// Is the number greater than 0?
    ///
    /// # Examples
    /// ```
    /// # use ibig::ibig;
    /// assert_eq!(ibig!(-5).is_positive(), false);
    /// assert_eq!(ibig!(0).is_positive(), false);
    /// assert_eq!(ibig!(5).is_positive(), true);
    /// ```
    pub fn is_positive(&self) -> bool {
        self.sign == Positive && !self.magnitude.is_zero()
    }
}