From f1a05f33c96a25ec8328467245bdfff5de33de0c Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Thu, 1 Feb 2024 08:43:03 -0800 Subject: [PATCH] [position] Factor out the update_moves_with_ray! as ray_in_direction! This macro is implemented in every sight method. Factor it out, rename it, and use it in all these macros. --- position/src/sight.rs | 91 ++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 61 deletions(-) diff --git a/position/src/sight.rs b/position/src/sight.rs index 6e87d95..27cb53d 100644 --- a/position/src/sight.rs +++ b/position/src/sight.rs @@ -4,6 +4,20 @@ use crate::position::piece_sets::PieceBitBoards; use chessfriend_bitboard::BitBoard; use chessfriend_core::{Color, Direction, PlacedPiece, Shape, Square}; +macro_rules! ray_in_direction { + ($square:expr, $blockers:expr, $direction:ident, $occupied_squares:tt) => {{ + let ray = BitBoard::ray($square, Direction::$direction); + if let Some(first_occupied_square) = BitBoard::$occupied_squares(&(ray & $blockers)).next() + { + let remainder = BitBoard::ray(first_occupied_square, Direction::$direction); + let attack_ray = ray & !remainder; + attack_ray + } else { + *ray + } + }}; +} + pub(crate) trait SightExt { fn sight(&self, pieces: &PieceBitBoards, en_passant_square: Option) -> BitBoard; @@ -92,25 +106,10 @@ impl SightExt for PlacedPiece { let blockers = pieces.all_pieces(); - macro_rules! update_moves_with_ray { - ($direction:ident, $occupied_squares:tt) => { - let ray = BitBoard::ray(square, Direction::$direction); - if let Some(first_occupied_square) = - BitBoard::$occupied_squares(&(ray & blockers)).next() - { - let remainder = BitBoard::ray(first_occupied_square, Direction::$direction); - let attack_ray = ray & !remainder; - sight |= attack_ray; - } else { - sight |= ray; - } - }; - } - - update_moves_with_ray!(NorthEast, occupied_squares_trailing); - update_moves_with_ray!(NorthWest, occupied_squares_trailing); - update_moves_with_ray!(SouthEast, occupied_squares); - update_moves_with_ray!(SouthWest, occupied_squares); + sight |= ray_in_direction!(square, blockers, NorthEast, occupied_squares_trailing); + sight |= ray_in_direction!(square, blockers, NorthWest, occupied_squares_trailing); + sight |= ray_in_direction!(square, blockers, SouthEast, occupied_squares); + sight |= ray_in_direction!(square, blockers, SouthWest, occupied_squares); let friendly_pieces = pieces.all_pieces_of_color(self.color()); sight & !friendly_pieces @@ -123,25 +122,10 @@ impl SightExt for PlacedPiece { let blockers = pieces.all_pieces(); - macro_rules! update_moves_with_ray { - ($direction:ident, $occupied_squares:tt) => { - let ray = BitBoard::ray(square, Direction::$direction); - if let Some(first_occupied_square) = - BitBoard::$occupied_squares(&(ray & blockers)).next() - { - let remainder = BitBoard::ray(first_occupied_square, Direction::$direction); - let attack_ray = ray & !remainder; - sight |= attack_ray; - } else { - sight |= ray; - } - }; - } - - update_moves_with_ray!(North, occupied_squares_trailing); - update_moves_with_ray!(East, occupied_squares_trailing); - update_moves_with_ray!(South, occupied_squares); - update_moves_with_ray!(West, occupied_squares); + sight |= ray_in_direction!(square, blockers, North, occupied_squares_trailing); + sight |= ray_in_direction!(square, blockers, East, occupied_squares_trailing); + sight |= ray_in_direction!(square, blockers, South, occupied_squares); + sight |= ray_in_direction!(square, blockers, West, occupied_squares); let friendly_pieces = pieces.all_pieces_of_color(self.color()); sight & !friendly_pieces @@ -154,29 +138,14 @@ impl SightExt for PlacedPiece { let blockers = pieces.all_pieces(); - macro_rules! update_moves_with_ray { - ($direction:ident, $occupied_squares:tt) => { - let ray = BitBoard::ray(square, Direction::$direction); - if let Some(first_occupied_square) = - BitBoard::$occupied_squares(&(ray & blockers)).next() - { - let remainder = BitBoard::ray(first_occupied_square, Direction::$direction); - let attack_ray = ray & !remainder; - sight |= attack_ray; - } else { - sight |= ray; - } - }; - } - - update_moves_with_ray!(NorthWest, occupied_squares_trailing); - update_moves_with_ray!(North, occupied_squares_trailing); - update_moves_with_ray!(NorthEast, occupied_squares_trailing); - update_moves_with_ray!(East, occupied_squares_trailing); - update_moves_with_ray!(SouthEast, occupied_squares); - update_moves_with_ray!(South, occupied_squares); - update_moves_with_ray!(SouthWest, occupied_squares); - update_moves_with_ray!(West, occupied_squares); + sight |= ray_in_direction!(square, blockers, NorthWest, occupied_squares_trailing); + sight |= ray_in_direction!(square, blockers, North, occupied_squares_trailing); + sight |= ray_in_direction!(square, blockers, NorthEast, occupied_squares_trailing); + sight |= ray_in_direction!(square, blockers, East, occupied_squares_trailing); + sight |= ray_in_direction!(square, blockers, SouthEast, occupied_squares); + sight |= ray_in_direction!(square, blockers, South, occupied_squares); + sight |= ray_in_direction!(square, blockers, SouthWest, occupied_squares); + sight |= ray_in_direction!(square, blockers, West, occupied_squares); let friendly_pieces = pieces.all_pieces_of_color(self.color()); sight & !friendly_pieces