#ifndef CHESS_ENGINE_BOARD_HPP #define CHESS_ENGINE_BOARD_HPP #include "Piece.hpp" #include "Square.hpp" #include "Move.hpp" #include "CastlingRights.hpp" #include #include #include #define BB_NUM 12 // 6 pieces, 2 colors class Board { public: using Optional = std::optional; using MoveVec = std::vector; using BitBoard = uint64_t; Board(); void setPiece(const Square &square, const Piece::Optional &piece); Piece::Optional piece(const Square &square) const; void setTurn(PieceColor turn); PieceColor turn() const; void setCastlingRights(CastlingRights cr); CastlingRights castlingRights() const; void setEnPassantSquare(const Square::Optional &square); Square::Optional enPassantSquare() const; void makeMove(const Move &move); void pseudoLegalMoves(MoveVec &moves) const; void pseudoLegalMovesFrom(const Square &from, MoveVec &moves) const; private: BitBoard mPieceBBs[BB_NUM] = {}; static inline void clearIndex(BitBoard &b, unsigned int i) { b &= ~(1ULL << i); } static inline void setIndex(BitBoard &b, unsigned int i) { b |= 1ULL << i; } static inline BitBoard indexToBitBoard(unsigned int i) { return (1ULL << i); } static inline PieceColor indexToColor(unsigned int i) { return static_cast(i % 2); } static inline PieceType indexToType(unsigned int i) { return static_cast(i - (i % 2)); } }; std::ostream &operator<<(std::ostream &os, const Board &board); #endif