1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
use length::Length;
use num::Zero;
use num_lib::NumCast;
use std::fmt;
use std::ops::{Mul, Div};
#[derive(Clone, Copy, Eq, RustcDecodable, RustcEncodable, PartialEq)]
#[cfg_attr(feature = "plugins", derive(HeapSizeOf, Deserialize, Serialize))]
pub struct Size2D<T> {
pub width: T,
pub height: T
}
impl<T: fmt::Debug> fmt::Debug for Size2D<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}×{:?}", self.width, self.height)
}
}
impl<T: fmt::Display> fmt::Display for Size2D<T> {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
write!(formatter, "({}x{})", self.width, self.height)
}
}
impl<T: Clone> Size2D<T> {
pub fn new(width: T, height: T) -> Size2D<T> {
Size2D {
width: width,
height: height
}
}
}
impl<T:Copy + Clone + Mul<T, Output=U>, U> Size2D<T> {
pub fn area(&self) -> U { self.width * self.height }
}
impl<T: Zero> Size2D<T> {
pub fn zero() -> Size2D<T> {
Size2D {
width: Zero::zero(),
height: Zero::zero(),
}
}
}
impl<T: Zero> Zero for Size2D<T> {
fn zero() -> Size2D<T> {
Size2D {
width: Zero::zero(),
height: Zero::zero(),
}
}
}
impl<Scale: Copy, T0: Mul<Scale, Output=T1>, T1: Clone> Mul<Scale> for Size2D<T0> {
type Output = Size2D<T1>;
#[inline]
fn mul(self, scale: Scale) -> Size2D<T1> {
Size2D::new(self.width * scale, self.height * scale)
}
}
impl<Scale: Copy, T0: Div<Scale, Output=T1>, T1: Clone> Div<Scale> for Size2D<T0> {
type Output = Size2D<T1>;
#[inline]
fn div(self, scale: Scale) -> Size2D<T1> {
Size2D::new(self.width / scale, self.height / scale)
}
}
pub type TypedSize2D<Unit, T> = Size2D<Length<Unit, T>>;
impl<Unit, T: Clone> Size2D<Length<Unit, T>> {
pub fn typed(width: T, height: T) -> TypedSize2D<Unit, T> {
Size2D::new(Length::new(width), Length::new(height))
}
pub fn to_untyped(&self) -> Size2D<T> {
Size2D::new(self.width.get(), self.height.get())
}
pub fn from_untyped(p: &Size2D<T>) -> TypedSize2D<Unit, T> {
Size2D::new(Length::new(p.width.clone()), Length::new(p.height.clone()))
}
}
impl<Unit, T0: NumCast + Clone> Size2D<Length<Unit, T0>> {
pub fn cast<T1: NumCast + Clone>(&self) -> Option<Size2D<Length<Unit, T1>>> {
match (self.width.cast(), self.height.cast()) {
(Some(w), Some(h)) => Some(Size2D::new(w, h)),
_ => None
}
}
}
impl<Unit, T: NumCast + Clone> Size2D<Length<Unit, T>> {
pub fn as_f32(&self) -> Size2D<Length<Unit, f32>> {
self.cast().unwrap()
}
pub fn as_uint(&self) -> Size2D<Length<Unit, usize>> {
self.cast().unwrap()
}
}