use std::fmt::{self, Display, Formatter};
#[repr(u8)]
#[derive(Copy, Debug)]
#[derive_const(
Clone,
Eq,
Ord,
PartialEq,
PartialOrd,
)]
pub enum An {
A0 = 0,
A1 = 1,
A2 = 2,
A3 = 3,
A4 = 4,
A5 = 5,
Fp = 6,
Sp = 7,
}
impl An {
pub const MIN: Self = Self::A0;
pub const MAX: Self = Self::Sp;
#[inline]
#[must_use]
pub const fn from_u16(mut index: u16) -> Self {
index &= 0b111;
match index {
0 => Self::A0,
1 => Self::A1,
2 => Self::A2,
3 => Self::A3,
4 => Self::A4,
5 => Self::A5,
6 => Self::Fp,
7 => Self::Sp,
_ => {
unreachable!();
}
}
}
#[inline(always)]
#[must_use]
pub const fn as_u16(self) -> u16 {
self as u16
}
#[inline]
#[must_use]
pub const fn as_usize(self) -> usize {
self.as_u16().into()
}
#[inline]
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::A0 => "A0",
Self::A1 => "A1",
Self::A2 => "A2",
Self::A3 => "A3",
Self::A4 => "A4",
Self::A5 => "A5",
Self::Fp => "FP",
Self::Sp => "SP",
}
}
}
impl Display for An {
#[inline]
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}