Unnecessary mutability
[kaka/rust-sdl-test.git] / src / common.rs
CommitLineData
296187ca
TW
1use std::ops::{Add, AddAssign};
2
3macro_rules! point {
4 ( $x:expr, $y:expr ) => { Point2D { x:$x, y:$y } };
5}
6
7#[derive(Debug, Copy, Clone, PartialEq)]
8pub struct Point2D<T> {
9 pub x: T,
10 pub y: T,
11}
12
13impl Point2D<f64> {
14 pub fn length(self) -> f64 {
15 ((self.x * self.x) + (self.y * self.y)).sqrt()
16 }
17}
18
19impl<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
27impl<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)]
35mod 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}