void init();
}
-/// CheckInfo struct is initialized at constructor time and keeps info used to
-/// detect if a move gives check.
-struct CheckInfo {
+/// CheckInfo struct keeps info used to detect if a move gives check
- explicit CheckInfo(const Position&);
+struct CheckInfo {
- Bitboard dcCandidates;
- Bitboard pinned;
+ Bitboard blockersForKing[COLOR_NB];
Bitboard checkSquares[PIECE_TYPE_NB];
Square ksq;
};
Bitboard checkersBB;
PieceType capturedType;
StateInfo* previous;
+ CheckInfo ci;
};
// In a std::deque references to elements are unaffected upon resizing
Bitboard checkers() const;
Bitboard discovered_check_candidates() const;
Bitboard pinned_pieces(Color c) const;
+ const CheckInfo& check_info() const;
// Attacks to/from a given square
Bitboard attackers_to(Square s) const;
Bitboard attacks_from(Piece pc, Square s) const;
template<PieceType> Bitboard attacks_from(Square s) const;
template<PieceType> Bitboard attacks_from(Square s, Color c) const;
- Bitboard slider_blockers(Bitboard target, Bitboard sliders, Square s) const;
+ Bitboard slider_blockers(Bitboard sliders, Square s) const;
// Properties of moves
- bool legal(Move m, Bitboard pinned) const;
+ bool legal(Move m) const;
bool pseudo_legal(const Move m) const;
bool capture(Move m) const;
bool capture_or_promotion(Move m) const;
- bool gives_check(Move m, const CheckInfo& ci) const;
+ bool gives_check(Move m) const;
bool advanced_pawn_push(Move m) const;
Piece moved_piece(Move m) const;
PieceType captured_piece_type() const;
// Initialization helpers (used while setting up a position)
void set_castling_right(Color c, Square rfrom);
void set_state(StateInfo* si) const;
+ void set_check_info(CheckInfo* ci) const;
// Other helpers
void put_piece(Color c, PieceType pt, Square s);
}
inline Bitboard Position::discovered_check_candidates() const {
- return slider_blockers(pieces(sideToMove), pieces(sideToMove), square<KING>(~sideToMove));
+ return st->ci.blockersForKing[~sideToMove] & pieces(sideToMove);
}
inline Bitboard Position::pinned_pieces(Color c) const {
- return slider_blockers(pieces(c), pieces(~c), square<KING>(c));
+ return st->ci.blockersForKing[c] & pieces(c);
+}
+
+inline const CheckInfo& Position::check_info() const {
+ return st->ci;
}
inline bool Position::pawn_passed(Color c, Square s) const {