diff --git a/src/length.rs b/src/length.rs index a782846..ddda5d1 100644 --- a/src/length.rs +++ b/src/length.rs @@ -14,7 +14,7 @@ use num::Zero; use num_lib::NumCast; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::cmp::Ordering; -use std::ops::{Add, Sub, Mul, Div, Neg}; +use std::ops::{Add, AddAssign, Sub, SubAssign, Mul, Div, Neg}; use std::marker::PhantomData; /// A one-dimensional distance, with value represented by `T` and unit of measurement `Unit`. @@ -67,6 +67,13 @@ impl> Add for Length { } } +// length += length +impl> AddAssign for Length { + fn add_assign(&mut self, other: Length) { + self.0 += other.get(); + } +} + // length - length impl> Sub> for Length { type Output = Length; @@ -75,6 +82,13 @@ impl> Sub> for Length { } } +// length -= length +impl> SubAssign for Length { + fn sub_assign(&mut self, other: Length) { + self.0 -= other.get(); + } +} + // length / length impl> Div> for Length { type Output = ScaleFactor; @@ -205,4 +219,24 @@ mod tests { let negative_zero_feet = -zero_feet; assert_eq!(negative_zero_feet.get(), 0.0); } + + #[test] + fn test_addassign() { + let one_cm: Length = Length::new(10.0); + let mut measurement: Length = Length::new(5.0); + + measurement += one_cm; + + assert_eq!(measurement.get(), 15.0); + } + + #[test] + fn test_subassign() { + let one_cm: Length = Length::new(10.0); + let mut measurement: Length = Length::new(5.0); + + measurement -= one_cm; + + assert_eq!(measurement.get(), -5.0); + } } diff --git a/src/lib.rs b/src/lib.rs index 41a3b5e..d15a24c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,6 +8,8 @@ // except according to those terms. #![feature(asm, custom_derive, plugin, repr_simd, zero_one, test)] +#![feature(augmented_assignments)] +#![feature(op_assign_traits)] #![plugin(serde_macros)]