From 3c7441ab0a2658efb98dfaa1c912d72bec3e6257 Mon Sep 17 00:00:00 2001 From: Colin Davidson Date: Mon, 18 Jan 2016 21:14:32 -0800 Subject: [PATCH] Add Binary, Octal to BigUint. Add UpperHex, LowerHex, Binary, Octal to BigInt --- src/bigint.rs | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/src/bigint.rs b/src/bigint.rs index 65edeb6..d10c3b5 100644 --- a/src/bigint.rs +++ b/src/bigint.rs @@ -255,6 +255,18 @@ impl fmt::UpperHex for BigUint { } } +impl fmt::Binary for BigUint { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.to_str_radix(2)) + } +} + +impl fmt::Octal for BigUint { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.to_str_radix(8)) + } +} + impl FromStr for BigUint { type Err = ParseBigIntError; @@ -1838,6 +1850,30 @@ impl fmt::Display for BigInt { } } +impl fmt::Binary for BigInt { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.to_str_radix(2)) + } +} + +impl fmt::Octal for BigInt { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.to_str_radix(8)) + } +} + +impl fmt::LowerHex for BigInt { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.to_str_radix(16)) + } +} + +impl fmt::UpperHex for BigInt { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.to_str_radix(16).to_ascii_uppercase()) + } +} + impl FromStr for BigInt { type Err = ParseBigIntError; @@ -3741,6 +3777,24 @@ mod biguint_tests { assert_eq!(format!("{:X}", hello), "48656C6C6F20776F726C6421"); } + #[test] + fn test_binary() { + let a = BigUint::parse_bytes(b"A", 16).unwrap(); + let hello = BigUint::parse_bytes("224055342307539".as_bytes(), 10).unwrap(); + + assert_eq!(format!("{:b}", a), "1010"); + assert_eq!(format!("{:b}", hello), "110010111100011011110011000101101001100011010011"); + } + + #[test] + fn test_octal() { + let a = BigUint::parse_bytes(b"A", 16).unwrap(); + let hello = BigUint::parse_bytes("22405534230753963835153736737".as_bytes(), 10).unwrap(); + + assert_eq!(format!("{:o}", a), "12"); + assert_eq!(format!("{:o}", hello), "22062554330674403566756233062041"); + } + #[test] fn test_factor() { fn factor(n: usize) -> BigUint { @@ -4027,6 +4081,7 @@ mod bigint_tests { } } + #[test] fn test_hash() { let a = BigInt::new(NoSign, vec!()); @@ -4704,6 +4759,42 @@ mod bigint_tests { let _y = x.to_string(); } + #[test] + fn test_lower_hex() { + let a = BigInt::parse_bytes(b"A", 16).unwrap(); + let hello = BigInt::parse_bytes("-22405534230753963835153736737".as_bytes(), 10).unwrap(); + + assert_eq!(format!("{:x}", a), "a"); + assert_eq!(format!("{:x}", hello), "-48656c6c6f20776f726c6421"); + } + + #[test] + fn test_upper_hex() { + let a = BigInt::parse_bytes(b"A", 16).unwrap(); + let hello = BigInt::parse_bytes("-22405534230753963835153736737".as_bytes(), 10).unwrap(); + + assert_eq!(format!("{:X}", a), "A"); + assert_eq!(format!("{:X}", hello), "-48656C6C6F20776F726C6421"); + } + + #[test] + fn test_binary() { + let a = BigInt::parse_bytes(b"A", 16).unwrap(); + let hello = BigInt::parse_bytes("-224055342307539".as_bytes(), 10).unwrap(); + + assert_eq!(format!("{:b}", a), "1010"); + assert_eq!(format!("{:b}", hello), "-110010111100011011110011000101101001100011010011"); + } + + #[test] + fn test_octal() { + let a = BigInt::parse_bytes(b"A", 16).unwrap(); + let hello = BigInt::parse_bytes("-22405534230753963835153736737".as_bytes(), 10).unwrap(); + + assert_eq!(format!("{:o}", a), "12"); + assert_eq!(format!("{:o}", hello), "-22062554330674403566756233062041"); + } + #[test] fn test_neg() { assert!(-BigInt::new(Plus, vec!(1, 1, 1)) ==