class Position {
- // No defaul, copy c'tor or assignment allowed, default c'tor will not be
- // generated anyhow because of user-defined c'tors.
+ // No copy c'tor or assignment operator allowed
Position(const Position&);
Position& operator=(const Position&);
public:
- Position(const Position& pos, int threadID);
- Position(const std::string& fen, bool isChess960, int threadID);
+ Position() {}
+ Position(const Position& pos, int th) { copy(pos, th); }
+ Position(const std::string& fen, bool isChess960, int th);
// Text input/output
+ void copy(const Position& pos, int th);
void from_fen(const std::string& fen, bool isChess960);
const std::string to_fen() const;
void print(Move m = MOVE_NONE) const;
void do_move(Move m, StateInfo& st);
void do_move(Move m, StateInfo& st, const CheckInfo& ci, bool moveIsCheck);
void undo_move(Move m);
- void do_null_move(StateInfo& st);
- void undo_null_move();
+ template<bool Do> void do_null_move(StateInfo& st);
// Static exchange evaluation
int see(Move m) const;
void set_castle_right(Square ksq, Square rsq);
bool move_is_legal(const Move m) const;
- // Helper functions for doing and undoing moves
- void do_capture_move(Key& key, PieceType capture, Color them, Square to, bool ep);
+ // Helper template functions
template<bool Do> void do_castle_move(Move m);
-
- template<bool FindPinned>
- Bitboard hidden_checkers() const;
+ template<bool FindPinned> Bitboard hidden_checkers() const;
// Computing hash keys from scratch (for initialization and debugging)
Key compute_key() const;
// Bitboards
Bitboard byTypeBB[8]; // [pieceType]
Bitboard byColorBB[2]; // [color]
+ Bitboard occupied;
// Piece counts
int pieceCount[2][8]; // [color][pieceType]
}
inline Bitboard Position::occupied_squares() const {
- return byTypeBB[0];
+ return occupied;
}
inline Bitboard Position::empty_squares() const {
- return ~byTypeBB[0];
+ return ~occupied;
}
inline Bitboard Position::pieces(Color c) const {
return st->checkersBB != 0;
}
+inline Bitboard Position::discovered_check_candidates() const {
+ return hidden_checkers<false>();
+}
+
+inline Bitboard Position::pinned_pieces() const {
+ return hidden_checkers<true>();
+}
+
inline bool Position::pawn_is_passed(Color c, Square s) const {
return !(pieces(PAWN, flip(c)) & passed_pawn_mask(c, s));
}