use super::Square;
pub const RANKS: [Rank; 8] = [
Rank::First,
Rank::Second,
Rank::Third,
Rank::Fourth,
Rank::Fifth,
Rank::Sixth,
Rank::Seventh,
Rank::Eighth,
];
#[repr(u8)]
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Rank {
First,
Second,
Third,
Fourth,
Fifth,
Sixth,
Seventh,
Eighth,
}
impl Rank {
#[inline]
pub const fn of(square: Square) -> Self {
unsafe { Self::from_u8_unchecked(square.as_u8() / 8) }
}
#[inline]
pub const fn to_u8(self) -> u8 {
self as u8
}
#[inline]
pub const fn from_index(val: u8) -> Option<Self> {
if val > 7 {
return None;
}
unsafe { std::mem::transmute(val) }
}
#[inline]
pub const unsafe fn from_u8_unchecked(val: u8) -> Self {
match Self::from_index(val) {
Some(rank) => rank,
None => unsafe { std::hint::unreachable_unchecked() },
}
}
}