use super::psqt;
use super::zobrist;
use super::magic;
use super::boards;
use {SQ,BitBoard,Player,PieceType,File,Rank,Piece};
use core::score::{Score,Value};
use std::sync::atomic::{AtomicBool,Ordering,fence,compiler_fence};
use std::sync::{Once, ONCE_INIT};
use std::mem;
static INITIALIZED: AtomicBool = AtomicBool::new(false);
static INIT: Once = ONCE_INIT;
#[cold]
pub fn init_statics() {
INIT.call_once(|| {
compiler_fence(Ordering::SeqCst);
fence(Ordering::SeqCst);
zobrist::init_zobrist();
psqt::init_psqt();
magic::init_magics();
compiler_fence(Ordering::SeqCst);
boards::init_boards();
fence(Ordering::SeqCst);
compiler_fence(Ordering::SeqCst);
});
}
#[inline(always)]
pub fn bishop_moves(occupied: BitBoard, sq: SQ) -> BitBoard {
debug_assert!(sq.is_okay());
BitBoard(magic::bishop_attacks(occupied.0, sq.0))
}
#[inline(always)]
pub fn rook_moves(occupied: BitBoard, sq: SQ) -> BitBoard {
debug_assert!(sq.is_okay());
BitBoard(magic::rook_attacks(occupied.0, sq.0))
}
#[inline(always)]
pub fn queen_moves(occupied: BitBoard, sq: SQ) -> BitBoard {
debug_assert!(sq.is_okay());
BitBoard(magic::rook_attacks(occupied.0, sq.0)
| magic::bishop_attacks(occupied.0, sq.0))
}
#[inline(always)]
pub fn knight_moves(sq: SQ) -> BitBoard {
BitBoard(boards::knight_moves(sq))
}
#[inline(always)]
pub fn king_moves(sq: SQ) -> BitBoard {
BitBoard(boards::king_moves(sq))
}
#[inline(always)]
pub fn distance_of_sqs(sq_one: SQ, sq_two: SQ) -> u8 {
boards::distance_of_sqs(sq_one, sq_two)
}
#[inline(always)]
pub fn line_bb(sq_one: SQ, sq_two: SQ) -> BitBoard {
BitBoard(boards::line_bb(sq_one, sq_two))
}
#[inline(always)]
pub fn between_bb(sq_one: SQ, sq_two: SQ) -> BitBoard {
BitBoard(boards::between_bb(sq_one, sq_two))
}
#[inline(always)]
pub fn adjacent_sq_file(sq: SQ) -> BitBoard {
BitBoard(boards::adjacent_sq_file(sq))
}
#[inline(always)]
pub fn adjacent_file(f: File) -> BitBoard {
BitBoard(boards::adjacent_file(f))
}
#[inline(always)]
pub fn pawn_attacks_from(sq: SQ, player: Player) -> BitBoard {
BitBoard(boards::pawn_attacks_from(sq,player))
}
#[inline(always)]
pub fn aligned(s1: SQ, s2: SQ, s3: SQ) -> bool {
boards::aligned(s1,s2,s3)
}
#[inline(always)]
pub fn ring_distance(sq: SQ, distance: u8) -> BitBoard {
BitBoard(boards::ring_distance(sq,distance))
}
#[inline(always)]
pub fn forward_rank_bb(player: Player, rank: Rank) -> BitBoard {
BitBoard(boards::forward_rank_bb(player,rank))
}
#[inline(always)]
pub fn pawn_attacks_span(player: Player, sq: SQ) -> BitBoard {
BitBoard(boards::pawn_attacks_span(player,sq))
}
#[inline(always)]
pub fn forward_file_bb(player: Player, sq: SQ) -> BitBoard {
BitBoard(boards::forward_file_bb(player,sq))
}
#[inline(always)]
pub fn passed_pawn_mask(player: Player, sq: SQ) -> BitBoard {
BitBoard(boards::passed_pawn_mask(player, sq))
}
#[inline(always)]
pub fn z_square(sq: SQ, piece: Piece) -> u64 {
zobrist::z_square(sq, piece)
}
#[inline(always)]
pub fn z_ep(sq: SQ) -> u64 {
zobrist::z_ep(sq)
}
#[inline(always)]
pub fn z_castle(castle: u8) -> u64 {
zobrist::z_castle(castle)
}
#[inline(always)]
pub fn z_side() -> u64 {
zobrist::z_side()
}
#[inline(always)]
pub fn z_no_pawns() -> u64 {
zobrist::z_no_pawns()
}
#[inline(always)]
pub fn psq(piece: Piece, sq: SQ) -> Score {
psqt::psq(piece, sq)
}
#[inline(always)]
pub fn piece_value(piece: Piece, eg: bool) -> Value {
psqt::piece_value(piece, eg)
}
#[inline(always)]
pub fn piecetype_value(piece_type: PieceType, eg: bool) -> Value {
let piece: Piece = unsafe {mem::transmute(piece_type)};
psqt::piece_value(piece, eg)
}