diff -r 5fdc41cd0841 -r ff77c9920007 rust/fpnum/src/lib.rs --- a/rust/fpnum/src/lib.rs Tue Oct 16 22:41:25 2018 +0300 +++ b/rust/fpnum/src/lib.rs Tue Oct 16 23:49:44 2018 +0300 @@ -420,11 +420,43 @@ bin_op_impl!(ops::Add, add); bin_op_impl!(ops::Sub, sub); bin_op_impl!(ops::Mul, mul); +bin_op_impl!(ops::Div, div); scalar_bin_op_impl!(ops::Add, add); scalar_bin_op_impl!(ops::Mul, mul); scalar_bin_op_impl!(ops::Sub, sub); scalar_bin_op_impl!(ops::Div, div); +macro_rules! bin_assign_op_impl { + ($typ: tt, $($op: tt)::+, $name: tt, $delegate: tt) => { + bin_assign_op_impl!($typ, $($op)::+<$typ>, $name, $delegate); + }; + ($typ: tt, $($op: tt)::+<$arg: tt>, $name: tt, $delegate: tt) => { + impl $($op)::+<$arg> for $typ { + #[inline] + fn $name(&mut self, rhs: $arg) { + *self = *self $delegate rhs; + } + } + } +} + +bin_assign_op_impl!(FPNum, ops::AddAssign, add_assign, +); +bin_assign_op_impl!(FPNum, ops::SubAssign, sub_assign, -); +bin_assign_op_impl!(FPNum, ops::MulAssign, mul_assign, *); +bin_assign_op_impl!(FPNum, ops::DivAssign, div_assign, /); +bin_assign_op_impl!(FPNum, ops::MulAssign, mul_assign, *); +bin_assign_op_impl!(FPNum, ops::DivAssign, div_assign, /); +bin_assign_op_impl!(FPNum, ops::DivAssign, div_assign, /); + +bin_assign_op_impl!(FPPoint, ops::AddAssign, add_assign, +); +bin_assign_op_impl!(FPPoint, ops::SubAssign, sub_assign, -); +bin_assign_op_impl!(FPPoint, ops::MulAssign, mul_assign, *); +bin_assign_op_impl!(FPPoint, ops::DivAssign, div_assign, /); +bin_assign_op_impl!(FPPoint, ops::AddAssign, add_assign, +); +bin_assign_op_impl!(FPPoint, ops::SubAssign, sub_assign, -); +bin_assign_op_impl!(FPPoint, ops::MulAssign, mul_assign, *); +bin_assign_op_impl!(FPPoint, ops::DivAssign, div_assign, /); + #[inline] pub fn distance(x: T, y: T) -> FPNum where T: ops::Add + ops::Mul + Copy + @@ -508,6 +540,10 @@ assert_eq!(n2_25.sqrt(), n1_5); assert_eq!((n1_5 * n1_5 * n1_5.sqr()).sqrt(), n2_25); + + let mut m = fp!(1); + m += n1_5; + assert_eq!(m, fp!(5/2)); } #[test]