1
0
Fork 0
eschac/src/rays.rs
2025-09-03 20:57:14 +02:00

44 lines
1.2 KiB
Rust

use crate::bitboard::*;
use crate::board::*;
pub(crate) struct Rays(BySquare<ByDirection<Bitboard>>);
impl Rays {
pub(crate) fn new() -> Self {
Self(BySquare::new(|square| {
ByDirection::new(|direction| {
let mut square = square;
let mut res = Bitboard::new();
while let Some(x) = square.trans(direction) {
square = x;
res |= square.bitboard();
}
res
})
}))
}
#[inline]
pub(crate) fn ray(&self, square: Square, direction: Direction) -> Bitboard {
*self.0.get(square).get(direction)
}
pub(crate) fn blocked(
&self,
square: Square,
direction: Direction,
blockers: Bitboard,
) -> Bitboard {
let blockers = blockers & *self.0.get(square).get(direction);
let square2 = if (direction as u8) < 4 {
blockers.first()
} else {
blockers.last()
};
*self.0.get(square).get(direction)
& !match square2 {
Some(square2) => *self.0.get(square2).get(direction),
None => Bitboard::new(),
}
}
}