13 static constexpr auto table = []()
constexpr {
14 std::array<std::array<Bitboard, Square::NB>, Color::NB> t{};
15 for (
auto square : Square::all()) {
16 t[Color::WHITE][square] =
17 Bitboard::destinationBB(square, Direction::NW) | Bitboard::destinationBB(square, Direction::NE);
18 t[Color::BLACK][square] =
19 Bitboard::destinationBB(square, Direction::SW) | Bitboard::destinationBB(square, Direction::SE);
23 return table[color][square];
27 static constexpr auto table = []()
constexpr {
28 std::array<Bitboard, Square::NB> t{};
30 constexpr std::array<Direction, 8> knightDirections = {Direction::NNE, Direction::NNW, Direction::ENE,
31 Direction::WNW, Direction::SSE, Direction::SSW,
32 Direction::ESE, Direction::WSW};
34 for (
auto square : Square::all()) {
36 for (
auto direction : knightDirections) {
37 attacks |= Bitboard::destinationBB(square, direction);
47 static constexpr auto table = []()
constexpr {
48 std::array<Bitboard, Square::NB> t{};
50 constexpr std::array<Direction, 8> kingDirections = {Direction::E, Direction::N, Direction::W,
51 Direction::S, Direction::NE, Direction::NW,
52 Direction::SE, Direction::SW};
54 for (
auto square : Square::all()) {
56 for (
auto direction : kingDirections) {
57 attacks |= Bitboard::destinationBB(square, direction);
66 template <u
int8_t PIECETYPE>
68 if constexpr (PIECETYPE == PieceType::KNIGHT) {
69 return knightAttacksBB(square);
70 }
else if constexpr (PIECETYPE == PieceType::BISHOP) {
71 return bishopAttacksBB(square, occupied);
72 }
else if constexpr (PIECETYPE == PieceType::ROOK) {
73 return rookAttacksBB(square, occupied);
74 }
else if constexpr (PIECETYPE == PieceType::QUEEN) {
75 return queenAttacksBB(square, occupied);
76 }
else if constexpr (PIECETYPE == PieceType::KING) {
77 return kingAttacksBB(square);
79 static_assert(PIECETYPE != PieceType::PAWN,
"Use pawnAttacksBB with color parameter for pawn attacks");
80 return Bitboard::zero();
84 template <u
int8_t PIECETYPE>
86 if constexpr (PIECETYPE == PieceType::PAWN) {
87 return pawnAttacksBB(color, square);
89 return attacksBB<PIECETYPE>(square, occupied);
93 static constexpr Bitboard rookAttacks(
Square square,
Bitboard occupied) {
return rookAttacksBB(square, occupied); }
96 return bishopAttacksBB(square, occupied);
100 return queenAttacksBB(square, occupied);
103 static constexpr Bitboard knightAttacks(
Square square) {
return knightAttacksBB(square); }
105 static constexpr Bitboard kingAttacks(
Square square) {
return kingAttacksBB(square); }
107 static constexpr Bitboard pawnAttacks(
Color color,
Square square) {
return pawnAttacksBB(color, square); }
109 template <u
int8_t PIECETYPE>
110 static constexpr bool isAttackedBy(
Square target,
Square attacker,
Bitboard occupied = Bitboard::zero()) {
111 return (attacksBB<PIECETYPE>(attacker, occupied) & Bitboard::squareBB(target)) != Bitboard::zero();
114 template <u
int8_t PIECETYPE>
116 Bitboard occupied = Bitboard::zero()) {
117 if constexpr (PIECETYPE == PieceType::PAWN) {
118 return (pawnAttacksBB(color, attacker) & Bitboard::squareBB(target)) != Bitboard::zero();
120 return isAttackedBy<PIECETYPE>(target, attacker, occupied);