X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.h;h=1da49c10ca5e7d65264c3d2c12b114d6d4849809;hp=d2343d10cb8507adc2d1732dbb980826edb8efb0;hb=7b4f5c8f72435cf6b9862ecd445aaf4627cc4f59;hpb=cd782c11ec8e765e3a323e422cea19d7d053a07c diff --git a/src/position.h b/src/position.h index d2343d10..1da49c10 100644 --- a/src/position.h +++ b/src/position.h @@ -17,7 +17,7 @@ along with this program. If not, see . */ -#if !defined(POSITION_H_INCLUDED) +#ifndef POSITION_H_INCLUDED #define POSITION_H_INCLUDED #include @@ -193,7 +193,10 @@ private: // Helper functions void do_castle(Square kfrom, Square kto, Square rfrom, Square rto); - template Bitboard hidden_checkers() const; + Bitboard hidden_checkers(Square ksq, Color c) const; + void remove_piece(Square s, Color c, PieceType pt); + void add_piece(Square s, Color c, PieceType pt); + void move_piece(Square from, Square to, Color c, PieceType pt); // Computing hash keys from scratch (for initialization and debugging) Key compute_key() const; @@ -331,11 +334,11 @@ inline Bitboard Position::checkers() const { } inline Bitboard Position::discovered_check_candidates() const { - return hidden_checkers(); + return hidden_checkers(king_square(~sideToMove), sideToMove); } inline Bitboard Position::pinned_pieces() const { - return hidden_checkers(); + return hidden_checkers(king_square(sideToMove), ~sideToMove); } inline bool Position::pawn_is_passed(Color c, Square s) const { @@ -414,4 +417,27 @@ inline Thread* Position::this_thread() const { return thisThread; } -#endif // !defined(POSITION_H_INCLUDED) +inline void Position::add_piece(Square s, Color c, PieceType pt) { + index[s] = pieceCount[c][pt]++; + pieceList[c][pt][index[s]] = s; +} + +inline void Position::move_piece(Square from, Square to, Color c, PieceType pt) { + // index[from] is not updated and becomes stale. This works as long + // as index[] is accessed just by known occupied squares. + index[to] = index[from]; + pieceList[c][pt][index[to]] = to; +} + +inline void Position::remove_piece(Square s, Color c, PieceType pt) { + // 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. + Square lastSquare = pieceList[c][pt][--pieceCount[c][pt]]; + index[lastSquare] = index[s]; + pieceList[c][pt][index[lastSquare]] = lastSquare; + pieceList[c][pt][pieceCount[c][pt]] = SQ_NONE; +} + +#endif // #ifndef POSITION_H_INCLUDED