#include "move.h"
#include "types.h"
-/// Maximum number of plies per game (220 should be enough, because the
-/// maximum search depth is 100, and during position setup we reset the
-/// move counter for every non-reversible move).
-const int MaxGameLength = 220;
-
/// The checkInfo struct is initialized at c'tor time and keeps info used
/// to detect if a move gives check.
struct StateInfo {
Key pawnKey, materialKey;
- int castleRights, rule50, gamePly, pliesFromNull;
- Square epSquare;
- Score value;
Value npMaterial[2];
+ int castleRights, rule50, pliesFromNull;
+ Score value;
+ Square epSquare;
Key key;
Bitboard checkersBB;
class Position {
- // No default or copy c'tor allowed, default c'tor will not be generated
- // anyhow because of user-defined c'tors.
+ // No defaul, copy c'tor or assignment allowed, default c'tor will not be
+ // generated anyhow because of user-defined c'tors.
Position(const Position&);
+ Position& operator=(const Position&);
public:
Position(const Position& pos, int threadID);
Square castle_rook_square(CastleRight f) const;
// Bitboards for pinned pieces and discovered check candidates
- Bitboard discovered_check_candidates(Color c) const;
- Bitboard pinned_pieces(Color c) const;
+ Bitboard discovered_check_candidates() const;
+ Bitboard pinned_pieces() const;
// Checking pieces and under check information
Bitboard checkers() const;
template<PieceType> Bitboard attacks_from(Square s, Color c) const;
// Properties of moves
- bool pl_move_is_legal(Move m, Bitboard pinned) const;
- bool move_is_pl(const Move m) const;
bool move_gives_check(Move m, const CheckInfo& ci) const;
- bool move_is_capture(Move m) const;
- bool move_is_capture_or_promotion(Move m) const;
- bool move_is_passed_pawn_push(Move m) const;
bool move_attacks_square(Move m, Square s) const;
+ bool pl_move_is_legal(Move m, Bitboard pinned) const;
+ bool is_pseudo_legal(const Move m) const;
+ bool is_capture(Move m) const;
+ bool is_capture_or_promotion(Move m) const;
+ bool is_passed_pawn_push(Move m) const;
// Piece captured with previous moves
PieceType captured_piece_type() const;
bool pawn_is_passed(Color c, Square s) const;
// Doing and undoing moves
- void do_setup_move(Move m);
void do_move(Move m, StateInfo& st);
void do_move(Move m, StateInfo& st, const CheckInfo& ci, bool moveIsCheck);
void undo_move(Move m);
bool is_mate() const;
template<bool SkipRepetition> bool is_draw() const;
- // Number of plies from starting position
+ // Plies from start position to the beginning of search
int startpos_ply_counter() const;
// Other properties of the position
// Position consistency check, for debugging
bool is_ok(int* failedStep = NULL) const;
- void flip();
+ void flip_me();
// Global initialization
static void init();
// Initialization helper functions (used while setting up a position)
void clear();
- void detach();
void put_piece(Piece p, Square s);
void set_castle(int f, Square ksq, Square rsq);
void set_castling_rights(char token);
void undo_castle_move(Move m);
template<bool FindPinned>
- Bitboard hidden_checkers(Color c) const;
+ Bitboard hidden_checkers() const;
// Computing hash keys from scratch (for initialization and debugging)
Key compute_key() const;
int index[64]; // [square]
// Other info
- Key history[MaxGameLength];
int castleRightsMask[64]; // [square]
Square castleRookSquare[16]; // [castleRight]
StateInfo startState;
int64_t nodes;
+ int startPosPly;
Color sideToMove;
- int fullMoves;
int threadID;
StateInfo* st;
int chess960;
}
inline bool Position::square_is_empty(Square s) const {
- return piece_on(s) == PIECE_NONE;
+ return board[s] == PIECE_NONE;
}
inline Color Position::side_to_move() const {
}
inline Bitboard Position::empty_squares() const {
- return ~occupied_squares();
+ return ~byTypeBB[0];
}
inline Bitboard Position::pieces(Color c) const {
}
inline bool Position::in_check() const {
- return st->checkersBB != EmptyBoardBB;
+ return st->checkersBB != 0;
}
inline bool Position::pawn_is_passed(Color c, Square s) const {
- return !(pieces(PAWN, opposite_color(c)) & passed_pawn_mask(c, s));
+ return !(pieces(PAWN, flip(c)) & passed_pawn_mask(c, s));
}
inline Key Position::get_key() const {
return st->npMaterial[c];
}
-inline bool Position::move_is_passed_pawn_push(Move m) const {
+inline bool Position::is_passed_pawn_push(Move m) const {
- Color c = side_to_move();
- return piece_on(move_from(m)) == make_piece(c, PAWN)
- && pawn_is_passed(c, move_to(m));
+ return board[move_from(m)] == make_piece(sideToMove, PAWN)
+ && pawn_is_passed(sideToMove, move_to(m));
}
inline int Position::startpos_ply_counter() const {
- return Max(2 * (fullMoves - 1), 0) + int(sideToMove == BLACK);
+ return startPosPly + st->pliesFromNull; // HACK
}
inline bool Position::opposite_colored_bishops() const {
- return piece_count(WHITE, BISHOP) == 1
- && piece_count(BLACK, BISHOP) == 1
- && opposite_color_squares(piece_list(WHITE, BISHOP)[0], piece_list(BLACK, BISHOP)[0]);
+ return pieceCount[WHITE][BISHOP] == 1
+ && pieceCount[BLACK][BISHOP] == 1
+ && opposite_colors(pieceList[WHITE][BISHOP][0], pieceList[BLACK][BISHOP][0]);
}
inline bool Position::has_pawn_on_7th(Color c) const {
return chess960;
}
-inline bool Position::move_is_capture_or_promotion(Move m) const {
+inline bool Position::is_capture_or_promotion(Move m) const {
- assert(move_is_ok(m));
- return move_is_special(m) ? !move_is_castle(m) : !square_is_empty(move_to(m));
+ assert(is_ok(m));
+ return is_special(m) ? !is_castle(m) : !square_is_empty(move_to(m));
}
-inline bool Position::move_is_capture(Move m) const {
+inline bool Position::is_capture(Move m) const {
// Note that castle is coded as "king captures the rook"
- assert(move_is_ok(m));
- return (!square_is_empty(move_to(m)) && !move_is_castle(m)) || move_is_ep(m);
+ assert(is_ok(m));
+ return (!square_is_empty(move_to(m)) && !is_castle(m)) || is_enpassant(m);
}
inline PieceType Position::captured_piece_type() const {