X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.h;h=68fc508e16793474d291eeeef98607f6e7b124b9;hp=1070236be818ffbad0e07e214f5aa443ef2c3234;hb=d909d10f33df023be46a2633608bdf655d1f5a62;hpb=d4af15f682c1967450233ab62cba1a6c5d601df6 diff --git a/src/position.h b/src/position.h index 1070236b..68fc508e 100644 --- a/src/position.h +++ b/src/position.h @@ -23,7 +23,10 @@ #include #include // For offsetof() +#include +#include // For std::unique_ptr #include +#include #include "bitboard.h" #include "types.h" @@ -33,24 +36,11 @@ class Thread; namespace PSQT { - extern Score psq[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB]; + extern Score psq[PIECE_NB][SQUARE_NB]; void init(); } -/// CheckInfo struct is initialized at constructor time and keeps info used to -/// detect if a move gives check. - -struct CheckInfo { - - explicit CheckInfo(const Position&); - - Bitboard dcCandidates; - Bitboard pinned; - Bitboard checkSquares[PIECE_TYPE_NB]; - Square ksq; -}; - /// StateInfo struct stores information needed to restore a Position object to /// its previous state when we retract a move. Whenever a move is made on the @@ -71,10 +61,15 @@ struct StateInfo { // Not copied when making a move Key key; Bitboard checkersBB; - PieceType capturedType; + Piece capturedPiece; StateInfo* previous; + Bitboard blockersForKing[COLOR_NB]; + Bitboard checkSquares[PIECE_TYPE_NB]; }; +// In a std::deque references to elements are unaffected upon resizing +typedef std::unique_ptr> StateListPtr; + /// Position class stores information regarding the board representation as /// pieces, side to move, hash keys, castling info, etc. Important methods are @@ -86,14 +81,12 @@ class Position { public: static void init(); - Position() = default; // To define the global object RootPos + Position() = default; Position(const Position&) = delete; - Position(const Position& pos, Thread* th) { *this = pos; thisThread = th; } - Position(const std::string& f, bool c960, Thread* th) { set(f, c960, th); } - Position& operator=(const Position&); // To assign RootPos from UCI + Position& operator=(const Position&) = delete; // FEN string input/output - void set(const std::string& fenStr, bool isChess960, Thread* th); + Position& set(const std::string& fenStr, bool isChess960, StateInfo* si, Thread* th); const std::string fen() const; // Position representation @@ -120,6 +113,7 @@ public: Bitboard checkers() const; Bitboard discovered_check_candidates() const; Bitboard pinned_pieces(Color c) const; + Bitboard check_squares(PieceType pt) const; // Attacks to/from a given square Bitboard attackers_to(Square s) const; @@ -127,16 +121,17 @@ public: Bitboard attacks_from(Piece pc, Square s) const; template Bitboard attacks_from(Square s) const; template Bitboard attacks_from(Square s, Color c) const; + Bitboard slider_blockers(Bitboard sliders, Square s) const; // Properties of moves - bool legal(Move m, Bitboard pinned) const; + bool legal(Move m) const; bool pseudo_legal(const Move m) const; bool capture(Move m) const; bool capture_or_promotion(Move m) const; - bool gives_check(Move m, const CheckInfo& ci) const; + bool gives_check(Move m) const; bool advanced_pawn_push(Move m) const; Piece moved_piece(Move m) const; - PieceType captured_piece_type() const; + Piece captured_piece() const; // Piece specific bool pawn_passed(Color c, Square s) const; @@ -155,7 +150,6 @@ public: // Accessing hash keys Key key() const; Key key_after(Move m) const; - Key exclusion_key() const; Key material_key() const; Key pawn_key() const; @@ -178,15 +172,14 @@ public: private: // Initialization helpers (used while setting up a position) - void clear(); void set_castling_right(Color c, Square rfrom); void set_state(StateInfo* si) const; + void set_check_info(StateInfo* si) const; // Other helpers - Bitboard check_blockers(Color c, Color kingColor) const; - void put_piece(Color c, PieceType pt, Square s); - void remove_piece(Color c, PieceType pt, Square s); - void move_piece(Color c, PieceType pt, Square from, Square to); + void put_piece(Piece pc, Square s); + void remove_piece(Piece pc, Square s); + void move_piece(Piece pc, Square from, Square to); template void do_castling(Color us, Square from, Square& to, Square& rfrom, Square& rto); @@ -194,13 +187,12 @@ private: Piece board[SQUARE_NB]; Bitboard byTypeBB[PIECE_TYPE_NB]; Bitboard byColorBB[COLOR_NB]; - int pieceCount[COLOR_NB][PIECE_TYPE_NB]; - Square pieceList[COLOR_NB][PIECE_TYPE_NB][16]; + int pieceCount[PIECE_NB]; + Square pieceList[PIECE_NB][16]; int index[SQUARE_NB]; int castlingRightsMask[SQUARE_NB]; Square castlingRookSquare[CASTLING_RIGHT_NB]; Bitboard castlingPath[CASTLING_RIGHT_NB]; - StateInfo startState; uint64_t nodes; int gamePly; Color sideToMove; @@ -252,16 +244,16 @@ inline Bitboard Position::pieces(Color c, PieceType pt1, PieceType pt2) const { } template inline int Position::count(Color c) const { - return pieceCount[c][Pt]; + return pieceCount[make_piece(c, Pt)]; } template inline const Square* Position::squares(Color c) const { - return pieceList[c][Pt]; + return pieceList[make_piece(c, Pt)]; } template inline Square Position::square(Color c) const { - assert(pieceCount[c][Pt] == 1); - return pieceList[c][Pt][0]; + assert(pieceCount[make_piece(c, Pt)] == 1); + return pieceList[make_piece(c, Pt)][0]; } inline Square Position::ep_square() const { @@ -309,11 +301,15 @@ inline Bitboard Position::checkers() const { } inline Bitboard Position::discovered_check_candidates() const { - return check_blockers(sideToMove, ~sideToMove); + return st->blockersForKing[~sideToMove] & pieces(sideToMove); } inline Bitboard Position::pinned_pieces(Color c) const { - return check_blockers(c, c); + return st->blockersForKing[c] & pieces(c); +} + +inline Bitboard Position::check_squares(PieceType pt) const { + return st->checkSquares[pt]; } inline bool Position::pawn_passed(Color c, Square s) const { @@ -362,8 +358,8 @@ inline void Position::set_nodes_searched(uint64_t n) { } inline bool Position::opposite_bishops() const { - return pieceCount[WHITE][BISHOP] == 1 - && pieceCount[BLACK][BISHOP] == 1 + return pieceCount[W_BISHOP] == 1 + && pieceCount[B_BISHOP] == 1 && opposite_colors(square(WHITE), square(BLACK)); } @@ -384,54 +380,54 @@ inline bool Position::capture(Move m) const { return (!empty(to_sq(m)) && type_of(m) != CASTLING) || type_of(m) == ENPASSANT; } -inline PieceType Position::captured_piece_type() const { - return st->capturedType; +inline Piece Position::captured_piece() const { + return st->capturedPiece; } inline Thread* Position::this_thread() const { return thisThread; } -inline void Position::put_piece(Color c, PieceType pt, Square s) { +inline void Position::put_piece(Piece pc, Square s) { - board[s] = make_piece(c, pt); + board[s] = pc; byTypeBB[ALL_PIECES] |= s; - byTypeBB[pt] |= s; - byColorBB[c] |= s; - index[s] = pieceCount[c][pt]++; - pieceList[c][pt][index[s]] = s; - pieceCount[c][ALL_PIECES]++; + byTypeBB[type_of(pc)] |= s; + byColorBB[color_of(pc)] |= s; + index[s] = pieceCount[pc]++; + pieceList[pc][index[s]] = s; + pieceCount[make_piece(color_of(pc), ALL_PIECES)]++; } -inline void Position::remove_piece(Color c, PieceType pt, Square s) { +inline void Position::remove_piece(Piece pc, Square s) { // WARNING: This is not a reversible operation. If we remove a piece in // do_move() and then replace it in undo_move() we will put it at the end of // the list and not in its original place, it means index[] and pieceList[] // are not guaranteed to be invariant to a do_move() + undo_move() sequence. byTypeBB[ALL_PIECES] ^= s; - byTypeBB[pt] ^= s; - byColorBB[c] ^= s; + byTypeBB[type_of(pc)] ^= s; + byColorBB[color_of(pc)] ^= s; /* board[s] = NO_PIECE; Not needed, overwritten by the capturing one */ - Square lastSquare = pieceList[c][pt][--pieceCount[c][pt]]; + Square lastSquare = pieceList[pc][--pieceCount[pc]]; index[lastSquare] = index[s]; - pieceList[c][pt][index[lastSquare]] = lastSquare; - pieceList[c][pt][pieceCount[c][pt]] = SQ_NONE; - pieceCount[c][ALL_PIECES]--; + pieceList[pc][index[lastSquare]] = lastSquare; + pieceList[pc][pieceCount[pc]] = SQ_NONE; + pieceCount[make_piece(color_of(pc), ALL_PIECES)]--; } -inline void Position::move_piece(Color c, PieceType pt, Square from, Square to) { +inline void Position::move_piece(Piece pc, Square from, Square to) { // index[from] is not updated and becomes stale. This works as long as index[] // is accessed just by known occupied squares. Bitboard from_to_bb = SquareBB[from] ^ SquareBB[to]; byTypeBB[ALL_PIECES] ^= from_to_bb; - byTypeBB[pt] ^= from_to_bb; - byColorBB[c] ^= from_to_bb; + byTypeBB[type_of(pc)] ^= from_to_bb; + byColorBB[color_of(pc)] ^= from_to_bb; board[from] = NO_PIECE; - board[to] = make_piece(c, pt); + board[to] = pc; index[to] = index[from]; - pieceList[c][pt][index[to]] = to; + pieceList[pc][index[to]] = to; } #endif // #ifndef POSITION_H_INCLUDED