use crate::prelude::*;
use crate::accelerate;
enumeration! {
pub Token, [
WhitePawn, BlackPawn,
WhiteKnight, BlackKnight,
WhiteBishop, BlackBishop,
WhiteRook, BlackRook,
WhiteQueen, BlackQueen,
WhiteKing, BlackKing,
]
}
impl Token {
const FEN: [char; Self::COUNT] = [
'P', 'p',
'N', 'n',
'B', 'b',
'R', 'r',
'Q', 'q',
'K', 'k',
];
#[inline]
#[must_use]
pub const fn from_fen(byte: u8) -> Option<Self> {
Some(match byte {
b'P' => Self::WhitePawn, b'p' => Self::BlackPawn,
b'N' => Self::WhiteKnight, b'n' => Self::BlackKnight,
b'B' => Self::WhiteBishop, b'b' => Self::BlackBishop,
b'R' => Self::WhiteRook, b'r' => Self::BlackRook,
b'Q' => Self::WhiteQueen, b'q' => Self::BlackQueen,
b'K' => Self::WhiteKing, b'k' => Self::BlackKing,
_ => return None,
})
}
#[allow(clippy::missing_panics_doc)] #[inline]
pub const fn new(color: Color, piece: Piece) -> Self {
let repr = piece.as_u8() << 1 | color.as_u8();
unsafe_optimization!(
Self::from_u8(repr).unwrap(),
Self::from_u8_unchecked(repr),
)
}
#[allow(clippy::missing_panics_doc)] #[inline]
pub const fn color(self) -> Color {
let color = self.as_u8() & 0b1;
unsafe_optimization! {
Color::from_u8(color).unwrap(),
Color::from_u8_unchecked(color),
}
}
#[allow(clippy::missing_panics_doc)] #[inline]
pub const fn piece(self) -> Piece {
let piece = self.as_u8() >> 1;
unsafe_optimization! {
Piece::from_u8(piece).unwrap(),
Piece::from_u8_unchecked(piece),
}
}
#[inline]
pub const fn attacks(self, position: Square, board: Bitboard) -> Bitboard {
accelerate::attacks(
self.color(),
self.piece(),
position,
board,
)
}
}
impl const From<Token> for char {
#[inline]
fn from(value: Token) -> Self {
Token::FEN[value]
}
}
impl const From<Token> for Color {
#[inline]
fn from(token: Token) -> Self {
token.color()
}
}
impl const From<Token> for Piece {
#[inline]
fn from(token: Token) -> Self {
token.piece()
}
}