#[allow(unused_imports)]
use crate::{gen_moves, BitBoard, Board, MoveList, QuietMoves, TacticalMoves};
use core::ops::{BitAnd, BitOr, BitXor};
use core::ops::{BitAndAssign, BitOrAssign, BitXorAssign};
macro_rules! impl_bitwise_op {
($trait:ident, $func:ident) => {
impl $trait for BitBoard {
type Output = Self;
#[inline]
fn $func(self, other: Self) -> BitBoard {
Self($trait::$func(self.0, other.0))
}
}
};
}
macro_rules! impl_bitwise_assign_op {
($trait:ident, $func:ident) => {
impl $trait for BitBoard {
#[inline]
fn $func(&mut self, other: Self) {
$trait::$func(&mut self.0, other.0)
}
}
};
}
impl_bitwise_op!(BitAnd, bitand);
impl_bitwise_op!(BitOr, bitor);
impl_bitwise_op!(BitXor, bitxor);
impl_bitwise_assign_op!(BitAndAssign, bitand_assign);
impl_bitwise_assign_op!(BitOrAssign, bitor_assign);
impl_bitwise_assign_op!(BitXorAssign, bitxor_assign);
#[doc(hidden)]
#[macro_export]
macro_rules! BitBoardConsts {
($($name:ident = $value:expr),* $(,)?) => {
$(
#[doc = concat!("BitBoard representing `", stringify!($name), "`.")]
pub const $name: BitBoard = BitBoard($value);
)*
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! SquareDocs {
($($square:ident),*) => {
#[derive(PartialEq, Ord, Eq, PartialOrd, Copy, Clone, Debug, Hash)]
#[repr(u8)]
pub enum Square {
$(
#[doc = concat!("The square `", stringify!($square), "`.")]
$square,
)*
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! BlackMagic {
($mg: expr, $nm: expr, $o: expr) => {
BlackMagicEntry {
magic: $mg,
not_mask: $nm,
offset: $o,
}
};
}
macro_rules! impl_piece_lookups {
($($piece_index:expr, $allied_fn:ident, $enemy_fn:ident, $total_fn:ident),*) => {
impl Board {
$(
#[doc = stringify!($total_fn)]
#[inline(always)]
pub const fn $allied_fn(&self) -> BitBoard {
BitBoard(self.pieces_bitboard[$piece_index].0 & self.sides_bitboard[self.side as usize].0)
}
#[doc = stringify!($total_fn)]
#[inline(always)]
pub const fn $enemy_fn(&self) -> BitBoard {
BitBoard(self.pieces_bitboard[$piece_index].0 & self.sides_bitboard[self.side as usize ^ 1].0)
}
#[doc = stringify!($total_fn)]
#[inline(always)]
pub const fn $total_fn(&self) -> BitBoard {
self.pieces_bitboard[$piece_index]
}
)*
}
};
}
impl_piece_lookups! {
0, allied_pawns, enemy_pawns, pawns,
1, allied_knights, enemy_knights, knights,
2, allied_bishops, enemy_bishops, bishops,
3, allied_rooks, enemy_rooks, rooks,
4, allied_queens, enemy_queens, queens,
5, allied_king, enemy_king, kings
}
#[doc(hidden)]
#[macro_export]
macro_rules! Call_Handler {
($handler:expr, $src:expr, $dest:expr, $move_type:ident) => {
$handler(Move::new($src, $dest, MoveType::$move_type))
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! Enumerate_Moves {
($check:expr, $board:expr, $diagonal_pins:expr, $linear_pins:expr, $handler:expr) => {
enumerate_pawn_moves::<$check, M, F>(
$board,
$board.allied_pawns(),
$diagonal_pins,
$linear_pins,
&mut $handler,
);
enumerate_knight_moves::<$check, M, F>(
$board,
$board.allied_knights(),
$diagonal_pins,
$linear_pins,
&mut $handler,
);
enumerate_bishop_moves::<$check, M, F>(
$board,
$board.allied_bishops() | $board.allied_queens(),
$diagonal_pins,
$linear_pins,
&mut $handler,
);
enumerate_rook_moves::<$check, M, F>(
$board,
$board.allied_rooks() | $board.allied_queens(),
$diagonal_pins,
$linear_pins,
&mut $handler,
);
};
}
#[macro_export]
macro_rules! legal_moves {
($board:expr) => {
$crate::gen_moves::<$crate::AllMoves>($board);
};
}
#[macro_export]
macro_rules! quiet_moves {
($board:expr) => {
$crate::gen_moves::<$crate::QuietMoves>($board);
};
}
#[macro_export]
macro_rules! tactical_moves {
($board:expr) => {
$crate::gen_moves::<$crate::TacticalMoves>($board);
};
}