use crate::{CastleSide, Color};
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CastlingRights(u8);
impl CastlingRights {
const WHITE_KING: u8 = 0b1;
const WHITE_QUEEN: u8 = 0b10;
const BLACK_KING: u8 = 0b100;
const BLACK_QUEEN: u8 = 0b1000;
pub fn new() -> Self {
Self(0)
}
pub fn is_none_set(&self) -> bool {
self.0 == 0
}
pub fn is_set(&self, side: CastleSide, color: Color) -> bool {
match (side, color) {
(CastleSide::Kingside, Color::Black) => self.0 & Self::BLACK_KING != 0,
(CastleSide::Kingside, Color::White) => self.0 & Self::WHITE_KING != 0,
(CastleSide::Queenside, Color::Black) => self.0 & Self::BLACK_QUEEN != 0,
(CastleSide::Queenside, Color::White) => self.0 & Self::WHITE_QUEEN != 0,
}
}
pub fn set(&mut self, side: CastleSide, color: Color) {
match (side, color) {
(CastleSide::Kingside, Color::Black) => self.0 |= Self::BLACK_KING,
(CastleSide::Kingside, Color::White) => self.0 |= Self::WHITE_KING,
(CastleSide::Queenside, Color::Black) => self.0 |= Self::BLACK_QUEEN,
(CastleSide::Queenside, Color::White) => self.0 |= Self::WHITE_QUEEN,
};
}
pub fn unset(&mut self, side: CastleSide, color: Color) {
match (side, color) {
(CastleSide::Kingside, Color::Black) => self.0 &= !Self::BLACK_KING,
(CastleSide::Kingside, Color::White) => self.0 &= !Self::WHITE_KING,
(CastleSide::Queenside, Color::Black) => self.0 &= !Self::BLACK_QUEEN,
(CastleSide::Queenside, Color::White) => self.0 &= !Self::WHITE_QUEEN,
};
}
pub fn unset_color(&mut self, color: Color) {
match color {
Color::White => self.0 &= !(Self::WHITE_KING | Self::WHITE_QUEEN),
Color::Black => self.0 &= !(Self::BLACK_KING | Self::BLACK_QUEEN),
}
}
}