Also implement scalar addition for BigInt

This commit is contained in:
Sam Cappleman-Lynes 2017-06-29 14:07:44 +01:00
parent 1e26bdde81
commit 80feea2722
2 changed files with 38 additions and 0 deletions

View File

@ -362,6 +362,26 @@ impl Add<BigInt> for BigInt {
}
}
forward_all_scalar_binop_to_val_val_commutative!(impl Add<BigDigit> for BigInt, add);
impl Add<BigDigit> for BigInt {
type Output = BigInt;
#[inline]
fn add(self, other: BigDigit) -> BigInt {
match self.sign {
NoSign => From::from(other),
Plus => BigInt::from_biguint(Plus, self.data + other),
Minus =>
match self.data.cmp(&From::from(other)) {
Equal => Zero::zero(),
Less => BigInt::from_biguint(Plus, other - self.data),
Greater => BigInt::from_biguint(Minus, self.data - other),
}
}
}
}
// We want to forward to BigUint::sub, but it's not clear how that will go until
// we compare both sign and magnitude. So we duplicate this body for every
// val/ref combination, deferring that decision to BigUint's own forwarding.

View File

@ -552,6 +552,24 @@ fn test_add() {
}
}
#[test]
fn test_scalar_add() {
for elm in SUM_TRIPLES.iter() {
let (a_vec, b_vec, c_vec) = *elm;
let b = BigInt::from_slice(Plus, b_vec);
let c = BigInt::from_slice(Plus, c_vec);
let (nb, nc) = (-&b, -&c);
if a_vec.len() == 1 {
let a = a_vec[0];
assert_op!(a + b == c);
assert_op!(b + a == c);
assert_op!(a + nc == nb);
assert_op!(nc + a == nb);
}
}
}
#[test]
fn test_sub() {
for elm in SUM_TRIPLES.iter() {