autd3_core/gain/
emit_intensity.rs1use derive_more::Debug;
2use zerocopy::{Immutable, IntoBytes};
3
4#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, IntoBytes, Immutable)]
6#[debug("{:#04X}", self.0)]
7#[repr(C)]
8pub struct Intensity(pub u8);
9
10impl Intensity {
11 pub const MAX: Intensity = Intensity(0xFF);
13 pub const MIN: Intensity = Intensity(0x00);
15}
16
17impl std::ops::Div<u8> for Intensity {
18 type Output = Self;
19
20 fn div(self, rhs: u8) -> Self::Output {
21 Self(self.0 / rhs)
22 }
23}
24
25impl std::ops::Mul<u8> for Intensity {
26 type Output = Intensity;
27
28 fn mul(self, rhs: u8) -> Self::Output {
29 Intensity(self.0.saturating_mul(rhs))
30 }
31}
32
33impl std::ops::Mul<Intensity> for u8 {
34 type Output = Intensity;
35
36 fn mul(self, rhs: Intensity) -> Self::Output {
37 Intensity(self.saturating_mul(rhs.0))
38 }
39}
40
41impl std::ops::Add<Intensity> for Intensity {
42 type Output = Self;
43
44 fn add(self, rhs: Intensity) -> Self::Output {
45 Self(self.0.saturating_add(rhs.0))
46 }
47}
48
49impl std::ops::Sub<Intensity> for Intensity {
50 type Output = Self;
51
52 fn sub(self, rhs: Intensity) -> Self::Output {
53 Self(self.0.saturating_sub(rhs.0))
54 }
55}
56
57#[cfg(test)]
58mod tests {
59 use super::*;
60
61 #[rstest::rstest]
62 #[test]
63 #[case::value_1_1(Intensity(0x01), Intensity(0x01), 1)]
64 #[case::value_1_2(Intensity(0x00), Intensity(0x01), 2)]
65 #[case::value_ff_2(Intensity(0x7F), Intensity(0xFF), 2)]
66 fn test_div(#[case] expected: Intensity, #[case] target: Intensity, #[case] div: u8) {
67 assert_eq!(expected, target / div);
68 }
69
70 #[rstest::rstest]
71 #[test]
72 #[case::value_1_1(Intensity(0x01), Intensity(0x01), 1)]
73 #[case::value_1_2(Intensity(0x02), Intensity(0x01), 2)]
74 #[case::value_7f_2(Intensity(0xFE), Intensity(0x7F), 2)]
75 #[case::value_7f_3(Intensity(0xFF), Intensity(0x7F), 3)]
76 fn test_mul(#[case] expected: Intensity, #[case] target: Intensity, #[case] mul: u8) {
77 assert_eq!(expected, target * mul);
78 assert_eq!(expected, mul * target);
79 }
80
81 #[rstest::rstest]
82 #[test]
83 #[case::value_1_1(Intensity(0x02), Intensity(0x01), Intensity(0x01))]
84 #[case::value_7f_7f(Intensity(0xFE), Intensity(0x7F), Intensity(0x7F))]
85 #[case::value_7f_ff(Intensity(0xFF), Intensity(0x7F), Intensity(0xFF))]
86 fn test_add(#[case] expected: Intensity, #[case] lhs: Intensity, #[case] rhs: Intensity) {
87 assert_eq!(expected, lhs + rhs);
88 }
89
90 #[rstest::rstest]
91 #[test]
92 #[case::value_1_1(Intensity(0x00), Intensity(0x01), Intensity(0x01))]
93 #[case::value_7f_7f(Intensity(0x01), Intensity(0x02), Intensity(0x01))]
94 #[case::value_7f_ff(Intensity(0x00), Intensity(0x7F), Intensity(0xFF))]
95 fn test_sub(#[case] expected: Intensity, #[case] lhs: Intensity, #[case] rhs: Intensity) {
96 assert_eq!(expected, lhs - rhs);
97 }
98
99 #[test]
100 fn dbg() {
101 assert_eq!(format!("{:?}", Intensity(0x00)), "0x00");
102 assert_eq!(format!("{:?}", Intensity(0x01)), "0x01");
103 assert_eq!(format!("{:?}", Intensity(0xFF)), "0xFF");
104 }
105}