[board] Move position flags to a Flags struct in its own module

This commit is contained in:
Eryn Wells 2024-01-13 11:15:09 -08:00
parent 7c80c61690
commit 953c2f1522
3 changed files with 82 additions and 40 deletions

View file

@ -0,0 +1,73 @@
// Eryn Wells <eryn@erynwells.me>
use super::position::BoardSide;
use crate::piece::Color;
#[derive(Clone, Copy, Debug, 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 Default for Flags {
fn default() -> Self {
Flags(0b00001111)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::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));
}
}