electrical_mesurements/units/
hertz.rs1use std::fmt;
2use std::ops::{Mul, MulAssign, Div, DivAssign, Add, AddAssign, Sub, SubAssign, Rem, RemAssign};
3
4
5#[derive(PartialEq, Debug, Copy, Clone)]
6pub struct Hertz {
7 pub(crate) value: f64,
8}
9
10impl Hertz {
11 pub fn new(value: f64) -> Self {
12 Self { value }
13 }
14
15 pub fn new_kilohertz(value: f64) -> Self {
16 Self { value: value * 1e3 }
17 }
18
19 pub fn new_megahertz(value: f64) -> Self {
20 Self { value: value * 1e6 }
21 }
22
23 pub fn new_gigahertz(value: f64) -> Self {
24 Self { value: value * 1e9 }
25 }
26
27 pub fn reciprocal(&self) -> Self {
28 Self { value: 1.0 / self.value }
29 }
30}
31
32impl Mul<Hertz> for Hertz {
33 type Output = Hertz;
34
35 fn mul(self, other: Hertz) -> Hertz {
36 Hertz::new(self.value * other.value)
37 }
38}
39
40impl Mul<Hertz> for f64 {
41 type Output = Hertz;
42
43 fn mul(self, other: Hertz) -> Hertz {
44 Hertz::new(self * other.value)
45 }
46}
47
48impl MulAssign<Hertz> for Hertz {
49 fn mul_assign(&mut self, other: Hertz) {
50 *self = Hertz::new(self.value * other.value);
51 }
52}
53
54impl Div<Hertz> for Hertz {
55 type Output = Hertz;
56
57 fn div(self, other: Hertz) -> Hertz {
58 Hertz::new(self.value / other.value)
59 }
60}
61
62impl DivAssign<Hertz> for Hertz {
63 fn div_assign(&mut self, other: Hertz) {
64 *self = Hertz::new(self.value / other.value);
65 }
66}
67
68impl Add<Hertz> for Hertz {
69 type Output = Hertz;
70
71 fn add(self, other: Hertz) -> Hertz {
72 Hertz::new(self.value + other.value)
73 }
74}
75
76impl AddAssign<Hertz> for Hertz {
77 fn add_assign(&mut self, other: Hertz) {
78 *self = Hertz::new(self.value + other.value);
79 }
80}
81
82impl Sub<Hertz> for Hertz {
83 type Output = Hertz;
84
85 fn sub(self, other: Hertz) -> Hertz {
86 Hertz::new(self.value - other.value)
87 }
88}
89
90impl SubAssign<Hertz> for Hertz {
91 fn sub_assign(&mut self, other: Hertz) {
92 *self = Hertz::new(self.value - other.value);
93 }
94}
95
96impl Rem<Hertz> for Hertz {
97 type Output = Hertz;
98
99 fn rem(self, other: Hertz) -> Hertz {
100 Hertz::new(self.value % other.value)
101 }
102}
103
104impl RemAssign<Hertz> for Hertz {
105 fn rem_assign(&mut self, other: Hertz) {
106 *self = Hertz::new(self.value % other.value);
107 }
108}
109
110impl fmt::Display for Hertz {
111 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
112 write!(f, "{:.} Hz", self.value)
113 }
114}
115
116#[cfg(test)]
117mod tests {
118
119 use super::*;
120
121 #[test]
122 fn hertz_eq_hertz() {
123 let a = Hertz::new(1.0);
124 let b = Hertz::new(1.0);
125 assert_eq!(a, b);
126 }
127
128 #[test]
129 fn one_thousand_hertz_eq_kilohertz() {
130 let a = Hertz::new(1_000.0);
131 let b = Hertz::new_kilohertz(1.0);
132 assert_eq!(a, b);
133 }
134
135 #[test]
136 fn one_million_hertz_eq_megahertz() {
137 let a = Hertz::new(1_000_000.0);
138 let b = Hertz::new_megahertz(1.0);
139 assert_eq!(a, b);
140 }
141
142 #[test]
143 fn one_billion_hertz_eq_gigahertz() {
144 let a = Hertz::new(1_000_000_000.0);
145 let b = Hertz::new_gigahertz(1.0);
146 assert_eq!(a, b);
147 }
148
149 #[test]
150 fn hertz_mul_hertz() {
151 let a = Hertz::new(1.0);
152 let b = Hertz::new(2.0);
153 let c = Hertz::new(2.0);
154 assert_eq!(a * b, c);
155 }
156
157 #[test]
158 fn hertz_mul_assign_hertz() {
159 let mut a = Hertz::new(1.0);
160 let b = Hertz::new(2.0);
161 let c = Hertz::new(2.0);
162 a *= b;
163 assert_eq!(a, c);
164 }
165
166 #[test]
167 fn hertz_div_hertz() {
168 let a = Hertz::new(2.0);
169 let b = Hertz::new(2.0);
170 let c = Hertz::new(1.0);
171 assert_eq!(a / b, c);
172 }
173
174 #[test]
175 fn hertz_div_assign_hertz() {
176 let mut a = Hertz::new(2.0);
177 let b = Hertz::new(2.0);
178 let c = Hertz::new(1.0);
179 a /= b;
180 assert_eq!(a, c);
181 }
182
183 #[test]
184 fn hertz_add_hertz() {
185 let a = Hertz::new(1.0);
186 let b = Hertz::new(2.0);
187 let c = Hertz::new(3.0);
188 assert_eq!(a + b, c);
189 }
190
191 #[test]
192 fn hertz_add_assign_hertz() {
193 let mut a = Hertz::new(1.0);
194 let b = Hertz::new(2.0);
195 let c = Hertz::new(3.0);
196 a += b;
197 assert_eq!(a, c);
198 }
199
200 #[test]
201 fn hertz_sub_hertz() {
202 let a = Hertz::new(3.0);
203 let b = Hertz::new(2.0);
204 let c = Hertz::new(1.0);
205 assert_eq!(a - b, c);
206 }
207
208 #[test]
209 fn hertz_sub_assign_hertz() {
210 let mut a = Hertz::new(3.0);
211 let b = Hertz::new(2.0);
212 let c = Hertz::new(1.0);
213 a -= b;
214 assert_eq!(a, c);
215 }
216
217 #[test]
218 fn hertz_rem_hertz() {
219 let a = Hertz::new(3.0);
220 let b = Hertz::new(2.0);
221 let c = Hertz::new(1.0);
222 assert_eq!(a % b, c);
223 }
224
225 #[test]
226 fn hertz_rem_assign_hertz() {
227 let mut a = Hertz::new(3.0);
228 let b = Hertz::new(2.0);
229 let c = Hertz::new(1.0);
230 a %= b;
231 assert_eq!(a, c);
232 }
233
234 #[test]
235 fn hertz_display() {
236 let a = Hertz::new(1.0);
237 assert_eq!(format!("{}", a), "1 Hz");
238 }
239
240}