]> git.sesse.net Git - stockfish/blobdiff - src/position.h
Fix a race when extracting PV from TT
[stockfish] / src / position.h
index bcbfc850d0c8b15eb4677f63b447996fde6fdeca..e471baea099029c5b7d72dbb9d472a9d780b462a 100644 (file)
@@ -189,6 +189,7 @@ public:
   template<bool SkipRepetition> bool is_draw() const;
   int startpos_ply_counter() const;
   bool opposite_colored_bishops() const;
+  bool both_color_bishops(Color c) const;
   bool has_pawn_on_7th(Color c) const;
   bool is_chess960() const;
 
@@ -344,10 +345,9 @@ inline Square Position::castle_rook_square(CastleRight f) const {
 
 template<PieceType Pt>
 inline Bitboard Position::attacks_from(Square s) const {
-  return  Pt == BISHOP ? bishop_attacks_bb(s, occupied_squares())
-        : Pt == ROOK   ? rook_attacks_bb(s, occupied_squares())
+  return  Pt == BISHOP || Pt == ROOK ? attacks_bb<Pt>(s, occupied_squares())
         : Pt == QUEEN  ? attacks_from<ROOK>(s) | attacks_from<BISHOP>(s)
-                       : StepAttacksBB[Pt][s];
+        : StepAttacksBB[Pt][s];
 }
 
 template<>
@@ -432,6 +432,12 @@ inline bool Position::opposite_colored_bishops() const {
         && opposite_colors(pieceList[WHITE][BISHOP][0], pieceList[BLACK][BISHOP][0]);
 }
 
+inline bool Position::both_color_bishops(Color c) const {
+  // Assumes that there are only two bishops
+  return  pieceCount[c][BISHOP] >= 2 &&
+          opposite_colors(pieceList[c][BISHOP][0], pieceList[c][BISHOP][1]);
+}
+
 inline bool Position::has_pawn_on_7th(Color c) const {
   return pieces(PAWN, c) & rank_bb(relative_rank(c, RANK_7));
 }