]> git.sesse.net Git - stockfish/blobdiff - src/position.cpp
Simplify Position::is_mate()
[stockfish] / src / position.cpp
index 591d48fbb41b3254bf8cef4c6a63edcebe91c94a..3e72c0e9c88c1185f6eb1a03e44fa60cd2a1a160 100644 (file)
@@ -755,7 +755,7 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) {
     st->capture = type_of_piece_on(to);
 
     if (st->capture)
-      do_capture_move(m, st->capture, them, to);
+      do_capture_move(st->capture, them, to);
 
     // Move the piece
     clear_bit(&(byColorBB[us]), from);
@@ -848,7 +848,7 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) {
 /// Position::do_capture_move() is a private method used to update captured
 /// piece info. It is called from the main Position::do_move function.
 
-void Position::do_capture_move(Move m, PieceType capture, Color them, Square to) {
+void Position::do_capture_move(PieceType capture, Color them, Square to) {
 
     assert(capture != KING);
 
@@ -867,8 +867,6 @@ void Position::do_capture_move(Move m, PieceType capture, Color them, Square to)
     st->mgValue -= pst<MidGame>(them, capture, to);
     st->egValue -= pst<EndGame>(them, capture, to);
 
-    assert(!move_promotion(m) || capture != PAWN);
-
     // Update material
     if (capture != PAWN)
         npMaterial[them] -= piece_value_midgame(capture);
@@ -1010,7 +1008,7 @@ void Position::do_promotion_move(Move m) {
   st->capture = type_of_piece_on(to);
 
   if (st->capture)
-    do_capture_move(m, st->capture, them, to);
+    do_capture_move(st->capture, them, to);
 
   // Remove pawn
   clear_bit(&(byColorBB[us]), from);
@@ -1618,7 +1616,7 @@ int Position::see(Square from, Square to) const {
       // Remove the attacker we just found from the 'attackers' bitboard,
       // and scan for new X-ray attacks behind the attacker.
       b = attackers & pieces_of_color_and_type(c, pt);
-      occ ^= (b & -b);
+      occ ^= (b & (~b + 1));
       attackers |=  (rook_attacks_bb(to, occ) & rooks_and_queens())
                   | (bishop_attacks_bb(to, occ) & bishops_and_queens());
 
@@ -1869,21 +1867,6 @@ Value Position::compute_non_pawn_material(Color c) const {
 }
 
 
-/// Position::is_mate() returns true or false depending on whether the
-/// side to move is checkmated. Note that this function is currently very
-/// slow, and shouldn't be used frequently inside the search.
-
-bool Position::is_mate() const {
-
-  if (is_check())
-  {
-      MovePicker mp = MovePicker(*this, false, MOVE_NONE, EmptySearchStack, Depth(0));
-      return mp.get_next_move() == MOVE_NONE;
-  }
-  return false;
-}
-
-
 /// Position::is_draw() tests whether the position is drawn by material,
 /// repetition, or the 50 moves rule. It does not detect stalemates, this
 /// must be done by the search.
@@ -1908,6 +1891,17 @@ bool Position::is_draw() const {
 }
 
 
+/// Position::is_mate() returns true or false depending on whether the
+/// side to move is checkmated.
+
+bool Position::is_mate() const {
+
+  MoveStack moves[256];
+
+  return is_check() && !generate_evasions(*this, moves, pinned_pieces(sideToMove));
+}
+
+
 /// Position::has_mate_threat() tests whether a given color has a mate in one
 /// from the current position. This function is quite slow, but it doesn't
 /// matter, because it is currently only called from PV nodes, which are rare.