template<PieceType Pt> int count() const;
template<PieceType Pt> const Square* squares(Color c) const;
template<PieceType Pt> Square square(Color c) const;
+ int semiopen_file(Color c, File f) const;
// Castling
int castling_rights(Color c) const;
// Piece specific
bool pawn_passed(Color c, Square s) const;
bool opposite_bishops() const;
+ int pawns_on_same_color_squares(Color c, Square s) const;
// Doing and undoing moves
void do_move(Move m, StateInfo& newSt);
return st->epSquare;
}
+inline int Position::semiopen_file(Color c, File f) const {
+ return !(pieces(c, PAWN) & file_bb(f));
+}
+
inline bool Position::can_castle(CastlingRight cr) const {
return st->castlingRights & cr;
}
&& relative_rank(sideToMove, from_sq(m)) > RANK_4;
}
+inline int Position::pawns_on_same_color_squares(Color c, Square s) const {
+ return popcount(pieces(c, PAWN) & ((DarkSquares & s) ? DarkSquares : ~DarkSquares));
+}
+
inline Key Position::key() const {
return st->key;
}
// index[from] is not updated and becomes stale. This works as long as index[]
// is accessed just by known occupied squares.
- Bitboard fromTo = SquareBB[from] ^ SquareBB[to];
+ Bitboard fromTo = square_bb(from) | square_bb(to);
byTypeBB[ALL_PIECES] ^= fromTo;
byTypeBB[type_of(pc)] ^= fromTo;
byColorBB[color_of(pc)] ^= fromTo;