X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fposition.h;h=431d059c7efb2570305b752807dc10ac60c2266e;hb=3d8140a54101a50860ba2e3eb0f2d6cce68bfe47;hp=0cc6a0ca7a91fdbc4658bbade5eb763233f13007;hpb=f25582d4b8860ff9fbe7dcf9873ed2986b1a7ed2;p=stockfish diff --git a/src/position.h b/src/position.h index 0cc6a0ca..431d059c 100644 --- a/src/position.h +++ b/src/position.h @@ -26,11 +26,6 @@ #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. @@ -58,9 +53,9 @@ struct StateInfo { Score value; Value npMaterial[2]; - PieceType capturedType; Key key; Bitboard checkersBB; + PieceType capturedType; StateInfo* previous; }; @@ -89,8 +84,10 @@ struct StateInfo { class Position { - Position(); // No default or copy c'tor allowed - Position(const Position& pos); + // 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); @@ -132,8 +129,8 @@ public: 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; @@ -166,7 +163,7 @@ public: bool pawn_is_passed(Color c, Square s) const; // Doing and undoing moves - void do_setup_move(Move m); + void do_setup_move(Move m, StateInfo& st); void do_move(Move m, StateInfo& st); void do_move(Move m, StateInfo& st, const CheckInfo& ci, bool moveIsCheck); void undo_move(Move m); @@ -193,7 +190,7 @@ public: template bool is_draw() const; // Number of plies from starting position - int full_moves() const; + int startpos_ply_counter() const; // Other properties of the position bool opposite_colored_bishops() const; @@ -217,11 +214,10 @@ private: // 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); - bool move_is_pl_slow(const Move m) const; + 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); @@ -229,7 +225,7 @@ private: void undo_castle_move(Move m); template - Bitboard hidden_checkers(Color c) const; + Bitboard hidden_checkers() const; // Computing hash keys from scratch (for initialization and debugging) Key compute_key() const; @@ -256,16 +252,15 @@ private: int index[64]; // [square] // Other info - Color sideToMove; - Key history[MaxGameLength]; int castleRightsMask[64]; // [square] Square castleRookSquare[16]; // [castleRight] StateInfo startState; - bool chess960; + int64_t nodes; + Color sideToMove; int fullMoves; int threadID; - int64_t nodes; StateInfo* st; + int chess960; // Static variables static Score pieceSquareTable[16][64]; // [piece][square] @@ -428,8 +423,8 @@ inline bool Position::move_is_passed_pawn_push(Move m) const { && pawn_is_passed(c, move_to(m)); } -inline int Position::full_moves() const { - return fullMoves; +inline int Position::startpos_ply_counter() const { + return Max(2 * (fullMoves - 1), 0) + int(sideToMove == BLACK); } inline bool Position::opposite_colored_bishops() const { @@ -449,15 +444,14 @@ inline bool Position::is_chess960() const { inline bool Position::move_is_capture_or_promotion(Move m) const { - assert(m != MOVE_NONE && m != MOVE_NULL); + assert(move_is_ok(m)); return move_is_special(m) ? !move_is_castle(m) : !square_is_empty(move_to(m)); } inline bool Position::move_is_capture(Move m) const { - assert(m != MOVE_NONE && m != MOVE_NULL); - // 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); }