ibig.rs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. //! Signed big integer.
  2. use crate::sign::Sign::{self, *};
  3. use crate::ubig::UBig;
  4. /// Signed big integer.
  5. ///
  6. /// Arbitrarily large signed integer.
  7. ///
  8. /// # Examples
  9. ///
  10. /// ```
  11. /// # use ibig::{error::ParseError, ibig, IBig};
  12. /// let a = ibig!(a2a123bbb127779cccc123123ccc base 32);
  13. /// let b = ibig!(-0x1231abcd4134);
  14. /// let c = IBig::from_str_radix("a2a123bbb127779cccc123123ccc", 32)?;
  15. /// let d = IBig::from_str_radix("-1231abcd4134", 16)?;
  16. /// assert_eq!(a, c);
  17. /// assert_eq!(b, d);
  18. /// # Ok::<(), ParseError>(())
  19. /// ```
  20. #[derive(Clone, Eq, Hash, PartialEq)]
  21. pub struct IBig {
  22. sign: Sign,
  23. magnitude: UBig,
  24. }
  25. impl IBig {
  26. #[inline]
  27. pub(crate) fn from_sign_magnitude(mut sign: Sign, magnitude: UBig) -> IBig {
  28. if magnitude == UBig::from_word(0) {
  29. sign = Positive;
  30. }
  31. IBig { sign, magnitude }
  32. }
  33. #[inline]
  34. pub(crate) fn sign(&self) -> Sign {
  35. self.sign
  36. }
  37. #[inline]
  38. pub(crate) fn magnitude(&self) -> &UBig {
  39. &self.magnitude
  40. }
  41. #[inline]
  42. pub(crate) fn into_sign_magnitude(self) -> (Sign, UBig) {
  43. (self.sign, self.magnitude)
  44. }
  45. }