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