X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fposition.h;h=bf387dc6f1d848e84fff0eac5994c9b9c7adcff6;hb=f45eee318bbe0fe1465bda80bf62bc8b3bc7d07c;hp=5a4c594df8e3d7055f196ed430cd1fd1f9320aeb;hpb=378bcfe7602593b28ceee5feabbe77b20266a195;p=stockfish
diff --git a/src/position.h b/src/position.h
index 5a4c594d..bf387dc6 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
@@ -188,12 +188,14 @@ public:
private:
// Initialization helpers (used while setting up a position)
void clear();
- void put_piece(Piece p, Square s);
void set_castle_right(Color c, Square rfrom);
// Helper functions
void do_castle(Square kfrom, Square kto, Square rfrom, Square rto);
Bitboard hidden_checkers(Square ksq, Color c) const;
+ void put_piece(Square s, Color c, PieceType pt);
+ void remove_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;
@@ -414,4 +416,44 @@ inline Thread* Position::this_thread() const {
return thisThread;
}
-#endif // !defined(POSITION_H_INCLUDED)
+inline void Position::put_piece(Square s, Color c, PieceType pt) {
+
+ board[s] = make_piece(c, pt);
+ byTypeBB[ALL_PIECES] |= s;
+ byTypeBB[pt] |= s;
+ byColorBB[c] |= s;
+ 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.
+ Bitboard from_to_bb = SquareBB[from] ^ SquareBB[to];
+ byTypeBB[ALL_PIECES] ^= from_to_bb;
+ byTypeBB[pt] ^= from_to_bb;
+ byColorBB[c] ^= from_to_bb;
+ board[from] = NO_PIECE;
+ board[to] = make_piece(c, pt);
+ 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.
+ byTypeBB[ALL_PIECES] ^= s;
+ byTypeBB[pt] ^= s;
+ byColorBB[c] ^= s;
+ /* board[s] = NO_PIECE; */ // Not needed, will be overwritten by capturing
+ 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