1use std::fmt::Display;
5
6#[derive(Debug, Default, Clone, Copy, PartialEq, PartialOrd)]
7pub struct Size {
8 width: f64,
9 height: f64,
10}
11
12impl Size {
13 #[must_use]
14 pub const fn new(width: f64, height: f64) -> Self {
15 Self {
16 width,
17 height,
18 }
19 }
20
21 #[must_use]
22 pub const fn width(&self) -> f64 {
23 self.width
24 }
25
26 #[must_use]
27 pub const fn height(&self) -> f64 {
28 self.height
29 }
30}
31
32impl Display for Size {
33 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
34 f.write_fmt(format_args!("{}x{}", self.width, self.height))
35 }
36}
37
38impl From<(f64, f64)> for Size {
39 fn from(value: (f64, f64)) -> Self {
40 Self::new(value.0, value.1)
41 }
42}
43
44impl From<(f32, f32)> for Size {
45 fn from(value: (f32, f32)) -> Self {
46 Self::new(value.0 as f64, value.1 as f64)
47 }
48}
49
50impl From<(i8, i8)> for Size {
51 fn from(value: (i8, i8)) -> Self {
52 Self::new(value.0 as f64, value.1 as f64)
53 }
54}
55
56impl From<(i16, i16)> for Size {
57 fn from(value: (i16, i16)) -> Self {
58 Self::new(value.0 as f64, value.1 as f64)
59 }
60}
61
62impl From<(i32, i32)> for Size {
63 fn from(value: (i32, i32)) -> Self {
64 Self::new(value.0 as f64, value.1 as f64)
65 }
66}
67
68impl From<(i64, i64)> for Size {
69 fn from(value: (i64, i64)) -> Self {
70 Self::new(value.0 as f64, value.1 as f64)
71 }
72}
73
74impl From<(isize, isize)> for Size {
75 fn from(value: (isize, isize)) -> Self {
76 Self::new(value.0 as f64, value.1 as f64)
77 }
78}
79
80impl From<(u8, i8)> for Size {
81 fn from(value: (u8, i8)) -> Self {
82 Self::new(value.0 as f64, value.1 as f64)
83 }
84}
85
86impl From<(u16, i16)> for Size {
87 fn from(value: (u16, i16)) -> Self {
88 Self::new(value.0 as f64, value.1 as f64)
89 }
90}
91
92impl From<(u32, i32)> for Size {
93 fn from(value: (u32, i32)) -> Self {
94 Self::new(value.0 as f64, value.1 as f64)
95 }
96}
97
98impl From<(u64, i64)> for Size {
99 fn from(value: (u64, i64)) -> Self {
100 Self::new(value.0 as f64, value.1 as f64)
101 }
102}
103
104impl From<(usize, isize)> for Size {
105 fn from(value: (usize, isize)) -> Self {
106 Self::new(value.0 as f64, value.1 as f64)
107 }
108}
109
110
111impl From<(i8, u8)> for Size {
112 fn from(value: (i8, u8)) -> Self {
113 Self::new(value.0 as f64, value.1 as f64)
114 }
115}
116
117impl From<(i16, u16)> for Size {
118 fn from(value: (i16, u16)) -> Self {
119 Self::new(value.0 as f64, value.1 as f64)
120 }
121}
122
123impl From<(i32, u32)> for Size {
124 fn from(value: (i32, u32)) -> Self {
125 Self::new(value.0 as f64, value.1 as f64)
126 }
127}
128
129impl From<(i64, u64)> for Size {
130 fn from(value: (i64, u64)) -> Self {
131 Self::new(value.0 as f64, value.1 as f64)
132 }
133}
134
135impl From<(isize, usize)> for Size {
136 fn from(value: (isize, usize)) -> Self {
137 Self::new(value.0 as f64, value.1 as f64)
138 }
139}
140
141impl From<(u8, u8)> for Size {
142 fn from(value: (u8, u8)) -> Self {
143 Self::new(value.0 as f64, value.1 as f64)
144 }
145}
146
147impl From<(u16, u16)> for Size {
148 fn from(value: (u16, u16)) -> Self {
149 Self::new(value.0 as f64, value.1 as f64)
150 }
151}
152
153impl From<(u32, u32)> for Size {
154 fn from(value: (u32, u32)) -> Self {
155 Self::new(value.0 as f64, value.1 as f64)
156 }
157}
158
159impl From<(u64, u64)> for Size {
160 fn from(value: (u64, u64)) -> Self {
161 Self::new(value.0 as f64, value.1 as f64)
162 }
163}
164
165impl From<(usize, usize)> for Size {
166 fn from(value: (usize, usize)) -> Self {
167 Self::new(value.0 as f64, value.1 as f64)
168 }
169}