[board] Move position flags to a Flags struct in its own module
This commit is contained in:
parent
7c80c61690
commit
953c2f1522
3 changed files with 82 additions and 40 deletions
73
board/src/position/flags.rs
Normal file
73
board/src/position/flags.rs
Normal 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));
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue