make Setup::bitboards public
This commit is contained in:
parent
b45952b6b7
commit
b3eee18a16
3 changed files with 38 additions and 37 deletions
|
|
@ -77,7 +77,7 @@ impl<'l> Move<'l> {
|
||||||
pub fn captured(self) -> Option<Role> {
|
pub fn captured(self) -> Option<Role> {
|
||||||
match self.raw.kind {
|
match self.raw.kind {
|
||||||
MoveType::EnPassant => Some(Role::Pawn),
|
MoveType::EnPassant => Some(Role::Pawn),
|
||||||
_ => self.position.as_setup().get_role(self.raw.to),
|
_ => self.position.as_setup().role(self.raw.to),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -327,7 +327,7 @@ impl Position {
|
||||||
to,
|
to,
|
||||||
promotion,
|
promotion,
|
||||||
} = uci;
|
} = uci;
|
||||||
let role = self.0.get_role(from).ok_or(InvalidUciMove::Illegal)?;
|
let role = self.0.role(from).ok_or(InvalidUciMove::Illegal)?;
|
||||||
#[inline]
|
#[inline]
|
||||||
fn aux<'l, const ROLE: u8>(
|
fn aux<'l, const ROLE: u8>(
|
||||||
position: &'l Position,
|
position: &'l Position,
|
||||||
|
|
|
||||||
71
src/setup.rs
71
src/setup.rs
|
|
@ -231,7 +231,7 @@ impl Setup {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn get(&self, square: Square) -> Option<Piece> {
|
pub fn get(&self, square: Square) -> Option<Piece> {
|
||||||
Some(Piece {
|
Some(Piece {
|
||||||
role: self.get_role(square)?,
|
role: self.role(square)?,
|
||||||
color: match (self.w & square.bitboard()).is_empty() {
|
color: match (self.w & square.bitboard()).is_empty() {
|
||||||
false => Color::White,
|
false => Color::White,
|
||||||
true => Color::Black,
|
true => Color::Black,
|
||||||
|
|
@ -318,6 +318,40 @@ impl Setup {
|
||||||
self.en_passant = OptionSquare::new(square);
|
self.en_passant = OptionSquare::new(square);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns, for each color and each type of piece, the bitboard of all squares occupied.
|
||||||
|
#[inline]
|
||||||
|
pub fn bitboards(&self) -> ByColor<ByRole<Bitboard>> {
|
||||||
|
let Self {
|
||||||
|
w,
|
||||||
|
p_b_q,
|
||||||
|
n_b_k,
|
||||||
|
r_q_k,
|
||||||
|
..
|
||||||
|
} = self.clone();
|
||||||
|
let k = n_b_k & r_q_k;
|
||||||
|
let q = p_b_q & r_q_k;
|
||||||
|
let b = p_b_q & n_b_k;
|
||||||
|
let n = n_b_k ^ b ^ k;
|
||||||
|
let r = r_q_k ^ q ^ k;
|
||||||
|
let p = p_b_q ^ b ^ q;
|
||||||
|
ByColor::with(|color| {
|
||||||
|
let mask = match color {
|
||||||
|
Color::White => w,
|
||||||
|
Color::Black => !w,
|
||||||
|
};
|
||||||
|
ByRole::with(|role| {
|
||||||
|
mask & match role {
|
||||||
|
Role::Pawn => p,
|
||||||
|
Role::Knight => n,
|
||||||
|
Role::Bishop => b,
|
||||||
|
Role::Rook => r,
|
||||||
|
Role::Queen => q,
|
||||||
|
Role::King => k,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the mirror image of the position.
|
/// Returns the mirror image of the position.
|
||||||
///
|
///
|
||||||
/// The mirror of a position is the position obtained after reflecting the placement of pieces
|
/// The mirror of a position is the position obtained after reflecting the placement of pieces
|
||||||
|
|
@ -472,7 +506,7 @@ impl Setup {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub(crate) fn get_role(&self, square: Square) -> Option<Role> {
|
pub(crate) fn role(&self, square: Square) -> Option<Role> {
|
||||||
let mask = square.bitboard();
|
let mask = square.bitboard();
|
||||||
let bit0 = (self.p_b_q & mask).0 >> square as u8;
|
let bit0 = (self.p_b_q & mask).0 >> square as u8;
|
||||||
let bit1 = (self.n_b_k & mask).0 >> square as u8;
|
let bit1 = (self.n_b_k & mask).0 >> square as u8;
|
||||||
|
|
@ -482,39 +516,6 @@ impl Setup {
|
||||||
i => Some(unsafe { Role::transmute(i as u8) }),
|
i => Some(unsafe { Role::transmute(i as u8) }),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub(crate) fn bitboards(&self) -> ByColor<ByRole<Bitboard>> {
|
|
||||||
let Self {
|
|
||||||
w,
|
|
||||||
p_b_q,
|
|
||||||
n_b_k,
|
|
||||||
r_q_k,
|
|
||||||
..
|
|
||||||
} = self.clone();
|
|
||||||
let k = n_b_k & r_q_k;
|
|
||||||
let q = p_b_q & r_q_k;
|
|
||||||
let b = p_b_q & n_b_k;
|
|
||||||
let n = n_b_k ^ b ^ k;
|
|
||||||
let r = r_q_k ^ q ^ k;
|
|
||||||
let p = p_b_q ^ b ^ q;
|
|
||||||
ByColor::with(|color| {
|
|
||||||
let mask = match color {
|
|
||||||
Color::White => w,
|
|
||||||
Color::Black => !w,
|
|
||||||
};
|
|
||||||
ByRole::with(|role| {
|
|
||||||
mask & match role {
|
|
||||||
Role::Pawn => p,
|
|
||||||
Role::Knight => n,
|
|
||||||
Role::Bishop => b,
|
|
||||||
Role::Rook => r,
|
|
||||||
Role::Queen => q,
|
|
||||||
Role::King => k,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TryFrom<Setup> for Position {
|
impl TryFrom<Setup> for Position {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue