// Eryn Wells use super::position::BoardSide; use crate::piece::Color; use std::fmt; #[derive(Clone, Copy, Eq, Hash, PartialEq)] pub(super) struct Flags(u8); impl Flags { #[inline] pub(super) fn player_has_right_to_castle_flag_offset(color: Color, side: BoardSide) -> u8 { ((color as u8) << 1) + side as u8 } pub(super) fn player_has_right_to_castle(&self, color: Color, side: BoardSide) -> bool { (self.0 & (1 << Self::player_has_right_to_castle_flag_offset(color, side))) != 0 } pub(super) fn set_player_has_right_to_castle_flag(&mut self, color: Color, side: BoardSide) { self.0 |= 1 << Self::player_has_right_to_castle_flag_offset(color, side); } pub(super) fn clear_player_has_right_to_castle_flag(&mut self, color: Color, side: BoardSide) { self.0 &= !(1 << Self::player_has_right_to_castle_flag_offset(color, side)); } } impl fmt::Debug for Flags { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "Flags({:08b})", self.0) } } impl Default for Flags { fn default() -> Self { Flags(0b00001111) } } #[cfg(test)] mod tests { use super::*; use crate::piece::Color; #[test] fn castle_flags() { assert_eq!( Flags::player_has_right_to_castle_flag_offset(Color::White, BoardSide::King), 0 ); assert_eq!( Flags::player_has_right_to_castle_flag_offset(Color::White, BoardSide::Queen), 1 ); assert_eq!( Flags::player_has_right_to_castle_flag_offset(Color::Black, BoardSide::King), 2 ); assert_eq!( Flags::player_has_right_to_castle_flag_offset(Color::Black, BoardSide::Queen), 3 ); } #[test] fn defaults() { let mut flags: Flags = Default::default(); assert!(flags.player_has_right_to_castle(Color::White, BoardSide::King)); assert!(flags.player_has_right_to_castle(Color::White, BoardSide::Queen)); assert!(flags.player_has_right_to_castle(Color::Black, BoardSide::King)); assert!(flags.player_has_right_to_castle(Color::Black, BoardSide::Queen)); flags.clear_player_has_right_to_castle_flag(Color::White, BoardSide::Queen); assert!(flags.player_has_right_to_castle(Color::White, BoardSide::King)); assert!(!flags.player_has_right_to_castle(Color::White, BoardSide::Queen)); assert!(flags.player_has_right_to_castle(Color::Black, BoardSide::King)); assert!(flags.player_has_right_to_castle(Color::Black, BoardSide::Queen)); flags.set_player_has_right_to_castle_flag(Color::White, BoardSide::Queen); assert!(flags.player_has_right_to_castle(Color::White, BoardSide::King)); assert!(flags.player_has_right_to_castle(Color::White, BoardSide::Queen)); assert!(flags.player_has_right_to_castle(Color::Black, BoardSide::King)); assert!(flags.player_has_right_to_castle(Color::Black, BoardSide::Queen)); } }