[board] A ton of API refinements
This commit is contained in:
parent
99dd2d1be2
commit
867deafd13
7 changed files with 208 additions and 244 deletions
|
@ -12,24 +12,25 @@ impl Rights {
|
|||
/// A player retains the right to castle on a particular side of the board
|
||||
/// as long as they have not moved their king, or the rook on that side of
|
||||
/// the board.
|
||||
pub fn player_has_right_to_castle(self, color: Color, castle: Castle) -> bool {
|
||||
(self.0 & (1 << Self::_player_has_right_to_castle_flag_offset(color, castle))) != 0
|
||||
#[must_use]
|
||||
pub fn is_set(self, color: Color, castle: Castle) -> bool {
|
||||
(self.0 & (1 << Self::flag_offset(color, castle))) != 0
|
||||
}
|
||||
|
||||
pub fn set_player_has_right_to_castle_flag(&mut self, color: Color, castle: Castle) {
|
||||
self.0 |= 1 << Self::_player_has_right_to_castle_flag_offset(color, castle);
|
||||
pub fn set(&mut self, color: Color, castle: Castle) {
|
||||
self.0 |= 1 << Self::flag_offset(color, castle);
|
||||
}
|
||||
|
||||
pub fn clear_player_has_right_to_castle_flag(&mut self, color: Color, castle: Castle) {
|
||||
self.0 &= !(1 << Self::_player_has_right_to_castle_flag_offset(color, castle));
|
||||
pub fn clear(&mut self, color: Color, castle: Castle) {
|
||||
self.0 &= !(1 << Self::flag_offset(color, castle));
|
||||
}
|
||||
|
||||
pub fn clear_all(&mut self) {
|
||||
self.0 &= 0b1111_1100;
|
||||
self.0 = 0;
|
||||
}
|
||||
|
||||
fn _player_has_right_to_castle_flag_offset(color: Color, castle: Castle) -> usize {
|
||||
((color as usize) << 1) & castle as usize
|
||||
fn flag_offset(color: Color, castle: Castle) -> usize {
|
||||
((color as usize) << 1) + castle as usize
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -50,43 +51,31 @@ mod tests {
|
|||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn castling_rights() {
|
||||
assert_eq!(
|
||||
Rights::_player_has_right_to_castle_flag_offset(Color::White, Castle::KingSide),
|
||||
0
|
||||
);
|
||||
assert_eq!(
|
||||
Rights::_player_has_right_to_castle_flag_offset(Color::White, Castle::QueenSide),
|
||||
1
|
||||
);
|
||||
assert_eq!(
|
||||
Rights::_player_has_right_to_castle_flag_offset(Color::Black, Castle::KingSide),
|
||||
2
|
||||
);
|
||||
assert_eq!(
|
||||
Rights::_player_has_right_to_castle_flag_offset(Color::Black, Castle::QueenSide),
|
||||
3
|
||||
);
|
||||
fn bitfield_offsets() {
|
||||
assert_eq!(Rights::flag_offset(Color::White, Castle::KingSide), 0);
|
||||
assert_eq!(Rights::flag_offset(Color::White, Castle::QueenSide), 1);
|
||||
assert_eq!(Rights::flag_offset(Color::Black, Castle::KingSide), 2);
|
||||
assert_eq!(Rights::flag_offset(Color::Black, Castle::QueenSide), 3);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn default_rights() {
|
||||
let mut rights = Rights::default();
|
||||
assert!(rights.player_has_right_to_castle(Color::White, Castle::KingSide));
|
||||
assert!(rights.player_has_right_to_castle(Color::White, Castle::QueenSide));
|
||||
assert!(rights.player_has_right_to_castle(Color::Black, Castle::KingSide));
|
||||
assert!(rights.player_has_right_to_castle(Color::Black, Castle::QueenSide));
|
||||
assert!(rights.is_set(Color::White, Castle::KingSide));
|
||||
assert!(rights.is_set(Color::White, Castle::QueenSide));
|
||||
assert!(rights.is_set(Color::Black, Castle::KingSide));
|
||||
assert!(rights.is_set(Color::Black, Castle::QueenSide));
|
||||
|
||||
rights.clear_player_has_right_to_castle_flag(Color::White, Castle::QueenSide);
|
||||
assert!(rights.player_has_right_to_castle(Color::White, Castle::KingSide));
|
||||
assert!(!rights.player_has_right_to_castle(Color::White, Castle::QueenSide));
|
||||
assert!(rights.player_has_right_to_castle(Color::Black, Castle::KingSide));
|
||||
assert!(rights.player_has_right_to_castle(Color::Black, Castle::QueenSide));
|
||||
rights.clear(Color::White, Castle::QueenSide);
|
||||
assert!(rights.is_set(Color::White, Castle::KingSide));
|
||||
assert!(!rights.is_set(Color::White, Castle::QueenSide));
|
||||
assert!(rights.is_set(Color::Black, Castle::KingSide));
|
||||
assert!(rights.is_set(Color::Black, Castle::QueenSide));
|
||||
|
||||
rights.set_player_has_right_to_castle_flag(Color::White, Castle::QueenSide);
|
||||
assert!(rights.player_has_right_to_castle(Color::White, Castle::KingSide));
|
||||
assert!(rights.player_has_right_to_castle(Color::White, Castle::QueenSide));
|
||||
assert!(rights.player_has_right_to_castle(Color::Black, Castle::KingSide));
|
||||
assert!(rights.player_has_right_to_castle(Color::Black, Castle::QueenSide));
|
||||
rights.set(Color::White, Castle::QueenSide);
|
||||
assert!(rights.is_set(Color::White, Castle::KingSide));
|
||||
assert!(rights.is_set(Color::White, Castle::QueenSide));
|
||||
assert!(rights.is_set(Color::Black, Castle::KingSide));
|
||||
assert!(rights.is_set(Color::Black, Castle::QueenSide));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue