X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fcommon.rs;h=283640e87667e53ada0a7ecf6bfb332b98016b5e;hb=98995f2b580d872a5a21b34869fe024fafdf4260;hp=6f000d8762abffc8410b016da5ae28b20c39aa2f;hpb=787dbfb4e03fdc6c6cfdb153e0e8fab2eb3ab2d1;p=kaka%2Frust-sdl-test.git diff --git a/src/common.rs b/src/common.rs index 6f000d8..283640e 100644 --- a/src/common.rs +++ b/src/common.rs @@ -1,8 +1,10 @@ -use std::ops::{Add, AddAssign}; +use std::ops::{Add, AddAssign, Mul}; #[macro_export] macro_rules! point { - ( $x:expr, $y:expr ) => { Point2D { x:$x, y:$y } }; + ( $x:expr, $y:expr ) => { + Point2D { x: $x, y: $y } + }; } #[derive(Debug, Copy, Clone, PartialEq)] @@ -17,11 +19,14 @@ impl Point2D { } } -impl> Add for Point2D { +impl> Add for Point2D { type Output = Point2D; fn add(self, rhs: Point2D) -> Self::Output { - Point2D { x: self.x + rhs.x, y: self.y + rhs.y } + Point2D { + x: self.x + rhs.x, + y: self.y + rhs.y, + } } } @@ -32,6 +37,28 @@ impl AddAssign for Point2D { } } +#[derive(Default)] +pub struct Rect { + pub width: T, + pub height: T, +} + +impl + Copy> Rect { + #[allow(dead_code)] + pub fn area(&self) -> T { + self.width * self.height + } +} + +impl From<(T, T)> for Rect { + fn from(item: (T, T)) -> Self { + Rect { + width: item.0, + height: item.1, + } + } +} + #[cfg(test)] mod tests { use super::*; @@ -52,4 +79,11 @@ mod tests { a += point!(2, 2); // AddAssign assert_eq!(a, point!(3, 2)); } + + #[test] + fn area_for_rect_of_multipliable_type() { + let r: Rect<_> = (30, 20).into(); // the Into trait uses the From trait + assert_eq!(r.area(), 30 * 20); + // let a = Rect::from(("a".to_string(), "b".to_string())).area(); // this doesn't work, because area() is not implemented for String + } }