]> git.sesse.net Git - stockfish/blobdiff - src/position.h
Change Position::pst() signature
[stockfish] / src / position.h
index c0c7e92997186b0055f3ae04fdf8ed7455825604..b30b1ffe4be16870be978dac20900351c3eace1b 100644 (file)
@@ -20,6 +20,8 @@
 #if !defined(POSITION_H_INCLUDED)
 #define POSITION_H_INCLUDED
 
+#include <cassert>
+
 #include "bitboard.h"
 #include "move.h"
 #include "types.h"
@@ -39,13 +41,13 @@ struct CheckInfo {
     explicit CheckInfo(const Position&);
 
     Bitboard dcCandidates;
+    Bitboard pinned;
     Bitboard checkSq[8];
-    Square ksq;
 };
 
 /// Castle rights, encoded as bit fields
 
-enum CastleRights {
+enum CastleRight {
   CASTLES_NONE = 0,
   WHITE_OO     = 1,
   BLACK_OO     = 2,
@@ -123,16 +125,12 @@ public:
   void print(Move m = MOVE_NONE) const;
 
   // Copying
-  void flipped_copy(const Position& pos);
+  void flip();
 
   // The piece on a given square
   Piece piece_on(Square s) const;
-  PieceType type_of_piece_on(Square s) const;
-  Color color_of_piece_on(Square s) const;
   bool square_is_empty(Square s) const;
   bool square_is_occupied(Square s) const;
-  Value midgame_value_of_piece_on(Square s) const;
-  Value endgame_value_of_piece_on(Square s) const;
 
   // Side to move
   Color side_to_move() const;
@@ -156,11 +154,9 @@ public:
   Square king_square(Color c) const;
 
   // Castling rights
-  bool can_castle_kingside(Color c) const;
-  bool can_castle_queenside(Color c) const;
+  bool can_castle(CastleRight f) const;
   bool can_castle(Color c) const;
-  Square initial_kr_square(Color c) const;
-  Square initial_qr_square(Color c) const;
+  Square castle_rook_square(CastleRight f) const;
 
   // Bitboards for pinned pieces and discovered check candidates
   Bitboard discovered_check_candidates(Color c) const;
@@ -168,7 +164,7 @@ public:
 
   // Checking pieces and under check information
   Bitboard checkers() const;
-  bool is_check() const;
+  bool in_check() const;
 
   // Piece lists
   Square piece_list(Color c, PieceType pt, int index) const;
@@ -176,6 +172,7 @@ public:
 
   // Information about attacks to or from a given square
   Bitboard attackers_to(Square s) const;
+  Bitboard attackers_to(Square s, Bitboard occ) const;
   Bitboard attacks_from(Piece p, Square s) const;
   static Bitboard attacks_from(Piece p, Square s, Bitboard occ);
   template<PieceType> Bitboard attacks_from(Square s) const;
@@ -183,9 +180,8 @@ public:
 
   // Properties of moves
   bool pl_move_is_legal(Move m, Bitboard pinned) const;
-  bool pl_move_is_evasion(Move m, Bitboard pinned) const;
-  bool move_is_check(Move m) const;
-  bool move_is_check(Move m, const CheckInfo& ci) 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;
@@ -209,7 +205,6 @@ public:
   void undo_null_move();
 
   // Static exchange evaluation
-  int see(Square from, Square to) const;
   int see(Move m) const;
   int see_sign(Move m) const;
 
@@ -226,10 +221,10 @@ public:
 
   // Game termination checks
   bool is_mate() const;
-  bool is_draw() const;
+  template<bool SkipRepetition> bool is_draw() const;
 
   // Number of plies from starting position
-  int startpos_ply_counter() const;
+  int full_moves() const;
 
   // Other properties of the position
   bool opposite_colored_bishops() const;
@@ -245,9 +240,8 @@ public:
   // Position consistency check, for debugging
   bool is_ok(int* failedStep = NULL) const;
 
-  // Static member functions
-  static void init_zobrist();
-  static void init_piece_square_tables();
+  // Global initialization
+  static void init();
 
 private:
 
@@ -255,9 +249,9 @@ private:
   void clear();
   void detach();
   void put_piece(Piece p, Square s);
-  void do_allow_oo(Color c);
-  void do_allow_ooo(Color c);
-  bool set_castling_rights(char token);
+  void set_castle(int f, Square ksq, Square rsq);
+  void set_castling_rights(char token);
+  bool move_is_pl_slow(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);
@@ -274,7 +268,7 @@ private:
   Key compute_material_key() const;
 
   // Computing incremental evaluation scores and material counts
-  static Score pst(Color c, PieceType pt, Square s);
+  static Score pst(Piece p, Square s);
   Score compute_value() const;
   Value compute_non_pawn_material(Color c) const;
 
@@ -295,10 +289,10 @@ private:
   Color sideToMove;
   Key history[MaxGameLength];
   int castleRightsMask[64];
+  Square castleRookSquare[16]; // [CastleRights]
   StateInfo startState;
-  File initialKFile, initialKRFile, initialQRFile;
   bool chess960;
-  int startPosPlyCounter;
+  int fullMoves;
   int threadID;
   int64_t nodes;
   StateInfo* st;
@@ -310,9 +304,6 @@ private:
   static Key zobSideToMove;
   static Score PieceSquareTable[16][64];
   static Key zobExclusion;
-  static const Value seeValues[8];
-  static const Value PieceValueMidgame[17];
-  static const Value PieceValueEndgame[17];
 };
 
 inline int64_t Position::nodes_searched() const {
@@ -327,14 +318,6 @@ inline Piece Position::piece_on(Square s) const {
   return board[s];
 }
 
-inline Color Position::color_of_piece_on(Square s) const {
-  return color_of_piece(piece_on(s));
-}
-
-inline PieceType Position::type_of_piece_on(Square s) const {
-  return type_of_piece(piece_on(s));
-}
-
 inline bool Position::square_is_empty(Square s) const {
   return piece_on(s) == PIECE_NONE;
 }
@@ -343,14 +326,6 @@ inline bool Position::square_is_occupied(Square s) const {
   return !square_is_empty(s);
 }
 
-inline Value Position::midgame_value_of_piece_on(Square s) const {
-  return PieceValueMidgame[piece_on(s)];
-}
-
-inline Value Position::endgame_value_of_piece_on(Square s) const {
-  return PieceValueEndgame[piece_on(s)];
-}
-
 inline Color Position::side_to_move() const {
   return sideToMove;
 }
@@ -403,24 +378,16 @@ inline Square Position::king_square(Color c) const {
   return pieceList[c][KING][0];
 }
 
-inline bool Position::can_castle_kingside(Color side) const {
-  return st->castleRights & (1+int(side));
-}
-
-inline bool Position::can_castle_queenside(Color side) const {
-  return st->castleRights & (4+4*int(side));
+inline bool Position::can_castle(CastleRight f) const {
+  return st->castleRights & f;
 }
 
-inline bool Position::can_castle(Color side) const {
-  return can_castle_kingside(side) || can_castle_queenside(side);
+inline bool Position::can_castle(Color c) const {
+  return st->castleRights & ((WHITE_OO | WHITE_OOO) << c);
 }
 
-inline Square Position::initial_kr_square(Color c) const {
-  return relative_square(c, make_square(initialKRFile, RANK_1));
-}
-
-inline Square Position::initial_qr_square(Color c) const {
-  return relative_square(c, make_square(initialQRFile, RANK_1));
+inline Square Position::castle_rook_square(CastleRight f) const {
+  return castleRookSquare[f];
 }
 
 template<>
@@ -452,7 +419,7 @@ inline Bitboard Position::checkers() const {
   return st->checkersBB;
 }
 
-inline bool Position::is_check() const {
+inline bool Position::in_check() const {
   return st->checkersBB != EmptyBoardBB;
 }
 
@@ -480,8 +447,8 @@ inline Key Position::get_material_key() const {
   return st->materialKey;
 }
 
-inline Score Position::pst(Color c, PieceType pt, Square s) {
-  return PieceSquareTable[make_piece(c, pt)][s];
+inline Score Position::pst(Piece p, Square s) {
+  return PieceSquareTable[p][s];
 }
 
 inline Score Position::pst_delta(Piece piece, Square from, Square to) {
@@ -503,8 +470,8 @@ inline bool Position::move_is_passed_pawn_push(Move m) const {
         && pawn_is_passed(c, move_to(m));
 }
 
-inline int Position::startpos_ply_counter() const {
-  return startPosPlyCounter;
+inline int Position::full_moves() const {
+  return fullMoves;
 }
 
 inline bool Position::opposite_colored_bishops() const {
@@ -521,16 +488,18 @@ inline bool Position::is_chess960() const {
   return chess960;
 }
 
-inline bool Position::move_is_capture(Move m) const {
+inline bool Position::move_is_capture_or_promotion(Move m) const {
 
-  // Move must not be MOVE_NONE !
-  return (m & (3 << 15)) ? !move_is_castle(m) : !square_is_empty(move_to(m));
+  assert(m != MOVE_NONE && m != MOVE_NULL);
+  return move_is_special(m) ? !move_is_castle(m) : !square_is_empty(move_to(m));
 }
 
-inline bool Position::move_is_capture_or_promotion(Move m) const {
+inline bool Position::move_is_capture(Move m) const {
 
-  // Move must not be MOVE_NONE !
-  return (m & (0x1F << 12)) ? !move_is_castle(m) : !square_is_empty(move_to(m));
+  assert(m != MOVE_NONE && m != MOVE_NULL);
+
+  // Note that castle is coded as "king captures the rook"
+  return (!square_is_empty(move_to(m)) && !move_is_castle(m)) || move_is_ep(m);
 }
 
 inline PieceType Position::captured_piece_type() const {
@@ -541,12 +510,4 @@ inline int Position::thread() const {
   return threadID;
 }
 
-inline void Position::do_allow_oo(Color c) {
-  st->castleRights |= (1 + int(c));
-}
-
-inline void Position::do_allow_ooo(Color c) {
-  st->castleRights |= (4 + 4*int(c));
-}
-
 #endif // !defined(POSITION_H_INCLUDED)