[board] Replace PieceSet's derived Hash and PartialEq with bespoke implementation

The piece set duplicates some data to make lookups more efficient. Only use the
necessary, unique data for these functions.
This commit is contained in:
Eryn Wells 2025-05-31 15:07:20 -07:00
parent 34e8c08c36
commit 086f9c5666

View file

@ -5,7 +5,10 @@ mod mailbox;
use self::mailbox::Mailbox;
use chessfriend_bitboard::{BitBoard, IterationDirection};
use chessfriend_core::{Color, Piece, Shape, Square};
use std::ops::BitOr;
use std::{
hash::{Hash, Hasher},
ops::BitOr,
};
use thiserror::Error;
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
@ -21,9 +24,9 @@ pub enum PlacePieceError {
ExisitingPiece { piece: Piece, square: Square },
}
/// The internal data structure of a [Board] that efficiently manages the
/// The internal data structure of a [`Board`] that efficiently manages the
/// placement of pieces on the board.
#[derive(Clone, Debug, Default, Eq, Hash, PartialEq)]
#[derive(Clone, Debug, Default, Eq)]
pub struct PieceSet {
mailbox: Mailbox,
color_occupancy: [BitBoard; Color::NUM],
@ -140,6 +143,20 @@ impl PieceSet {
}
}
impl Hash for PieceSet {
fn hash<H: Hasher>(&self, state: &mut H) {
self.color_occupancy.hash(state);
self.shape_occupancy.hash(state);
}
}
impl PartialEq for PieceSet {
fn eq(&self, other: &Self) -> bool {
self.color_occupancy == other.color_occupancy
&& self.shape_occupancy == other.shape_occupancy
}
}
#[cfg(test)]
mod tests {
use super::*;