/* Getters */
[[nodiscard]] inline constexpr U64 get_hash() const;
[[nodiscard]] inline constexpr color::Color get_side() const;
[[nodiscard]] inline constexpr Color get_side() const;
[[nodiscard]] inline constexpr uint8_t get_castle() const;
[[nodiscard]] inline constexpr square::Square get_enpassant() const;
[[nodiscard]] inline constexpr Square get_enpassant() const;
[[nodiscard]] inline constexpr U64 get_bitboard_color(color::Color side) const;
[[nodiscard]] inline constexpr U64 get_bitboard_color(Color side) const;
[[nodiscard]] inline constexpr U64 get_bitboard_occupancy() const;
[[nodiscard]] inline constexpr U64 get_bitboard_piece(piece::Type piece) const;
[[nodiscard]] inline constexpr U64 get_bitboard_piece(piece::Type piece, color::Color color) const;
[[nodiscard]] inline constexpr U64 get_bitboard_piece(piece::Type piece, Color color) const;
[[nodiscard]] inline constexpr U64 get_bitboard_piece_attacks(piece::Type piece, color::Color color,
square::Square from) const;
[[nodiscard]] inline constexpr U64 get_bitboard_piece_moves(piece::Type piece, color::Color color,
square::Square from) const;
[[nodiscard]] inline constexpr U64 get_bitboard_square_land(square::Square land, piece::Type piece,
color::Color side) const;
[[nodiscard]] inline constexpr U64 get_bitboard_piece_attacks(piece::Type piece, Color color,
Square from) const;
[[nodiscard]] inline constexpr U64 get_bitboard_piece_moves(piece::Type piece, Color color,
Square from) const;
[[nodiscard]] inline constexpr U64 get_bitboard_square_land(Square land, piece::Type piece,
Color side) const;
[[nodiscard]] inline constexpr color::Color get_square_piece_color(square::Square square) const;
[[nodiscard]] inline constexpr piece::Type get_square_piece_type(square::Square square) const;
[[nodiscard]] inline constexpr const piece::Piece *get_square_piece(square::Square square) const;
[[nodiscard]] inline constexpr Color get_square_piece_color(Square square) const;
[[nodiscard]] inline constexpr piece::Type get_square_piece_type(Square square) const;
[[nodiscard]] inline constexpr const piece::Piece *get_square_piece(Square square) const;
/* Setters */
inline constexpr void xor_hash(U64 op);
inline constexpr void switch_side();
inline constexpr void and_castle(uint8_t right);
inline constexpr void set_enpassant(square::Square target);
inline constexpr void set_enpassant(Square target);
inline constexpr void pop_bitboard_color(color::Color color, square::Square square);
inline constexpr void set_bitboard_color(color::Color color, square::Square square);
inline constexpr void pop_bitboard_color(Color color, Square square);
inline constexpr void set_bitboard_color(Color color, Square square);
inline constexpr void pop_bitboard_piece(piece::Type type, square::Square square);
inline constexpr void set_bitboard_piece(piece::Type type, square::Square square);
inline constexpr void pop_bitboard_piece(piece::Type type, Square square);
inline constexpr void set_bitboard_piece(piece::Type type, Square square);
inline constexpr void pop_piece(piece::Type type, color::Color side, square::Square square);
inline constexpr void set_piece(piece::Type type, color::Color side, square::Square square);
inline constexpr void pop_piece(piece::Type type, Color side, Square square);
inline constexpr void set_piece(piece::Type type, Color side, Square square);
/* Queries */
[[nodiscard]] inline constexpr bool is_square_attacked(square::Square square, color::Color side) const;
[[nodiscard]] inline constexpr bool is_square_occupied(square::Square square) const;
[[nodiscard]] inline constexpr bool is_piece_attack_square(piece::Type type, color::Color color,
square::Square source,
square::Square target) const;
[[nodiscard]] inline constexpr bool is_square_attacked(Square square, Color side) const;
[[nodiscard]] inline constexpr bool is_square_occupied(Square square) const;
[[nodiscard]] inline constexpr bool is_piece_attack_square(piece::Type type, Color color, Square source,
Square target) const;
[[nodiscard]] inline constexpr bool is_check() const;
private:
U64 colors[2] = {0};
U64 pieces[6] = {0};
U64 hash = 0;
color::Color side = color::WHITE;
square::Square enpassant = square::Square::no_sq;
Color side = WHITE;
Square enpassant = Square::no_sq;
uint8_t castle = 0;
};
constexpr color::Color Board::get_side() const { return side; }
constexpr Color Board::get_side() const { return side; }
constexpr U64 Board::get_hash() const { return hash; }
constexpr uint8_t Board::get_castle() const { return castle; }
constexpr square::Square Board::get_enpassant() const { return enpassant; }
constexpr Square Board::get_enpassant() const { return enpassant; }
constexpr U64 Board::get_bitboard_color(color::Color side) const { return colors[side]; }
constexpr U64 Board::get_bitboard_occupancy() const { return colors[color::WHITE] | colors[color::BLACK]; }
constexpr U64 Board::get_bitboard_color(Color side) const { return colors[side]; }
constexpr U64 Board::get_bitboard_occupancy() const { return colors[WHITE] | colors[BLACK]; }
constexpr U64 Board::get_bitboard_piece(piece::Type piece) const { return pieces[piece]; }
constexpr U64 Board::get_bitboard_piece(piece::Type piece, color::Color color) const {
constexpr U64 Board::get_bitboard_piece(piece::Type piece, Color color) const {
return pieces[piece] & colors[color];
}
constexpr U64 Board::get_bitboard_piece_attacks(piece::Type type, color::Color color,
square::Square from) const {
constexpr U64 Board::get_bitboard_piece_attacks(piece::Type type, Color color, Square from) const {
if (type == piece::PAWN) return attack::attack_pawn(color, from);
return attack::attack(type, from, get_bitboard_occupancy());
}
constexpr U64 Board::get_bitboard_piece_moves(piece::Type type, color::Color color,
square::Square square) const {
constexpr U64 Board::get_bitboard_piece_moves(piece::Type type, Color color, Square square) const {
return get_bitboard_piece_attacks(type, color, square) & ~get_bitboard_color(color);
}
constexpr U64 Board::get_bitboard_square_land(square::Square land, piece::Type piece,
color::Color side) const {
constexpr U64 Board::get_bitboard_square_land(Square land, piece::Type piece, Color side) const {
return get_bitboard_piece_attacks(piece, color::other(side), land) & get_bitboard_piece(piece, side);
return get_bitboard_piece_attacks(piece, other(side), land) & get_bitboard_piece(piece, side);
}
constexpr color::Color Board::get_square_piece_color(square::Square square) const {
if (bit::get(colors[color::WHITE], square)) return color::WHITE;
if (bit::get(colors[color::BLACK], square)) return color::BLACK;
constexpr Color Board::get_square_piece_color(Square square) const {
if (bit::get(colors[WHITE], square)) return WHITE;
if (bit::get(colors[BLACK], square)) return BLACK;
throw std::exception();
}
constexpr piece::Type Board::get_square_piece_type(square::Square square) const {
constexpr piece::Type Board::get_square_piece_type(Square square) const {
for (piece::Type type = piece::PAWN; type <= piece::KING; ++type) {
if (bit::get(pieces[type], square)) return type;
}
return piece::Type::NONE;
}
constexpr const piece::Piece *Board::get_square_piece(square::Square square) const {
constexpr const piece::Piece *Board::get_square_piece(Square square) const {
try {
return &piece::get(get_square_piece_type(square), get_square_piece_color(square));
} catch (std::exception &e) {