#include <cassert>
#include "bitboard.h"
-#include "move.h"
#include "types.h"
/// The checkInfo struct is initialized at c'tor time and keeps info used
/// to detect if a move gives check.
+class Position;
struct CheckInfo {
- explicit CheckInfo(const Position&);
+ explicit CheckInfo(const Position&);
- Bitboard dcCandidates;
- Bitboard pinned;
- Bitboard checkSq[8];
+ Bitboard dcCandidates;
+ Bitboard pinned;
+ Bitboard checkSq[8];
};
/// object to its previous state when we retract a move. Whenever a move
/// is made on the board (by calling Position::do_move), an StateInfo object
/// must be passed as a parameter.
-class Position;
struct StateInfo {
Key pawnKey, materialKey;
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));
}