Addition!
This commit is contained in:
@@ -5,7 +5,6 @@
|
|||||||
//! of course, but that's its origin.
|
//! of course, but that's its origin.
|
||||||
|
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
use std::iter::repeat;
|
|
||||||
use std::ops::*;
|
use std::ops::*;
|
||||||
|
|
||||||
/// A 512-bit unsigned value
|
/// A 512-bit unsigned value
|
||||||
@@ -401,6 +400,70 @@ impl<'a> Shr<usize> for &'a U512 {
|
|||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
impl AddAssign<U512> for U512 {
|
||||||
|
fn add_assign(&mut self, rhs: U512) {
|
||||||
|
self.add_assign(&rhs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> AddAssign<&'a U512> for U512 {
|
||||||
|
fn add_assign(&mut self, rhs: &U512) {
|
||||||
|
let mut carry = 0;
|
||||||
|
|
||||||
|
for i in 0..9 {
|
||||||
|
let a = self.contents[i];
|
||||||
|
let b = rhs.contents[i];
|
||||||
|
let total = a + b + carry;
|
||||||
|
|
||||||
|
carry = total >> 63;
|
||||||
|
self.contents[i] = total & 0x7FFFFFFFFFFFFFFF;
|
||||||
|
}
|
||||||
|
self.contents[8] &= 0xFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Add<U512> for U512 {
|
||||||
|
type Output = U512;
|
||||||
|
|
||||||
|
fn add(self, rhs: U512) -> U512 {
|
||||||
|
let mut res = self.clone();
|
||||||
|
res.add_assign(rhs);
|
||||||
|
res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Add<U512> for &'a U512 {
|
||||||
|
type Output = U512;
|
||||||
|
|
||||||
|
fn add(self, rhs: U512) -> U512 {
|
||||||
|
let mut res = self.clone();
|
||||||
|
res.add_assign(rhs);
|
||||||
|
res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Add<&'a U512> for U512 {
|
||||||
|
type Output = U512;
|
||||||
|
|
||||||
|
fn add(self, rhs: &U512) -> U512 {
|
||||||
|
let mut res = self.clone();
|
||||||
|
res.add_assign(rhs);
|
||||||
|
res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a,'b> Add<&'a U512> for &'b U512 {
|
||||||
|
type Output = U512;
|
||||||
|
|
||||||
|
fn add(self, rhs: &U512) -> U512 {
|
||||||
|
let mut res = self.clone();
|
||||||
|
res.add_assign(rhs);
|
||||||
|
res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use quickcheck::{Arbitrary,Gen};
|
use quickcheck::{Arbitrary,Gen};
|
||||||
@@ -594,4 +657,26 @@ mod test {
|
|||||||
assert_eq!(U512{ contents: [0,4,0,0,0,0,0,0,0] } >> 65,
|
assert_eq!(U512{ contents: [0,4,0,0,0,0,0,0,0] } >> 65,
|
||||||
U512{ contents: [1,0,0,0,0,0,0,0,0] });
|
U512{ contents: [1,0,0,0,0,0,0,0,0] });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn add_tests() {
|
||||||
|
assert_eq!(U512{ contents: [1,1,1,1,1,1,1,1,1] } +
|
||||||
|
U512{ contents: [1,1,1,1,1,1,1,1,1] },
|
||||||
|
U512{ contents: [2,2,2,2,2,2,2,2,2] });
|
||||||
|
assert_eq!(U512{ contents: [1,0,0,0,0,0,0,0,0] } +
|
||||||
|
U512{ contents: [0x7FFFFFFFFFFFFFFF,0,0,0,0,0,0,0,0] },
|
||||||
|
U512{ contents: [0,1,0,0,0,0,0,0,0] });
|
||||||
|
assert_eq!(U512{ contents: [0,0,0,0,0,0,0,0,1] } +
|
||||||
|
U512{ contents: [0,0,0,0,0,0,0,0,0xFF] },
|
||||||
|
U512{ contents: [0,0,0,0,0,0,0,0,0] });
|
||||||
|
}
|
||||||
|
|
||||||
|
quickcheck! {
|
||||||
|
fn add_symmetry(a: U512, b: U512) -> bool {
|
||||||
|
(&a + &b) == (&b + &a)
|
||||||
|
}
|
||||||
|
fn add_commutivity(a: U512, b: U512, c: U512) -> bool {
|
||||||
|
(&a + (&b + &c)) == ((&a + &b) + &c)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user