use super::ChessBoard;
use crate::defs::*;
include!(concat!(env!("OUT_DIR"), "/zobrist.rs"));
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ZobristHash(u64);
impl ZobristHash {
#[inline]
pub(super) const fn new() -> Self {
ZobristHash(0)
}
#[inline]
pub const fn to_u64(self) -> u64 {
self.0
}
#[inline]
pub(super) fn piece(&mut self, square: Square, piece: impl Into<Piece>) {
let piece = piece.into();
self.0 ^= PIECE_ZOBRIST[piece.color.index()][piece.kind.index()][square.index()];
}
#[inline]
pub(super) fn castle_right(&mut self, side: CastleSide, color: Color) {
match side {
CastleSide::Kingside => self.0 ^= CASTLE_RIGHTS_ZOBRIST[0][color.index()],
CastleSide::Queenside => self.0 ^= CASTLE_RIGHTS_ZOBRIST[1][color.index()],
}
}
#[inline]
pub(super) fn ep(&mut self, square: Square) {
self.0 ^= EN_PASSANT_ZOBRIST[square.file() as usize];
}
#[inline]
pub(super) fn toggle_turn(&mut self) {
self.0 ^= TURN_ZOBRIST;
}
}