use super::{Player, PieceType, GenTypes};
use super::sq::SQ;
use super::bitboard::BitBoard;
pub trait PlayerTrait {
fn player() -> Player;
fn opp_player() -> Player;
fn player_idx() -> usize;
fn down(sq: SQ) -> SQ;
fn up(sq: SQ) -> SQ;
fn left(sq: SQ) -> SQ;
fn right(sq: SQ) -> SQ;
fn down_left(sq: SQ) -> SQ;
fn down_right(sq: SQ) -> SQ;
fn up_left(sq: SQ) -> SQ;
fn up_right(sq: SQ) -> SQ;
fn shift_down(bb: BitBoard) -> BitBoard;
fn shift_up(bb: BitBoard) -> BitBoard;
fn shift_left(bb: BitBoard) -> BitBoard;
fn shift_right(bb: BitBoard) -> BitBoard;
fn shift_down_left(bb: BitBoard) -> BitBoard;
fn shift_down_right(bb: BitBoard) -> BitBoard;
fn shift_up_left(bb: BitBoard) -> BitBoard;
fn shift_up_right(bb: BitBoard) -> BitBoard;
}
pub struct WhiteType {}
pub struct BlackType {}
impl PlayerTrait for WhiteType {
#[inline(always)]
fn player() -> Player {
Player::White
}
#[inline(always)]
fn opp_player() -> Player {
Player::Black
}
#[inline(always)]
fn player_idx() -> usize {Player::White as usize}
#[inline(always)]
fn down(sq: SQ) -> SQ { sq - SQ(8) }
#[inline(always)]
fn up(sq: SQ) -> SQ { sq + SQ(8) }
#[inline(always)]
fn left(sq: SQ) -> SQ { sq - SQ(1) }
#[inline(always)]
fn right(sq: SQ) -> SQ { sq + SQ(1) }
#[inline(always)]
fn down_left(sq: SQ) -> SQ { sq - SQ(9) }
#[inline(always)]
fn down_right(sq: SQ) -> SQ { sq - SQ(7) }
#[inline(always)]
fn up_left(sq: SQ) -> SQ { sq + SQ(7) }
#[inline(always)]
fn up_right(sq: SQ) -> SQ { sq + SQ(9) }
#[inline(always)]
fn shift_down(bb: BitBoard) -> BitBoard { bb >> 8 }
#[inline(always)]
fn shift_up(bb: BitBoard) -> BitBoard { bb << 8 }
#[inline(always)]
fn shift_left(bb: BitBoard) -> BitBoard { (bb & !BitBoard::FILE_A) >> 1 }
#[inline(always)]
fn shift_right(bb: BitBoard) -> BitBoard { (bb & !BitBoard::FILE_H) << 1 }
#[inline(always)]
fn shift_down_left(bb: BitBoard) -> BitBoard { (bb & !BitBoard::FILE_A) >> 9 }
#[inline(always)]
fn shift_down_right(bb: BitBoard) -> BitBoard { (bb & !BitBoard::FILE_H) >> 7 }
#[inline(always)]
fn shift_up_left(bb: BitBoard) -> BitBoard { (bb & !BitBoard::FILE_A) << 7 }
#[inline(always)]
fn shift_up_right(bb: BitBoard) -> BitBoard { (bb & !BitBoard::FILE_H) << 9 }
}
impl PlayerTrait for BlackType {
#[inline(always)]
fn player() -> Player {
Player::Black
}
#[inline(always)]
fn opp_player() -> Player {
Player::White
}
#[inline(always)]
fn player_idx() -> usize {Player::Black as usize}
#[inline(always)]
fn down(sq: SQ) -> SQ { sq + SQ(8) }
#[inline(always)]
fn up(sq: SQ) -> SQ { sq - SQ(8) }
#[inline(always)]
fn left(sq: SQ) -> SQ { sq + SQ(1) }
#[inline(always)]
fn right(sq: SQ) -> SQ { sq - SQ(1) }
#[inline(always)]
fn down_left(sq: SQ) -> SQ { sq + SQ(9) }
#[inline(always)]
fn down_right(sq: SQ) -> SQ { sq + SQ(7) }
#[inline(always)]
fn up_left(sq: SQ) -> SQ { sq - SQ(7) }
#[inline(always)]
fn up_right(sq: SQ) -> SQ { sq - SQ(9) }
#[inline(always)]
fn shift_down(bb: BitBoard) -> BitBoard { bb << (8) }
#[inline(always)]
fn shift_up(bb: BitBoard) -> BitBoard { bb >> (8) }
#[inline(always)]
fn shift_left(bb: BitBoard) -> BitBoard {
(bb & !BitBoard::FILE_H) << (1)
}
#[inline(always)]
fn shift_right(bb: BitBoard) -> BitBoard {
(bb & !BitBoard::FILE_A) >> (1)
}
#[inline(always)]
fn shift_down_left(bb: BitBoard) -> BitBoard {
(bb & !BitBoard::FILE_H) << (9)
}
#[inline(always)]
fn shift_down_right(bb: BitBoard) -> BitBoard {
(bb & !BitBoard::FILE_A) << (7)
}
#[inline(always)]
fn shift_up_left(bb: BitBoard) -> BitBoard {
(bb & !BitBoard::FILE_H) >> (7)
}
#[inline(always)]
fn shift_up_right(bb: BitBoard) -> BitBoard {
(bb & !BitBoard::FILE_A) >> (9)
}
}
pub trait GenTypeTrait {
fn gen_type() -> GenTypes;
}
pub struct AllGenType {}
pub struct CapturesGenType {}
pub struct QuietsGenType {}
pub struct QuietChecksGenType {}
pub struct EvasionsGenType {}
pub struct NonEvasionsGenType {}
impl GenTypeTrait for AllGenType {
#[inline(always)]
fn gen_type() -> GenTypes {
GenTypes::All
}
}
impl GenTypeTrait for CapturesGenType {
#[inline(always)]
fn gen_type() -> GenTypes {
GenTypes::Captures
}
}
impl GenTypeTrait for QuietsGenType {
#[inline(always)]
fn gen_type() -> GenTypes {
GenTypes::Quiets
}
}
impl GenTypeTrait for QuietChecksGenType {
#[inline(always)]
fn gen_type() -> GenTypes {
GenTypes::QuietChecks
}
}
impl GenTypeTrait for EvasionsGenType {
#[inline(always)]
fn gen_type() -> GenTypes {
GenTypes::Evasions
}
}
impl GenTypeTrait for NonEvasionsGenType {
#[inline(always)]
fn gen_type() -> GenTypes {
GenTypes::NonEvasions
}
}
pub trait PieceTrait {
fn piece_type() -> PieceType;
}
pub struct PawnType {}
pub struct KnightType {}
pub struct BishopType {}
pub struct RookType {}
pub struct QueenType {}
pub struct KingType {}
impl PieceTrait for PawnType {
#[inline(always)]
fn piece_type() -> PieceType {
PieceType::P
}
}
impl PawnType {
#[inline(always)]
fn incr() -> impl PieceTrait {
KnightType{}
}
}
impl PieceTrait for KnightType {
#[inline(always)]
fn piece_type() -> PieceType {
PieceType::N
}
}
impl KnightType {
#[inline(always)]
fn incr() -> impl PieceTrait {
BishopType{}
}
}
impl PieceTrait for BishopType {
#[inline(always)]
fn piece_type() -> PieceType {
PieceType::B
}
}
impl BishopType {
#[inline(always)]
fn incr() -> impl PieceTrait {
RookType{}
}
}
impl PieceTrait for RookType {
#[inline(always)]
fn piece_type() -> PieceType {
PieceType::R
}
}
impl RookType {
#[inline(always)]
fn incr() -> impl PieceTrait {
QueenType{}
}
}
impl PieceTrait for QueenType {
#[inline(always)]
fn piece_type() -> PieceType {
PieceType::Q
}
}
impl QueenType {
#[inline(always)]
fn incr() -> impl PieceTrait {
KingType{}
}
}
impl PieceTrait for KingType {
#[inline(always)]
fn piece_type() -> PieceType {
PieceType::K
}
}
impl KingType {
#[inline(always)]
fn incr() -> impl PieceTrait {
KingType{}
}
}