use super::BitBoard;
#[derive(Debug)]
pub struct Magic {
mask: BitBoard,
magic: u64,
shift: u8,
offset: usize,
}
impl Magic {
pub const fn new(mask: BitBoard, magic: u64, shift: u8, offset: usize) -> Self {
Self {
mask,
magic,
shift,
offset,
}
}
pub fn key(&self, occupancy: BitBoard) -> usize {
Self::calculate_key(occupancy, self.mask, self.magic, self.shift) + self.offset
}
pub fn calculate_key(occupancy: BitBoard, mask: BitBoard, magic: u64, shift: u8) -> usize {
let masked = occupancy & mask;
let hash = masked.to_u64().wrapping_mul(magic);
let key = hash >> shift;
key as usize
}
pub fn mask(&self) -> BitBoard {
self.mask
}
pub fn magic(&self) -> u64 {
self.magic
}
pub fn shift(&self) -> u8 {
self.shift
}
pub fn offset(&self) -> usize {
self.offset
}
}