Bitboard dcCandidates;
Bitboard pinned;
Bitboard checkSq[8];
+ Square ksq;
};
// The piece on a given square
Piece piece_on(Square s) const;
+ Piece piece_moved(Move m) const;
bool square_is_empty(Square s) const;
// Side to move
Value non_pawn_material(Color c) const;
Score pst_delta(Piece piece, Square from, Square to) const;
- // Game termination checks
- bool is_mate() const;
+ // Other properties of the position
template<bool SkipRepetition> bool is_draw() const;
-
- // Plies from start position to the beginning of search
int startpos_ply_counter() const;
-
- // Other properties of the position
bool opposite_colored_bishops() const;
bool has_pawn_on_7th(Color c) const;
bool is_chess960() const;
// Initialization helper functions (used while setting up a position)
void clear();
void put_piece(Piece p, Square s);
- void set_castle_right(Square ksq, Square rsq);
+ void set_castle_right(Color c, Square rsq);
bool move_is_legal(const Move m) const;
// Helper template functions
return board[s];
}
+inline Piece Position::piece_moved(Move m) const {
+ return board[from_sq(m)];
+}
+
inline bool Position::square_is_empty(Square s) const {
return board[s] == NO_PIECE;
}
return castleRookSquare[f];
}
-template<>
-inline Bitboard Position::attacks_from<PAWN>(Square s, Color c) const {
- return StepAttacksBB[make_piece(c, PAWN)][s];
-}
-
-template<PieceType Piece> // Knight and King and white pawns
+template<PieceType Pt>
inline Bitboard Position::attacks_from(Square s) const {
- return StepAttacksBB[Piece][s];
+ return Pt == BISHOP ? bishop_attacks_bb(s, occupied_squares())
+ : Pt == ROOK ? rook_attacks_bb(s, occupied_squares())
+ : Pt == QUEEN ? attacks_from<ROOK>(s) | attacks_from<BISHOP>(s)
+ : StepAttacksBB[Pt][s];
}
template<>
-inline Bitboard Position::attacks_from<BISHOP>(Square s) const {
- return bishop_attacks_bb(s, occupied_squares());
-}
-
-template<>
-inline Bitboard Position::attacks_from<ROOK>(Square s) const {
- return rook_attacks_bb(s, occupied_squares());
-}
-
-template<>
-inline Bitboard Position::attacks_from<QUEEN>(Square s) const {
- return attacks_from<ROOK>(s) | attacks_from<BISHOP>(s);
+inline Bitboard Position::attacks_from<PAWN>(Square s, Color c) const {
+ return StepAttacksBB[make_piece(c, PAWN)][s];
}
inline Bitboard Position::attacks_from(Piece p, Square s) const {
}
inline bool Position::pawn_is_passed(Color c, Square s) const {
- return !(pieces(PAWN, flip(c)) & passed_pawn_mask(c, s));
+ return !(pieces(PAWN, ~c) & passed_pawn_mask(c, s));
}
inline Key Position::key() const {
inline bool Position::is_passed_pawn_push(Move m) const {
- return board[move_from(m)] == make_piece(sideToMove, PAWN)
- && pawn_is_passed(sideToMove, move_to(m));
+ return board[from_sq(m)] == make_piece(sideToMove, PAWN)
+ && pawn_is_passed(sideToMove, to_sq(m));
}
inline int Position::startpos_ply_counter() const {
inline bool Position::is_capture_or_promotion(Move m) const {
assert(is_ok(m));
- return is_special(m) ? !is_castle(m) : !square_is_empty(move_to(m));
+ return is_special(m) ? !is_castle(m) : !square_is_empty(to_sq(m));
}
inline bool Position::is_capture(Move m) const {
// Note that castle is coded as "king captures the rook"
assert(is_ok(m));
- return (!square_is_empty(move_to(m)) && !is_castle(m)) || is_enpassant(m);
+ return (!square_is_empty(to_sq(m)) && !is_castle(m)) || is_enpassant(m);
}
inline PieceType Position::captured_piece_type() const {