X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fcommon.rs;h=283640e87667e53ada0a7ecf6bfb332b98016b5e;hb=6ba7aef184300a81cb7fb9533e926f663c0f806f;hp=f3b3373fcf4c553018cce9926aac751f3fe8f26e;hpb=296187ca027364405cf2fd95e727d5d1eaaec4fc;p=kaka%2Frust-sdl-test.git diff --git a/src/common.rs b/src/common.rs index f3b3373..283640e 100644 --- a/src/common.rs +++ b/src/common.rs @@ -1,7 +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)] @@ -16,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, + } } } @@ -31,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::*; @@ -51,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 + } }