Implement Index<T>, IndexMut<T> for Castle, PieceType and Color enums, use swap_remove instead of remove on sort_moves

This commit is contained in:
stefiosif
2024-12-01 10:52:38 +02:00
parent 316f40e6e5
commit f7604b27a5
4 changed files with 62 additions and 35 deletions

View File

@@ -1,6 +1,6 @@
use u64 as Bitboard;
use crate::board::bitboard::{have_common_bit, lsb};
use crate::board::bitboard::{have_common_bit, lsb, square_to_bitboard};
use crate::board::state::State;
use crate::movegen::attack_generator::{
fetch_bishop_attacks, fetch_king_attacks, fetch_knight_attacks, fetch_pawn_attacks,
@@ -272,17 +272,15 @@ impl PieceType {
}
use std::ops::{Index, IndexMut};
use super::bitboard::square_to_bitboard;
impl Index<PieceType> for [Piece] {
type Output = Piece;
impl<T> Index<PieceType> for [T] {
type Output = T;
fn index(&self, piece_type: PieceType) -> &Self::Output {
&self[piece_type.idx()]
}
}
impl IndexMut<PieceType> for [Piece] {
impl<T> IndexMut<PieceType> for [T] {
fn index_mut(&mut self, piece_type: PieceType) -> &mut Self::Output {
&mut self[piece_type.idx()]
}
@@ -307,6 +305,20 @@ impl Color {
}
}
impl<T> Index<Color> for [T] {
type Output = T;
fn index(&self, color: Color) -> &Self::Output {
&self[color.idx()]
}
}
impl<T> IndexMut<Color> for [T] {
fn index_mut(&mut self, color: Color) -> &mut Self::Output {
&mut self[color.idx()]
}
}
#[cfg(test)]
mod tests {
use crate::{board::fen::from_fen, movegen::attack_generator::init_attacks};

View File

@@ -164,3 +164,19 @@ impl Castle {
self as usize
}
}
use std::ops::{Index, IndexMut};
impl<T> Index<Castle> for [T] {
type Output = T;
fn index(&self, castle: Castle) -> &Self::Output {
&self[castle.idx()]
}
}
impl<T> IndexMut<Castle> for [T] {
fn index_mut(&mut self, castle: Castle) -> &mut Self::Output {
&mut self[castle.idx()]
}
}

View File

@@ -63,7 +63,7 @@ impl ZobristKeys {
while bb != 0 {
let square = lsb(bb);
hash ^= self.piece_square_color[square][piece.piece_type.idx()][piece.color.idx()];
hash ^= self.piece_square_color[square][piece.piece_type][piece.color];
bb &= bb - 1;
}
}
@@ -73,7 +73,7 @@ impl ZobristKeys {
while bb != 0 {
let square = lsb(bb);
hash ^= self.piece_square_color[square][piece.piece_type.idx()][piece.color.idx()];
hash ^= self.piece_square_color[square][piece.piece_type][piece.color];
bb &= bb - 1;
}
}
@@ -82,8 +82,8 @@ impl ZobristKeys {
hash ^= self.side_to_move
}
hash ^= self.castling_ability[board.state.castling_ability[0].idx()][0];
hash ^= self.castling_ability[board.state.castling_ability[1].idx()][1];
hash ^= self.castling_ability[board.state.castling_ability[0]][0];
hash ^= self.castling_ability[board.state.castling_ability[1]][1];
if let Some(ep) = board.state.en_passant_square {
hash ^= self.en_passant[square::to_file(ep)];
@@ -125,16 +125,16 @@ impl ZobristHash {
new_castling_ability: [Castle; 2],
) {
let keys = zobrist_keys();
self.hash ^= keys.castling_ability[old_castling_ability[0].idx()][0];
self.hash ^= keys.castling_ability[old_castling_ability[1].idx()][1];
self.hash ^= keys.castling_ability[new_castling_ability[0].idx()][0];
self.hash ^= keys.castling_ability[new_castling_ability[1].idx()][1]
self.hash ^= keys.castling_ability[old_castling_ability[0]][0];
self.hash ^= keys.castling_ability[old_castling_ability[1]][1];
self.hash ^= keys.castling_ability[new_castling_ability[0]][0];
self.hash ^= keys.castling_ability[new_castling_ability[1]][1]
}
pub fn update_quiet(&mut self, src: usize, dst: usize, piece_at_src: PieceType, color: Color) {
let keys = zobrist_keys();
self.hash ^= keys.piece_square_color[src][piece_at_src.idx()][color.idx()];
self.hash ^= keys.piece_square_color[dst][piece_at_src.idx()][color.idx()];
self.hash ^= keys.piece_square_color[src][piece_at_src][color];
self.hash ^= keys.piece_square_color[dst][piece_at_src][color];
}
pub fn update_capture(
@@ -146,17 +146,16 @@ impl ZobristHash {
color: Color,
) {
let keys = zobrist_keys();
self.hash ^= keys.piece_square_color[src][piece_at_src.idx()][color.idx()];
self.hash ^= keys.piece_square_color[dst][piece_at_src.idx()][color.idx()];
self.hash ^= keys.piece_square_color[dst][piece_at_dst.idx()][color.opponent().idx()]
self.hash ^= keys.piece_square_color[src][piece_at_src][color];
self.hash ^= keys.piece_square_color[dst][piece_at_src][color];
self.hash ^= keys.piece_square_color[dst][piece_at_dst][color.opponent()]
}
pub fn update_en_passant(&mut self, src: usize, dst: usize, ep_capture: usize, color: Color) {
let keys = zobrist_keys();
self.hash ^= keys.piece_square_color[src][PieceType::Pawn.idx()][color.idx()];
self.hash ^= keys.piece_square_color[dst][PieceType::Pawn.idx()][color.idx()];
self.hash ^=
keys.piece_square_color[ep_capture][PieceType::Pawn.idx()][color.opponent().idx()]
self.hash ^= keys.piece_square_color[src][PieceType::Pawn][color];
self.hash ^= keys.piece_square_color[dst][PieceType::Pawn][color];
self.hash ^= keys.piece_square_color[ep_capture][PieceType::Pawn][color.opponent()]
}
pub fn update_double_push(
@@ -167,8 +166,8 @@ impl ZobristHash {
new_en_passant_target: Option<usize>,
) {
let keys = zobrist_keys();
self.hash ^= keys.piece_square_color[src][PieceType::Pawn.idx()][color.idx()];
self.hash ^= keys.piece_square_color[dst][PieceType::Pawn.idx()][color.idx()];
self.hash ^= keys.piece_square_color[src][PieceType::Pawn][color];
self.hash ^= keys.piece_square_color[dst][PieceType::Pawn][color];
if let Some(new_en_passant) = new_en_passant_target {
self.hash ^= keys.en_passant[square::to_file(new_en_passant)];
@@ -177,8 +176,8 @@ impl ZobristHash {
pub fn update_promotion(&mut self, src: usize, dst: usize, promote: &Promote, color: Color) {
let keys = zobrist_keys();
self.hash ^= keys.piece_square_color[src][PieceType::Pawn.idx()][color.idx()];
self.hash ^= keys.piece_square_color[dst][promote.into_piece_type().idx()][color.idx()];
self.hash ^= keys.piece_square_color[src][PieceType::Pawn][color];
self.hash ^= keys.piece_square_color[dst][promote.into_piece_type()][color];
}
pub fn update_promotion_capture(
@@ -190,9 +189,9 @@ impl ZobristHash {
color: Color,
) {
let keys = zobrist_keys();
self.hash ^= keys.piece_square_color[src][PieceType::Pawn.idx()][color.idx()];
self.hash ^= keys.piece_square_color[dst][piece_at_dst.idx()][color.opponent().idx()];
self.hash ^= keys.piece_square_color[dst][promote.into_piece_type().idx()][color.idx()];
self.hash ^= keys.piece_square_color[src][PieceType::Pawn][color];
self.hash ^= keys.piece_square_color[dst][piece_at_dst][color.opponent()];
self.hash ^= keys.piece_square_color[dst][promote.into_piece_type()][color];
}
pub fn update_castle(
@@ -205,10 +204,10 @@ impl ZobristHash {
color: Color,
) {
let keys = zobrist_keys();
self.hash ^= keys.piece_square_color[src][piece_at_src.idx()][color.idx()];
self.hash ^= keys.piece_square_color[dst][piece_at_src.idx()][color.idx()];
self.hash ^= keys.piece_square_color[rook_src][PieceType::Rook.idx()][color.idx()];
self.hash ^= keys.piece_square_color[rook_dst][PieceType::Rook.idx()][color.idx()];
self.hash ^= keys.piece_square_color[src][piece_at_src][color];
self.hash ^= keys.piece_square_color[dst][piece_at_src][color];
self.hash ^= keys.piece_square_color[rook_src][PieceType::Rook][color];
self.hash ^= keys.piece_square_color[rook_dst][PieceType::Rook][color];
}
pub fn drop_en_passant_hash(&mut self, en_passant: Option<usize>) {

View File

@@ -5,7 +5,7 @@ use crate::{
pub fn sort_moves(mut moves: Vec<Move>, mailbox: &Mailbox, tt_move: Option<Move>) -> Vec<Move> {
if let Some(tt_move) = tt_move {
if let Some(tt_move_index) = moves.iter().position(|&mv| mv == tt_move) {
moves.remove(tt_move_index);
moves.swap_remove(tt_move_index);
moves.insert(0, tt_move);
return moves;
}