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