]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Retire move.cpp
[stockfish] / src / search.cpp
index 9b00b2b7d94ac244e3126909be1ae5fe6340b1b7..88160ef2529df13179ce9cb8839090ec2aa9fa2d 100644 (file)
@@ -161,13 +161,19 @@ namespace {
   // operator<<() that will use it to properly format castling moves.
   enum set960 {};
 
-  std::ostream& operator<< (std::ostream& os, const set960& m) {
+  std::ostream& operator<< (std::ostream& os, const set960& f) {
 
-    os.iword(0) = int(m);
+    os.iword(0) = int(f);
     return os;
   }
 
 
+  // Overload operator << for moves to make it easier to print moves in
+  // coordinate notation compatible with UCI protocol.
+
+  std::ostream& operator<<(std::ostream& os, Move m);
+
+
   /// Adjustments
 
   // Step 6. Razoring
@@ -304,7 +310,7 @@ namespace {
   bool connected_threat(const Position& pos, Move m, Move threat);
   Value refine_eval(const TTEntry* tte, Value defaultEval, int ply);
   void update_history(const Position& pos, Move move, Depth depth, Move movesSearched[], int moveCount);
-  void update_killers(Move m, SearchStack* ss);
+  void update_killers(Move m, Move killers[]);
   void update_gains(const Position& pos, Move move, Value before, Value after);
 
   int current_search_time();
@@ -830,7 +836,7 @@ namespace {
                 if (!pos.move_is_capture_or_promotion(move))
                 {
                     update_history(pos, move, depth, movesSearched, moveCount);
-                    update_killers(move, ss);
+                    update_killers(move, ss->killers);
                 }
 
                 // Inform GUI that PV has changed
@@ -1398,7 +1404,7 @@ split_point_start: // At split points actual search starts from here
             && !pos.move_is_capture_or_promotion(move))
         {
             update_history(pos, move, depth, movesSearched, moveCount);
-            update_killers(move, ss);
+            update_killers(move, ss->killers);
         }
     }
 
@@ -1917,13 +1923,13 @@ split_point_start: // At split points actual search starts from here
   // update_killers() add a good move that produced a beta-cutoff
   // among the killer moves of that ply.
 
-  void update_killers(Move m, SearchStack* ss) {
+  void update_killers(Move m, Move killers[]) {
 
-    if (m == ss->killers[0])
+    if (m == killers[0])
         return;
 
-    ss->killers[1] = ss->killers[0];
-    ss->killers[0] = m;
+    killers[1] = killers[0];
+    killers[0] = m;
   }
 
 
@@ -2711,4 +2717,35 @@ split_point_start: // At split points actual search starts from here
               }
   }
 
+  // Overload operator << to make it easier to print moves in coordinate notation
+  // (g1f3, a7a8q, etc.). The only special case is castling moves, where we
+  // print in the e1g1 notation in normal chess mode, and in e1h1 notation in
+  // Chess960 mode.
+
+  std::ostream& operator<<(std::ostream& os, Move m) {
+
+    Square from = move_from(m);
+    Square to = move_to(m);
+    bool chess960 = (os.iword(0) != 0); // See set960()
+
+    if (m == MOVE_NONE)
+        return os << "(none)";
+
+    if (m == MOVE_NULL)
+        return os << "0000";
+
+    if (move_is_short_castle(m) && !chess960)
+        return os << (from == SQ_E1 ? "e1g1" : "e8g8");
+
+    if (move_is_long_castle(m) && !chess960)
+        return os << (from == SQ_E1 ? "e1c1" : "e8c8");
+
+    os << square_to_string(from) << square_to_string(to);
+
+    if (move_is_promotion(m))
+        os << char(tolower(piece_type_to_char(move_promotion_piece(m))));
+
+    return os;
+  }
+
 } // namespace