use std::{
collections::{HashMap, HashSet},
hash::{BuildHasher, Hasher},
};
use shakmaty::{
zobrist::{Zobrist128, Zobrist16, Zobrist32, Zobrist64, Zobrist8, ZobristHash},
Chess, EnPassantMode,
};
use crate::{
abk::SBookMoveEntry, brainlearn::ExperienceEntry, obk::ObkMoveEntry, polyglot::BookEntry, tr,
};
pub fn zobrist_hash(position: &Chess) -> u64 {
position
.zobrist_hash::<Zobrist64>(EnPassantMode::PseudoLegal)
.0
}
pub fn zobrist8_hash(position: &Chess) -> u8 {
position
.zobrist_hash::<Zobrist8>(EnPassantMode::PseudoLegal)
.0
}
pub fn zobrist16_hash(position: &Chess) -> u16 {
position
.zobrist_hash::<Zobrist16>(EnPassantMode::PseudoLegal)
.0
}
pub fn zobrist32_hash(position: &Chess) -> u32 {
position
.zobrist_hash::<Zobrist32>(EnPassantMode::PseudoLegal)
.0
}
pub fn zobrist128_hash(position: &Chess) -> u128 {
position
.zobrist_hash::<Zobrist128>(EnPassantMode::PseudoLegal)
.0
}
pub struct ZobristHasher {
value: u64,
}
impl Hasher for ZobristHasher {
fn write(&mut self, _bytes: &[u8]) {
unreachable!("{}", tr!("ZobristHasher should only be used for u64 keys"));
}
fn write_u64(&mut self, i: u64) {
self.value = i;
}
fn finish(&self) -> u64 {
self.value
}
}
#[derive(Clone)]
pub struct ZobristHasherBuilder;
impl Default for ZobristHasherBuilder {
fn default() -> Self {
Self
}
}
impl BuildHasher for ZobristHasherBuilder {
type Hasher = ZobristHasher;
fn build_hasher(&self) -> Self::Hasher {
ZobristHasher { value: 0 }
}
}
pub type ZobristHashSet = HashSet<u64, ZobristHasherBuilder>;
pub type EpdHashMap = HashMap<u64, String, ZobristHasherBuilder>;
pub type BookEntryHashMap = HashMap<u64, Vec<BookEntry>, ZobristHasherBuilder>;
pub type ExperienceEntryHashMap = HashMap<u64, Vec<ExperienceEntry>, ZobristHasherBuilder>;
pub type ObkMoveEntryHashMap = HashMap<u64, Vec<ObkMoveEntry>, ZobristHasherBuilder>;
pub type SBookMoveEntryHashMap = HashMap<u64, Vec<SBookMoveEntry>, ZobristHasherBuilder>;