Iterate on Squares when building the BitBoard library

This commit is contained in:
Eryn Wells 2024-01-06 16:22:22 -08:00
parent ff839db041
commit 5a7e498d5d

View file

@ -83,7 +83,7 @@ impl DiagonalRays {
macro_rules! library_getter {
($name:ident) => {
pub(super) fn $name(&self, sq: Square) -> BitBoard {
self.$name[sq.index() as usize]
self.$name[sq as usize]
}
};
}
@ -91,8 +91,8 @@ macro_rules! library_getter {
#[derive(Debug)]
pub(super) struct MoveLibrary {
// Rays
diagonal_rays: [DiagonalRays; 64],
orthogonal_rays: [OrthogonalRays; 64],
diagonal_rays: [DiagonalRays; Square::NUM as usize],
orthogonal_rays: [OrthogonalRays; Square::NUM as usize],
// Piecewise move tables
knight_moves: [BitBoard; 64],
@ -116,33 +116,31 @@ impl MoveLibrary {
}
fn init(&mut self) {
for i in 0..64 {
self.init_orthogonal_rays(i);
self.init_diagonal_rays(i);
self.init_knight_moves(i as usize);
self.init_bishop_moves(i as usize);
self.init_rook_moves(i as usize);
self.init_queen_moves(i as usize);
self.init_king_moves(i as usize);
for sq in Square::ALL {
self.init_orthogonal_rays(sq);
self.init_diagonal_rays(sq);
self.init_knight_moves(sq as usize);
self.init_bishop_moves(sq as usize);
self.init_rook_moves(sq as usize);
self.init_queen_moves(sq as usize);
self.init_king_moves(sq as usize);
}
}
fn init_orthogonal_rays(&mut self, idx: u8) {
let sq = Square::from_index_unsafe(idx);
let sq_bb = BitBoard::from_square(sq);
fn init_orthogonal_rays(&mut self, sq: Square) {
let sq_bb: BitBoard = sq.into();
let ortho_rays = &mut self.orthogonal_rays[idx as usize];
let ortho_rays = &mut self.orthogonal_rays[sq as usize];
ortho_rays.positive_file = Self::generate_ray(sq_bb, BitBoard::shift_north_one);
ortho_rays.negative_file = Self::generate_ray(sq_bb, BitBoard::shift_south_one);
ortho_rays.positive_rank = Self::generate_ray(sq_bb, BitBoard::shift_east_one);
ortho_rays.negative_rank = Self::generate_ray(sq_bb, BitBoard::shift_west_one);
}
fn init_diagonal_rays(&mut self, idx: u8) {
let sq = Square::from_index_unsafe(idx);
let sq_bb = BitBoard::from_square(sq);
fn init_diagonal_rays(&mut self, sq: Square) {
let sq_bb: BitBoard = sq.into();
let diag_rays = &mut self.diagonal_rays[idx as usize];
let diag_rays = &mut self.diagonal_rays[sq as usize];
diag_rays.positive_diagonal = Self::generate_ray(sq_bb, BitBoard::shift_north_east_one);
diag_rays.positive_antidiagonal = Self::generate_ray(sq_bb, BitBoard::shift_north_west_one);
diag_rays.negative_diagonal = Self::generate_ray(sq_bb, BitBoard::shift_south_west_one);
@ -204,13 +202,13 @@ impl MoveLibrary {
}
#[inline]
fn generate_ray(sq: BitBoard, shift: fn(&BitBoard) -> BitBoard) -> BitBoard {
fn generate_ray(sq: BitBoard, shift: fn(BitBoard) -> BitBoard) -> BitBoard {
let mut ray = BitBoard::empty();
let mut iter = shift(&sq);
let mut iter = shift(sq);
while !iter.is_empty() {
ray |= iter;
iter = shift(&iter);
iter = shift(iter);
}
ray