Add '*Assign' operators to 'Bitboard'
This commit is contained in:
parent
02768b6d96
commit
072a1ea13c
|
@ -115,6 +115,22 @@ impl std::ops::Shr<usize> for Bitboard {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Treat bitboard as a set of squares, shift each square's index left by the amount given.
|
||||||
|
impl std::ops::ShlAssign<usize> for Bitboard {
|
||||||
|
#[inline(always)]
|
||||||
|
fn shl_assign(&mut self, rhs: usize) {
|
||||||
|
*self = *self << rhs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Treat bitboard as a set of squares, shift each square's index right by the amount given.
|
||||||
|
impl std::ops::ShrAssign<usize> for Bitboard {
|
||||||
|
#[inline(always)]
|
||||||
|
fn shr_assign(&mut self, rhs: usize) {
|
||||||
|
*self = *self >> rhs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Treat bitboard as a set of squares, and invert the set.
|
/// Treat bitboard as a set of squares, and invert the set.
|
||||||
impl std::ops::Not for Bitboard {
|
impl std::ops::Not for Bitboard {
|
||||||
type Output = Bitboard;
|
type Output = Bitboard;
|
||||||
|
@ -145,6 +161,22 @@ impl std::ops::BitOr<Square> for Bitboard {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Treat each bitboard as a set of squares, keep squares that are in either sets.
|
||||||
|
impl std::ops::BitOrAssign<Bitboard> for Bitboard {
|
||||||
|
#[inline(always)]
|
||||||
|
fn bitor_assign(&mut self, rhs: Bitboard) {
|
||||||
|
*self = *self | rhs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Treat the [Square] as a singleton bitboard, and apply the operator.
|
||||||
|
impl std::ops::BitOrAssign<Square> for Bitboard {
|
||||||
|
#[inline(always)]
|
||||||
|
fn bitor_assign(&mut self, rhs: Square) {
|
||||||
|
*self = *self | rhs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Treat each bitboard as a set of squares, keep squares that are in both sets.
|
/// Treat each bitboard as a set of squares, keep squares that are in both sets.
|
||||||
impl std::ops::BitAnd<Bitboard> for Bitboard {
|
impl std::ops::BitAnd<Bitboard> for Bitboard {
|
||||||
type Output = Bitboard;
|
type Output = Bitboard;
|
||||||
|
@ -165,6 +197,22 @@ impl std::ops::BitAnd<Square> for Bitboard {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Treat each bitboard as a set of squares, keep squares that are in both sets.
|
||||||
|
impl std::ops::BitAndAssign<Bitboard> for Bitboard {
|
||||||
|
#[inline(always)]
|
||||||
|
fn bitand_assign(&mut self, rhs: Bitboard) {
|
||||||
|
*self = *self & rhs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Treat the [Square] as a singleton bitboard, and apply the operator.
|
||||||
|
impl std::ops::BitAndAssign<Square> for Bitboard {
|
||||||
|
#[inline(always)]
|
||||||
|
fn bitand_assign(&mut self, rhs: Square) {
|
||||||
|
*self = *self & rhs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Treat each bitboard as a set of squares, keep squares that are in exactly one of either set.
|
/// Treat each bitboard as a set of squares, keep squares that are in exactly one of either set.
|
||||||
impl std::ops::BitXor<Bitboard> for Bitboard {
|
impl std::ops::BitXor<Bitboard> for Bitboard {
|
||||||
type Output = Bitboard;
|
type Output = Bitboard;
|
||||||
|
@ -185,6 +233,22 @@ impl std::ops::BitXor<Square> for Bitboard {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Treat each bitboard as a set of squares, keep squares that are in exactly one of either set.
|
||||||
|
impl std::ops::BitXorAssign<Bitboard> for Bitboard {
|
||||||
|
#[inline(always)]
|
||||||
|
fn bitxor_assign(&mut self, rhs: Bitboard) {
|
||||||
|
*self = *self ^ rhs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Treat the [Square] as a singleton bitboard, and apply the operator.
|
||||||
|
impl std::ops::BitXorAssign<Square> for Bitboard {
|
||||||
|
#[inline(always)]
|
||||||
|
fn bitxor_assign(&mut self, rhs: Square) {
|
||||||
|
*self = *self ^ rhs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Treat each bitboard as a set of squares, and substract one set from another.
|
/// Treat each bitboard as a set of squares, and substract one set from another.
|
||||||
impl std::ops::Sub<Bitboard> for Bitboard {
|
impl std::ops::Sub<Bitboard> for Bitboard {
|
||||||
type Output = Bitboard;
|
type Output = Bitboard;
|
||||||
|
@ -205,6 +269,22 @@ impl std::ops::Sub<Square> for Bitboard {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Treat each bitboard as a set of squares, and substract one set from another.
|
||||||
|
impl std::ops::SubAssign<Bitboard> for Bitboard {
|
||||||
|
#[inline(always)]
|
||||||
|
fn sub_assign(&mut self, rhs: Bitboard) {
|
||||||
|
*self = *self - rhs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Treat the [Square] as a singleton bitboard, and apply the operator.
|
||||||
|
impl std::ops::SubAssign<Square> for Bitboard {
|
||||||
|
#[inline(always)]
|
||||||
|
fn sub_assign(&mut self, rhs: Square) {
|
||||||
|
*self = *self - rhs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
|
|
@ -139,7 +139,7 @@ impl Direction {
|
||||||
|
|
||||||
while !board.is_empty() {
|
while !board.is_empty() {
|
||||||
board = self.move_board(board);
|
board = self.move_board(board);
|
||||||
res = res | board;
|
res |= board;
|
||||||
if !(board & blockers).is_empty() {
|
if !(board & blockers).is_empty() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,16 +20,16 @@ pub fn generate_rook_mask(square: Square) -> Bitboard {
|
||||||
let mask = {
|
let mask = {
|
||||||
let mut mask = Bitboard::EMPTY;
|
let mut mask = Bitboard::EMPTY;
|
||||||
if square.file() != File::A {
|
if square.file() != File::A {
|
||||||
mask = mask | File::A.into_bitboard()
|
mask |= File::A.into_bitboard()
|
||||||
};
|
};
|
||||||
if square.file() != File::H {
|
if square.file() != File::H {
|
||||||
mask = mask | File::H.into_bitboard()
|
mask |= File::H.into_bitboard()
|
||||||
};
|
};
|
||||||
if square.rank() != Rank::First {
|
if square.rank() != Rank::First {
|
||||||
mask = mask | Rank::First.into_bitboard()
|
mask |= Rank::First.into_bitboard()
|
||||||
};
|
};
|
||||||
if square.rank() != Rank::Eighth {
|
if square.rank() != Rank::Eighth {
|
||||||
mask = mask | Rank::Eighth.into_bitboard()
|
mask |= Rank::Eighth.into_bitboard()
|
||||||
};
|
};
|
||||||
mask
|
mask
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue