use core::fmt;
use core::mem::transmute;
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Debug, Hash)]
#[repr(u8)]
pub enum File {
A,
B,
C,
D,
E,
F,
G,
H,
}
impl fmt::Display for File {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::A => write!(f, "A"),
Self::B => write!(f, "B"),
Self::C => write!(f, "C"),
Self::D => write!(f, "D"),
Self::E => write!(f, "E"),
Self::F => write!(f, "F"),
Self::G => write!(f, "G"),
Self::H => write!(f, "H"),
}
}
}
impl File {
pub const NUM_FILES: usize = 8;
pub const ALL: [Self; Self::NUM_FILES] = [
Self::A,
Self::B,
Self::C,
Self::D,
Self::E,
Self::F,
Self::G,
Self::H,
];
#[inline(always)]
pub const fn from_index(index: usize) -> File {
unsafe { transmute(index as u8 & 7) }
}
#[inline(always)]
pub const fn to_index(self) -> usize {
self as usize
}
#[inline(always)]
pub const fn right(self) -> Self {
unsafe { transmute((self as u8 + 1) & 7) }
}
#[inline(always)]
pub const fn left(self) -> Self {
unsafe { transmute((self as u8).wrapping_sub(1) & 7) }
}
}