From cbdaf8f6f9ebfe3c4ce25da8fb4c3bc841711e36 Mon Sep 17 00:00:00 2001 From: Nicolas Kirchner Date: Wed, 2 Aug 2017 22:25:21 +0200 Subject: [PATCH] Optimize `BigInt::from_biguint` and `BigInt::assign_from_slice` It removes useless memory allocations. --- bigint/src/bigint.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/bigint/src/bigint.rs b/bigint/src/bigint.rs index 314d0e5..bae78d7 100644 --- a/bigint/src/bigint.rs +++ b/bigint/src/bigint.rs @@ -1376,13 +1376,13 @@ impl BigInt { /// /// The digits are in little-endian base 2^32. #[inline] - pub fn from_biguint(sign: Sign, data: BigUint) -> BigInt { - if sign == NoSign || data.is_zero() { - return BigInt { - sign: NoSign, - data: Zero::zero(), - }; + pub fn from_biguint(mut sign: Sign, mut data: BigUint) -> BigInt { + if sign == NoSign { + data.assign_from_slice(&[]); + } else if data.is_zero() { + sign = NoSign; } + BigInt { sign: sign, data: data, @@ -1398,15 +1398,15 @@ impl BigInt { /// Reinitializes a `BigInt`. #[inline] pub fn assign_from_slice(&mut self, sign: Sign, slice: &[BigDigit]) { - // Normalize: - let slice = &slice[..slice.iter().rposition(|&x| x != 0).map_or(0, |i| i + 1)]; - - if sign == NoSign || slice.len() == 0 { + if sign == NoSign { + self.data.assign_from_slice(&[]); self.sign = NoSign; - self.data = Zero::zero(); } else { - self.sign = sign; self.data.assign_from_slice(slice); + self.sign = match self.data.is_zero() { + true => NoSign, + false => sign, + } } }