diff --git a/src/movegen/attack_generator.rs b/src/movegen/attack_generator.rs index bfc320b..78cd403 100644 --- a/src/movegen/attack_generator.rs +++ b/src/movegen/attack_generator.rs @@ -36,7 +36,8 @@ static PAWN_ATTACKS: LazyLock<[[Bitboard; 2]; 64]> = LazyLock::new(init_pawn_att static KNIGHT_ATTACKS: LazyLock<[Bitboard; 64]> = LazyLock::new(init_knight_attacks); static KING_ATTACKS: LazyLock<[Bitboard; 64]> = LazyLock::new(init_king_attacks); static BISHOP_ATTACKS: LazyLock> = LazyLock::new(init_bishop_attacks); -static ROOK_ATTACKS: LazyLock> = LazyLock::new(init_rook_attacks); +static ROOK_ATTACKS: LazyLock>> = + LazyLock::new(init_rook_attacks); const fn pawn_attacks(bitboard: Bitboard, color: Color) -> Bitboard { let mut attacks = EMPTY; @@ -235,7 +236,7 @@ pub fn fetch_rook_attacks(mut occupancy: Bitboard, square: usize) -> Bitboard { occupancy &= mask_rook_attacks(square_to_bitboard_wrapping(square)); occupancy = occupancy.wrapping_mul(ROOK_MAGIC[square]); occupancy >>= 64 - ROOK_RELEVANT_BITS[square]; - ROOK_ATTACKS[square][occupancy as usize] + ROOK_ATTACKS[&square][&(occupancy as usize)] } pub fn fetch_queen_attacks(occupancy: Bitboard, square: usize) -> Bitboard { @@ -280,25 +281,34 @@ pub fn init_bishop_attacks() -> Box<[[Bitboard; 512]; 64]> { bishop_atks } +use std::collections::HashMap; + #[allow(clippy::large_stack_frames)] -pub fn init_rook_attacks() -> Box<[[Bitboard; 4096]; 64]> { - let mut rook_masks = [0; 64]; - let mut rook_atks: Box<[[Bitboard; 4096]; 64]> = Box::new([[0; 4096]; 64]); +pub fn init_rook_attacks() -> HashMap> { + let mut rook_masks: Vec = vec![0; 64]; + let mut rook_atks: HashMap> = HashMap::new(); for square in 0..64 { rook_masks[square] = mask_rook_attacks(square_to_bitboard(square)); let attack_mask = rook_masks[square]; let occupancy_indices = square_to_bitboard(ROOK_RELEVANT_BITS[square]); + let mut square_map: HashMap = HashMap::new(); + for idx in 0..occupancy_indices { let occupancy = set_occupancy(idx, ROOK_RELEVANT_BITS[square], attack_mask); let magic_index = (occupancy.wrapping_mul(ROOK_MAGIC[square]) >> (64 - ROOK_RELEVANT_BITS[square])) as usize; - rook_atks[square][magic_index] = - rook_attacks_on_the_fly(square_to_bitboard(square), occupancy); + square_map.insert( + magic_index, + rook_attacks_on_the_fly(square_to_bitboard(square), occupancy), + ); } + + rook_atks.insert(square, square_map); } + rook_atks }