autd3_core/common/freq/
mod.rs1mod float;
2mod int;
3
4pub struct Hz;
6
7#[allow(non_camel_case_types)]
9pub struct kHz;
10
11#[derive(Clone, Copy, PartialEq, PartialOrd)]
13pub struct Freq<T: Copy> {
14 pub(crate) freq: T,
15}
16
17impl<T: Copy> core::fmt::Debug for Freq<T>
18where
19 T: core::fmt::Display,
20{
21 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
22 write!(f, "{} Hz", self.freq)
23 }
24}
25
26impl<T: Copy> Freq<T> {
27 #[inline]
28 pub const fn hz(&self) -> T {
30 self.freq
31 }
32}
33
34impl<T> core::ops::Add<Freq<T>> for Freq<T>
35where
36 T: core::ops::Add<Output = T> + Copy,
37{
38 type Output = Freq<T>;
39
40 fn add(self, rhs: Freq<T>) -> Self::Output {
41 Freq {
42 freq: self.freq + rhs.freq,
43 }
44 }
45}
46
47impl<T> core::ops::Sub<Freq<T>> for Freq<T>
48where
49 T: core::ops::Sub<Output = T> + Copy,
50{
51 type Output = Freq<T>;
52
53 fn sub(self, rhs: Freq<T>) -> Self::Output {
54 Freq {
55 freq: self.freq - rhs.freq,
56 }
57 }
58}
59
60impl<T, U> core::ops::Mul<U> for Freq<T>
61where
62 T: core::ops::Mul<U, Output = T> + Copy,
63{
64 type Output = Freq<T>;
65
66 fn mul(self, rhs: U) -> Self::Output {
67 Freq {
68 freq: self.freq * rhs,
69 }
70 }
71}
72
73impl<T, U> core::ops::Div<U> for Freq<T>
74where
75 T: core::ops::Div<U, Output = T> + Copy,
76{
77 type Output = Freq<T>;
78
79 fn div(self, rhs: U) -> Self::Output {
80 Freq {
81 freq: self.freq / rhs,
82 }
83 }
84}
85
86#[cfg(test)]
87mod tests {
88 use super::*;
89
90 #[test]
91 fn arithmetic() {
92 assert_eq!(200 * Hz, 100 * Hz + 100 * Hz);
93 assert_eq!(0 * Hz, 100 * Hz - 100 * Hz);
94 assert_eq!(200 * Hz, 100 * Hz * 2);
95 assert_eq!(50 * Hz, 100 * Hz / 2);
96 }
97
98 #[test]
99 fn dbg() {
100 assert_eq!(alloc::format!("{:?}", 100 * Hz), "100 Hz");
101 assert_eq!(alloc::format!("{:?}", 100 * kHz), "100000 Hz");
102 }
103}