]> git.sesse.net Git - stockfish/blobdiff - src/position.cpp
Don't copy Position in pretty_pv()
[stockfish] / src / position.cpp
index 71556a566e49072d37023c5a07b74613e043303f..80dcdd5724afab805dea2e90fe374baa08f90c71 100644 (file)
@@ -36,7 +36,6 @@
 #include "position.h"
 #include "psqtab.h"
 #include "rkiss.h"
-#include "san.h"
 #include "tt.h"
 #include "ucioption.h"
 
@@ -205,6 +204,7 @@ void Position::from_fen(const string& fen, bool c960) {
 */
 
   char token;
+  int hmc, fmn;
   std::istringstream ss(fen);
   Rank rank = RANK_8;
   File file = FILE_A;
@@ -265,12 +265,10 @@ void Position::from_fen(const string& fen, bool c960) {
   }
 
   // 5. Halfmove clock
-  int hmc;
   if (ss >> hmc)
       st->rule50 = hmc;
 
   // 6. Fullmove number
-  int fmn;
   if (ss >> fmn)
       startPosPlyCounter = (fmn - 1) * 2 + int(sideToMove == BLACK);
 
@@ -774,6 +772,29 @@ bool Position::move_is_check(Move m, const CheckInfo& ci) const {
 }
 
 
+/// Position::do_setup_move() makes a permanent move on the board.
+/// It should be used when setting up a position on board.
+/// You can't undo the move.
+
+void Position::do_setup_move(Move m) {
+
+  StateInfo newSt;
+
+  do_move(m, newSt);
+
+  // Reset "game ply" in case we made a non-reversible move.
+  // "game ply" is used for repetition detection.
+  if (st->rule50 == 0)
+      st->gamePly = 0;
+
+  // Update the number of plies played from the starting position
+  startPosPlyCounter++;
+
+  // Our StateInfo newSt is about going out of scope so copy
+  // its content inside pos before it disappears.
+  detach();
+}
+
 /// Position::do_move() makes a move, and saves all information necessary
 /// to a StateInfo object. The move is assumed to be legal.
 /// Pseudo-legal moves should be filtered out before this function is called.
@@ -788,6 +809,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI
 
   assert(is_ok());
   assert(move_is_ok(m));
+  assert(&newSt != st);
 
   nodes++;
   Key key = st->key;
@@ -803,8 +825,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI
     Value npMaterial[2];
   };
 
-  if (&newSt != st)
-      memcpy(&newSt, st, sizeof(ReducedStateInfo));
+  memcpy(&newSt, st, sizeof(ReducedStateInfo));
 
   newSt.previous = st;
   st = &newSt;
@@ -1541,22 +1562,6 @@ void Position::clear() {
 }
 
 
-/// Position::reset_game_ply() simply sets gamePly to 0. It is used from the
-/// UCI interface code, whenever a non-reversible move is made in a
-/// 'position fen <fen> moves m1 m2 ...' command.  This makes it possible
-/// for the program to handle games of arbitrary length, as long as the GUI
-/// handles draws by the 50 move rule correctly.
-
-void Position::reset_game_ply() {
-
-  st->gamePly = 0;
-}
-
-void Position::inc_startpos_ply_counter() {
-
-  startPosPlyCounter++;
-}
-
 /// Position::put_piece() puts a piece on the given square of the board,
 /// updating the board array, pieces list, bitboards, and piece counts.
 
@@ -1691,7 +1696,7 @@ bool Position::is_draw() const {
       return true;
 
   // Draw by the 50 moves rule?
-  if (st->rule50 > 99 && (st->rule50 > 100 || !is_mate()))
+  if (st->rule50 > 99 && !is_mate())
       return true;
 
   // Draw by repetition?
@@ -1709,7 +1714,7 @@ bool Position::is_draw() const {
 bool Position::is_mate() const {
 
   MoveStack moves[MOVES_MAX];
-  return is_check() && generate_moves(*this, moves) == moves;
+  return is_check() && generate<MV_LEGAL>(*this, moves) == moves;
 }
 
 
@@ -1730,8 +1735,8 @@ bool Position::has_mate_threat() {
   do_null_move(st1);
 
   // Then generate pseudo-legal moves that could give check
-  last = generate_non_capture_checks(*this, mlist);
-  last = generate_captures(*this, last);
+  last = generate<MV_NON_CAPTURE_CHECK>(*this, mlist);
+  last = generate<MV_CAPTURE>(*this, last);
 
   // Loop through the moves, and see if one of them gives mate
   Bitboard pinned = pinned_pieces(sideToMove);