owlchess 0.4.1

Yet another chess library for Rust
Documentation
use crate::bitboard::Bitboard;
use crate::types::{Color, Coord};

#[inline]
const fn bb(val: u64) -> Bitboard {
    Bitboard::from_raw(val)
}

include!(concat!(env!("OUT_DIR"), "/near_attacks.rs"));

struct MagicEntry {
    mask: Bitboard,
    post_mask: Bitboard,
    lookup: *const Bitboard,
}

unsafe impl Sync for MagicEntry {}

include!(concat!(env!("OUT_DIR"), "/magic.rs"));

#[inline]
pub fn king(coord: Coord) -> Bitboard {
    unsafe { *KING_ATTACKS.get_unchecked(coord.index()) }
}

#[inline]
pub fn knight(coord: Coord) -> Bitboard {
    unsafe { *KNIGHT_ATTACKS.get_unchecked(coord.index()) }
}

#[inline]
pub fn pawn(color: Color, coord: Coord) -> Bitboard {
    match color {
        Color::White => unsafe { *WHITE_PAWN_ATTACKS.get_unchecked(coord.index()) },
        Color::Black => unsafe { *BLACK_PAWN_ATTACKS.get_unchecked(coord.index()) },
    }
}

#[inline]
pub fn rook(coord: Coord, occupied: Bitboard) -> Bitboard {
    unsafe {
        let entry = MAGIC_ROOK.get_unchecked(coord.index());
        let magic = *MAGIC_CONSTS_ROOK.get_unchecked(coord.index());
        let shift = *MAGIC_SHIFTS_ROOK.get_unchecked(coord.index());
        let idx = (occupied & entry.mask).as_raw().wrapping_mul(magic) >> shift;
        *entry.lookup.add(idx as usize) & entry.post_mask
    }
}

#[inline]
pub fn bishop(coord: Coord, occupied: Bitboard) -> Bitboard {
    unsafe {
        let entry = MAGIC_BISHOP.get_unchecked(coord.index());
        let magic = *MAGIC_CONSTS_BISHOP.get_unchecked(coord.index());
        let shift = *MAGIC_SHIFTS_BISHOP.get_unchecked(coord.index());
        let idx = (occupied & entry.mask).as_raw().wrapping_mul(magic) >> shift;
        *entry.lookup.add(idx as usize) & entry.post_mask
    }
}