use crate::bitboard::*; use crate::board::*; pub(crate) struct Rays(BySquare>); 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(), } } }