Iterate on Squares when building the BitBoard library
This commit is contained in:
parent
ff839db041
commit
5a7e498d5d
1 changed files with 20 additions and 22 deletions
|
@ -83,7 +83,7 @@ impl DiagonalRays {
|
||||||
macro_rules! library_getter {
|
macro_rules! library_getter {
|
||||||
($name:ident) => {
|
($name:ident) => {
|
||||||
pub(super) fn $name(&self, sq: Square) -> BitBoard {
|
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)]
|
#[derive(Debug)]
|
||||||
pub(super) struct MoveLibrary {
|
pub(super) struct MoveLibrary {
|
||||||
// Rays
|
// Rays
|
||||||
diagonal_rays: [DiagonalRays; 64],
|
diagonal_rays: [DiagonalRays; Square::NUM as usize],
|
||||||
orthogonal_rays: [OrthogonalRays; 64],
|
orthogonal_rays: [OrthogonalRays; Square::NUM as usize],
|
||||||
|
|
||||||
// Piecewise move tables
|
// Piecewise move tables
|
||||||
knight_moves: [BitBoard; 64],
|
knight_moves: [BitBoard; 64],
|
||||||
|
@ -116,33 +116,31 @@ impl MoveLibrary {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn init(&mut self) {
|
fn init(&mut self) {
|
||||||
for i in 0..64 {
|
for sq in Square::ALL {
|
||||||
self.init_orthogonal_rays(i);
|
self.init_orthogonal_rays(sq);
|
||||||
self.init_diagonal_rays(i);
|
self.init_diagonal_rays(sq);
|
||||||
self.init_knight_moves(i as usize);
|
self.init_knight_moves(sq as usize);
|
||||||
self.init_bishop_moves(i as usize);
|
self.init_bishop_moves(sq as usize);
|
||||||
self.init_rook_moves(i as usize);
|
self.init_rook_moves(sq as usize);
|
||||||
self.init_queen_moves(i as usize);
|
self.init_queen_moves(sq as usize);
|
||||||
self.init_king_moves(i as usize);
|
self.init_king_moves(sq as usize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn init_orthogonal_rays(&mut self, idx: u8) {
|
fn init_orthogonal_rays(&mut self, sq: Square) {
|
||||||
let sq = Square::from_index_unsafe(idx);
|
let sq_bb: BitBoard = sq.into();
|
||||||
let sq_bb = BitBoard::from_square(sq);
|
|
||||||
|
|
||||||
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.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.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.positive_rank = Self::generate_ray(sq_bb, BitBoard::shift_east_one);
|
||||||
ortho_rays.negative_rank = Self::generate_ray(sq_bb, BitBoard::shift_west_one);
|
ortho_rays.negative_rank = Self::generate_ray(sq_bb, BitBoard::shift_west_one);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn init_diagonal_rays(&mut self, idx: u8) {
|
fn init_diagonal_rays(&mut self, sq: Square) {
|
||||||
let sq = Square::from_index_unsafe(idx);
|
let sq_bb: BitBoard = sq.into();
|
||||||
let sq_bb = BitBoard::from_square(sq);
|
|
||||||
|
|
||||||
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_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.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);
|
diag_rays.negative_diagonal = Self::generate_ray(sq_bb, BitBoard::shift_south_west_one);
|
||||||
|
@ -204,13 +202,13 @@ impl MoveLibrary {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[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 ray = BitBoard::empty();
|
||||||
|
|
||||||
let mut iter = shift(&sq);
|
let mut iter = shift(sq);
|
||||||
while !iter.is_empty() {
|
while !iter.is_empty() {
|
||||||
ray |= iter;
|
ray |= iter;
|
||||||
iter = shift(&iter);
|
iter = shift(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
ray
|
ray
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue