[BitBoard] Add fills and direction methods
This commit is contained in:
20
BitBoard.cpp
20
BitBoard.cpp
@@ -31,3 +31,23 @@ BitBoard BitBoard::getRank(int r) {
|
||||
BitBoard BitBoard::genShift(BitBoard x, const int s) {
|
||||
return (s < 0) ? (x >> -s) : (s > 63) ? x : (x << s);
|
||||
}
|
||||
|
||||
BitBoard BitBoard::northFill() const {
|
||||
BitBoard result(mBoard);
|
||||
result |= (result << 8);
|
||||
result |= (result << 16);
|
||||
result |= (result << 32);
|
||||
return (result << 8);
|
||||
}
|
||||
|
||||
BitBoard BitBoard::southFill() const {
|
||||
BitBoard result(mBoard);
|
||||
result |= (result >> 8);
|
||||
result |= (result >> 16);
|
||||
result |= (result >> 32);
|
||||
return result;
|
||||
}
|
||||
|
||||
BitBoard BitBoard::fileFill() const {
|
||||
return northFill() | southFill();
|
||||
}
|
||||
|
41
BitBoard.h
41
BitBoard.h
@@ -82,8 +82,18 @@ public:
|
||||
constexpr void clear(unsigned i);
|
||||
constexpr void set(unsigned i);
|
||||
|
||||
BitBoard left(unsigned i) const;
|
||||
BitBoard right(unsigned i) const;
|
||||
BitBoard north() const;
|
||||
BitBoard northEast() const;
|
||||
BitBoard northWest() const;
|
||||
BitBoard east() const;
|
||||
BitBoard south() const;
|
||||
BitBoard southEast() const;
|
||||
BitBoard southWest() const;
|
||||
BitBoard west() const;
|
||||
|
||||
BitBoard northFill() const;
|
||||
BitBoard southFill() const;
|
||||
BitBoard fileFill() const;
|
||||
|
||||
static BitBoard fromIndex(unsigned i);
|
||||
|
||||
@@ -215,11 +225,30 @@ constexpr void BitBoard::clear(const unsigned i) {
|
||||
inline BitBoard BitBoard::fromIndex(const unsigned i) {
|
||||
return 1ULL << i;
|
||||
}
|
||||
inline BitBoard BitBoard::left(const unsigned int i) const {
|
||||
return (mBoard >> i);
|
||||
|
||||
inline BitBoard BitBoard::north() const {
|
||||
return (mBoard << 8);
|
||||
}
|
||||
inline BitBoard BitBoard::right(const unsigned int i) const {
|
||||
return (mBoard << i);
|
||||
inline BitBoard BitBoard::northEast() const {
|
||||
return (mBoard << 9) & ~AFile;
|
||||
}
|
||||
inline BitBoard BitBoard::northWest() const {
|
||||
return (mBoard << 7) & ~HFile;
|
||||
}
|
||||
inline BitBoard BitBoard::west() const {
|
||||
return (mBoard >> 1) & ~HFile;
|
||||
}
|
||||
inline BitBoard BitBoard::east() const {
|
||||
return (mBoard << 1) & ~AFile;
|
||||
}
|
||||
inline BitBoard BitBoard::south() const {
|
||||
return (mBoard >> 8);
|
||||
}
|
||||
inline BitBoard BitBoard::southEast() const {
|
||||
return (mBoard >> 7) & ~AFile;
|
||||
}
|
||||
inline BitBoard BitBoard::southWest() const {
|
||||
return (mBoard >> 9) & ~HFile;
|
||||
}
|
||||
inline int BitBoard::lsb() const {
|
||||
return __builtin_ctzll(mBoard);
|
||||
|
@@ -133,10 +133,8 @@ void Board::handlePawnDoubleAdvance(const Move &move, BitBoard bb, const Piece &
|
||||
auto fromR = move.from().rank();
|
||||
auto toR = move.to().rank();
|
||||
if (abs(static_cast<int>(fromR) - static_cast<int>(toR)) == 2) {
|
||||
if (mPieceBBs[toIndex(PieceType::Pawn)]
|
||||
& (bb.left(1) | bb.right(1))
|
||||
& BitBoard::getRank(static_cast<int>(toR))) {
|
||||
|
||||
if (mPieceBBs[toIndex(PieceType::Pawn)] & mPieceBBs[toIndex(!mTurn)] // Get all other color pawns
|
||||
& (bb.west() | bb.east())) { // is pawn left or right?
|
||||
mEPS = Square::fromCoordinates(move.to().file(), std::max(fromR, toR) - 1);
|
||||
return;
|
||||
}
|
||||
@@ -151,8 +149,7 @@ void Board::pseudoLegalMoves(MoveVec &moves) const {
|
||||
(void) moves;
|
||||
}
|
||||
|
||||
void Board::pseudoLegalMovesFrom(const Square &from,
|
||||
Board::MoveVec &moves) const {
|
||||
void Board::pseudoLegalMovesFrom(const Square &from, Board::MoveVec &moves) const {
|
||||
(void) from;
|
||||
(void) moves;
|
||||
}
|
||||
|
Reference in New Issue
Block a user