Bugfix
[kaka/rust-sdl-test.git] / src / common.rs
1 use std::ops::{Add, AddAssign};
2
3 #[macro_export]
4 macro_rules! point {
5     ( $x:expr, $y:expr ) => { Point2D { x:$x, y:$y } };
6 }
7
8 #[derive(Debug, Copy, Clone, PartialEq)]
9 pub struct Point2D<T> {
10     pub x: T,
11     pub y: T,
12 }
13
14 impl Point2D<f64> {
15     pub fn length(self) -> f64 {
16         ((self.x * self.x) + (self.y * self.y)).sqrt()
17     }
18 }
19
20 impl<T: Add<Output=T>> Add for Point2D<T> {
21     type Output = Point2D<T>;
22
23     fn add(self, rhs: Point2D<T>) -> Self::Output {
24         Point2D { x: self.x + rhs.x, y: self.y + rhs.y }
25     }
26 }
27
28 impl<T: AddAssign> AddAssign for Point2D<T> {
29     fn add_assign(&mut self, rhs: Point2D<T>) {
30         self.x += rhs.x;
31         self.y += rhs.y;
32     }
33 }
34
35 #[cfg(test)]
36 mod tests {
37     use super::*;
38
39     #[test]
40     fn immutable_copy_of_point() {
41         let a = point!(0, 0);
42         let mut b = a; // Copy
43         assert_eq!(a, b); // PartialEq
44         b.x = 1;
45         assert_ne!(a, b); // PartialEq
46     }
47
48     #[test]
49     fn add_points() {
50         let mut a = point!(1, 0);
51         assert_eq!(a + point!(2, 2), point!(3, 2)); // Add
52         a += point!(2, 2); // AddAssign
53         assert_eq!(a, point!(3, 2));
54     }
55 }