]> git.sesse.net Git - stockfish/blobdiff - src/position.cpp
Remove duplicated enum Phase definition
[stockfish] / src / position.cpp
index bc94fe82acb02b064c4d7b1203efed8d4d36ace8..690ca59bb4789319d53cce58b573ae01e6f159ac 100644 (file)
@@ -42,7 +42,7 @@ Key Position::zobCastle[16];
 Key Position::zobSideToMove;
 Key Position::zobExclusion;
 
-Score Position::PieceSquareTable[16][64];
+Score Position::pieceSquareTable[16][64];
 
 // Material values arrays, indexed by Piece
 const Value PieceValueMidgame[17] = {
@@ -164,10 +164,10 @@ void Position::from_fen(const string& fen, bool isChess960) {
   std::istringstream ss(fen);
 
   clear();
-  ss >> token >> std::noskipws;
+  ss >> std::noskipws;
 
   // 1. Piece placement
-  while (!isspace(token))
+  while ((ss >> token) && !isspace(token))
   {
       if (token == '/')
           sq -= Square(16); // Jump back of 2 rows
@@ -180,8 +180,6 @@ void Position::from_fen(const string& fen, bool isChess960) {
           put_piece(Piece(p), sq);
           sq++;
       }
-
-      ss >> token;
   }
 
   // 2. Active color
@@ -209,7 +207,7 @@ void Position::from_fen(const string& fen, bool isChess960) {
 
   // Various initialisations
   chess960 = isChess960;
-  find_checkers();
+  st->checkersBB = attackers_to(king_square(sideToMove)) & pieces(opposite_color(sideToMove));
 
   st->key = compute_key();
   st->pawnKey = compute_pawn_key();
@@ -245,9 +243,9 @@ void Position::set_castling_rights(char token) {
 
     Square sqA = relative_square(c, SQ_A1);
     Square sqH = relative_square(c, SQ_H1);
-
     Square rsq, ksq = king_square(c);
-    token = toupper(token);
+
+    token = char(toupper(token));
 
     if (token == 'K')
         for (rsq = sqH; piece_on(rsq) != make_piece(c, ROOK); rsq--) {}
@@ -284,7 +282,7 @@ const string Position::to_fen() const {
       {
           sq = make_square(file, rank);
 
-          if (square_is_occupied(sq))
+          if (!square_is_empty(sq))
           {
               if (emptyCnt != '0')
               {
@@ -366,7 +364,7 @@ template<bool FindPinned>
 Bitboard Position::hidden_checkers(Color c) const {
 
   Bitboard result = EmptyBoardBB;
-  Bitboard pinners = pieces_of_color(FindPinned ? opposite_color(c) : c);
+  Bitboard pinners = pieces(FindPinned ? opposite_color(c) : c);
 
   // Pinned pieces protect our king, dicovery checks attack
   // the enemy king.
@@ -386,7 +384,7 @@ Bitboard Position::hidden_checkers(Color c) const {
       assert(b);
 
       if (  !(b & (b - 1)) // Only one bit set?
-          && (b & pieces_of_color(c))) // Is an our piece?
+          && (b & pieces(c))) // Is an our piece?
           result |= b;
   }
   return result;
@@ -477,7 +475,7 @@ bool Position::move_attacks_square(Move m, Square s) const {
   Bitboard occ, xray;
   Square f = move_from(m), t = move_to(m);
 
-  assert(square_is_occupied(f));
+  assert(!square_is_empty(f));
 
   if (bit_is_set(attacks_from(piece_on(f), t), s))
       return true;
@@ -487,7 +485,7 @@ bool Position::move_attacks_square(Move m, Square s) const {
   do_move_bb(&occ, make_move_bb(f, t));
   xray = ( (rook_attacks_bb(s, occ)   & pieces(ROOK, QUEEN))
           |(bishop_attacks_bb(s, occ) & pieces(BISHOP, QUEEN)))
-         & pieces_of_color(piece_color(piece_on(f)));
+         & pieces(piece_color(piece_on(f)));
 
   // If we have attacks we need to verify that are caused by our move
   // and are not already existent ones.
@@ -495,19 +493,6 @@ bool Position::move_attacks_square(Move m, Square s) const {
 }
 
 
-/// Position::find_checkers() computes the checkersBB bitboard, which
-/// contains a nonzero bit for each checking piece (0, 1 or 2). It
-/// currently works by calling Position::attackers_to, which is probably
-/// inefficient. Consider rewriting this function to use the last move
-/// played, like in non-bitboard versions of Glaurung.
-
-void Position::find_checkers() {
-
-  Color us = side_to_move();
-  st->checkersBB = attackers_to(king_square(us)) & pieces_of_color(opposite_color(us));
-}
-
-
 /// Position::pl_move_is_legal() tests whether a pseudo-legal move is legal
 
 bool Position::pl_move_is_legal(Move m, Bitboard pinned) const {
@@ -550,7 +535,7 @@ bool Position::pl_move_is_legal(Move m, Bitboard pinned) const {
   // square is attacked by the opponent. Castling moves are checked
   // for legality during move generation.
   if (piece_type(piece_on(from)) == KING)
-      return move_is_castle(m) || !(attackers_to(move_to(m)) & pieces_of_color(opposite_color(us)));
+      return move_is_castle(m) || !(attackers_to(move_to(m)) & pieces(opposite_color(us)));
 
   // A non-king move is legal if and only if it is not pinned or it
   // is moving along the ray towards or away from the king.
@@ -683,7 +668,7 @@ bool Position::move_is_pl(const Move m) const {
       {
           Bitboard b = occupied_squares();
           clear_bit(&b, from);
-          if (attackers_to(move_to(m), b) & pieces_of_color(opposite_color(us)))
+          if (attackers_to(move_to(m), b) & pieces(opposite_color(us)))
               return false;
       }
       else
@@ -985,8 +970,8 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI
           st->pawnKey ^= zobrist[us][PAWN][to];
 
           // Partially revert and update incremental scores
-          st->value -= pst(us, PAWN, to);
-          st->value += pst(us, promotion, to);
+          st->value -= pst(make_piece(us, PAWN), to);
+          st->value += pst(make_piece(us, promotion), to);
 
           // Update material
           st->npMaterial[us] += PieceValueMidgame[promotion];
@@ -1012,7 +997,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI
   if (moveIsCheck)
   {
       if (ep | pm)
-          st->checkersBB = attackers_to(king_square(them)) & pieces_of_color(us);
+          st->checkersBB = attackers_to(king_square(them)) & pieces(us);
       else
       {
           // Direct checks
@@ -1077,7 +1062,7 @@ void Position::do_capture_move(Key& key, PieceType capture, Color them, Square t
     key ^= zobrist[them][capture][capsq];
 
     // Update incremental scores
-    st->value -= pst(them, capture, capsq);
+    st->value -= pst(make_piece(them, capture), capsq);
 
     // Update piece count
     pieceCount[them][capture]--;
@@ -1190,7 +1175,7 @@ void Position::do_castle_move(Move m) {
   st->rule50 = 0;
 
   // Update checkers BB
-  st->checkersBB = attackers_to(king_square(them)) & pieces_of_color(us);
+  st->checkersBB = attackers_to(king_square(them)) & pieces(us);
 
   // Finish
   sideToMove = opposite_color(sideToMove);
@@ -1493,7 +1478,7 @@ int Position::see(Move m) const {
 
   // If the opponent has no attackers we are finished
   stm = opposite_color(piece_color(piece_on(from)));
-  stmAttackers = attackers & pieces_of_color(stm);
+  stmAttackers = attackers & pieces(stm);
   if (!stmAttackers)
       return PieceValueMidgame[capturedType];
 
@@ -1531,7 +1516,7 @@ int Position::see(Move m) const {
       // move before beginning the next iteration.
       capturedType = pt;
       stm = opposite_color(stm);
-      stmAttackers = attackers & pieces_of_color(stm);
+      stmAttackers = attackers & pieces(stm);
 
       // Stop before processing a king capture
       if (capturedType == KING && stmAttackers)
@@ -1559,25 +1544,24 @@ void Position::clear() {
   st = &startState;
   memset(st, 0, sizeof(StateInfo));
   st->epSquare = SQ_NONE;
-  fullMoves = 1;
-  nodes = 0;
 
   memset(byColorBB,  0, sizeof(Bitboard) * 2);
   memset(byTypeBB,   0, sizeof(Bitboard) * 8);
   memset(pieceCount, 0, sizeof(int) * 2 * 8);
   memset(index,      0, sizeof(int) * 64);
 
-  for (int i = 0; i < 64; i++)
-      board[i] = PIECE_NONE;
-
   for (int i = 0; i < 8; i++)
       for (int j = 0; j < 16; j++)
           pieceList[0][i][j] = pieceList[1][i][j] = SQ_NONE;
 
   for (Square sq = SQ_A1; sq <= SQ_H8; sq++)
+  {
+      board[sq] = PIECE_NONE;
       castleRightsMask[sq] = ALL_CASTLES;
-
+  }
   sideToMove = WHITE;
+  fullMoves = 1;
+  nodes = 0;
 }
 
 
@@ -1593,9 +1577,9 @@ void Position::put_piece(Piece p, Square s) {
   index[s] = pieceCount[c][pt]++;
   pieceList[c][pt][index[s]] = s;
 
-  set_bit(&(byTypeBB[pt]), s);
-  set_bit(&(byColorBB[c]), s);
-  set_bit(&(byTypeBB[0]), s); // HACK: byTypeBB[0] contains all occupied squares.
+  set_bit(&byTypeBB[pt], s);
+  set_bit(&byColorBB[c], s);
+  set_bit(&byTypeBB[0], s); // HACK: byTypeBB[0] contains all occupied squares.
 }
 
 
@@ -1609,7 +1593,7 @@ Key Position::compute_key() const {
   Key result = zobCastle[st->castleRights];
 
   for (Square s = SQ_A1; s <= SQ_H8; s++)
-      if (square_is_occupied(s))
+      if (!square_is_empty(s))
           result ^= zobrist[piece_color(piece_on(s))][piece_type(piece_on(s))][s];
 
   if (ep_square() != SQ_NONE)
@@ -1676,7 +1660,7 @@ Score Position::compute_value() const {
       {
           b = pieces(pt, c);
           while (b)
-              result += pst(c, pt, pop_1st_bit(&b));
+              result += pst(make_piece(c, pt), pop_1st_bit(&b));
       }
 
   result += (side_to_move() == WHITE ? TempoValue / 2 : -TempoValue / 2);
@@ -1766,11 +1750,11 @@ void Position::init() {
 
   for (Square s = SQ_A1; s <= SQ_H8; s++)
       for (Piece p = WP; p <= WK; p++)
-          PieceSquareTable[p][s] = make_score(MgPST[p][s], EgPST[p][s]);
+          pieceSquareTable[p][s] = make_score(MgPST[p][s], EgPST[p][s]);
 
   for (Square s = SQ_A1; s <= SQ_H8; s++)
       for (Piece p = BP; p <= BK; p++)
-          PieceSquareTable[p][s] = -PieceSquareTable[p-8][flip_square(s)];
+          pieceSquareTable[p][s] = -pieceSquareTable[p-8][flip_square(s)];
 }
 
 
@@ -1810,7 +1794,7 @@ void Position::flip() {
       st->epSquare = flip_square(pos.st->epSquare);
 
   // Checkers
-  find_checkers();
+  st->checkersBB = attackers_to(king_square(sideToMove)) & pieces(opposite_color(sideToMove));
 
   // Hash keys
   st->key = compute_key();
@@ -1884,7 +1868,7 @@ bool Position::is_ok(int* failedStep) const {
       Color us = side_to_move();
       Color them = opposite_color(us);
       Square ksq = king_square(them);
-      if (attackers_to(ksq) & pieces_of_color(us))
+      if (attackers_to(ksq) & pieces(us))
           return false;
   }
 
@@ -1898,12 +1882,12 @@ bool Position::is_ok(int* failedStep) const {
   if (debugBitboards)
   {
       // The intersection of the white and black pieces must be empty
-      if ((pieces_of_color(WHITE) & pieces_of_color(BLACK)) != EmptyBoardBB)
+      if ((pieces(WHITE) & pieces(BLACK)) != EmptyBoardBB)
           return false;
 
       // The union of the white and black pieces must be equal to all
       // occupied squares
-      if ((pieces_of_color(WHITE) | pieces_of_color(BLACK)) != occupied_squares())
+      if ((pieces(WHITE) | pieces(BLACK)) != occupied_squares())
           return false;
 
       // Separate piece type bitboards must have empty intersections
@@ -1968,10 +1952,10 @@ bool Position::is_ok(int* failedStep) const {
           for (PieceType pt = PAWN; pt <= KING; pt++)
               for (int i = 0; i < pieceCount[c][pt]; i++)
               {
-                  if (piece_on(piece_list(c, pt, i)) != make_piece(c, pt))
+                  if (piece_on(piece_list(c, pt)[i]) != make_piece(c, pt))
                       return false;
 
-                  if (index[piece_list(c, pt, i)] != i)
+                  if (index[piece_list(c, pt)[i]] != i)
                       return false;
               }