rstmt_core/note/
impl_aspn_ext.rs

1/*
2    Appellation: impl_aspn_ext <module>
3    Created At: 2025.12.20:08:15:34
4    Contrib: @FL03
5*/
6use super::Aspn;
7use rstmt_traits::PitchMod;
8
9impl core::fmt::Display for Aspn {
10    fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
11        write!(f, "{}.{}", self.class, self.octave)
12    }
13}
14
15impl PartialEq<usize> for Aspn {
16    fn eq(&self, other: &usize) -> bool {
17        self.class() == *other
18    }
19}
20
21impl PartialEq<Aspn> for usize {
22    fn eq(&self, other: &Aspn) -> bool {
23        *self == other.class()
24    }
25}
26
27impl PartialOrd<usize> for Aspn {
28    fn partial_cmp(&self, other: &usize) -> Option<core::cmp::Ordering> {
29        self.class().partial_cmp(other)
30    }
31}
32
33impl PartialOrd<Aspn> for usize {
34    fn partial_cmp(&self, other: &Aspn) -> Option<core::cmp::Ordering> {
35        self.partial_cmp(&other.class())
36    }
37}
38
39impl core::ops::Add<Aspn> for Aspn {
40    type Output = Self;
41
42    fn add(self, rhs: Aspn) -> Self::Output {
43        let class = (self.class + rhs.class).pmod();
44        let octave = self.octave + rhs.octave;
45
46        Self::new(class, octave)
47    }
48}
49
50impl core::ops::AddAssign<Aspn> for Aspn {
51    fn add_assign(&mut self, rhs: Aspn) {
52        self.class += rhs.class;
53        self.octave += rhs.octave;
54    }
55}
56
57impl core::ops::Add<usize> for Aspn {
58    type Output = Self;
59
60    fn add(self, rhs: usize) -> Self::Output {
61        Self::new(self.class + rhs, self.octave)
62    }
63}
64
65impl core::ops::AddAssign<usize> for Aspn {
66    fn add_assign(&mut self, rhs: usize) {
67        self.class = (self.class + rhs).pmod();
68    }
69}
70
71impl core::ops::Sub<usize> for Aspn {
72    type Output = Self;
73
74    fn sub(self, rhs: usize) -> Self::Output {
75        let class = self.class as isize - rhs as isize;
76        Self {
77            class: class.pmod() as usize,
78            ..self
79        }
80    }
81}
82
83impl core::ops::SubAssign<usize> for Aspn {
84    fn sub_assign(&mut self, rhs: usize) {
85        self.class = (self.class as isize - rhs as isize).pmod() as usize;
86    }
87}
88
89macro_rules! impl_note_from {
90    ($($t:ty),*) => {
91        $(
92            impl From<$t> for Aspn {
93                fn from(class: $t) -> Self {
94                    Self::from_pitch(class.pmod() as usize)
95                }
96            }
97
98            impl From<($t, $crate::octave::Octave)> for Aspn {
99                fn from((class, octave): ($t, $crate::octave::Octave)) -> Self {
100                    Self::new(class.pmod() as usize, octave)
101                }
102            }
103        )*
104    };
105}
106
107impl_note_from!(
108    usize, u8, u16, u32, u64, u128, isize, i8, i16, i32, i64, i128
109);