]> git.sesse.net Git - stockfish/blobdiff - src/position.cpp
Rename pieces_of_color() in pieces()
[stockfish] / src / position.cpp
index f9fd0b73e51363068eaef1ab35deeaca200b125e..eb3cb895b51b7e1e2acccafe6899ff01ff41a432 100644 (file)
@@ -158,17 +158,16 @@ void Position::from_fen(const string& fen, bool isChess960) {
    6) Fullmove number: The number of the full move. It starts at 1, and is incremented after Black's move.
 */
 
-  char token;
+  char col, row, token;
   size_t p;
-  string ep;
   Square sq = SQ_A8;
   std::istringstream ss(fen);
 
   clear();
-  ss >> std::skipws >> 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
@@ -181,34 +180,30 @@ void Position::from_fen(const string& fen, bool isChess960) {
           put_piece(Piece(p), sq);
           sq++;
       }
-
-      ss >> token;
   }
 
   // 2. Active color
-  ss >> std::skipws >> token;
+  ss >> token;
   sideToMove = (token == 'w' ? WHITE : BLACK);
+  ss >> token;
 
   // 3. Castling availability
-  ss >> token >> std::noskipws;
-  while (token != '-' && !isspace(token))
-  {
+  while ((ss >> token) && !isspace(token))
       set_castling_rights(token);
-      ss >> token;
-  }
 
   // 4. En passant square. Ignore if no pawn capture is possible
-  ss >> std::skipws >> ep;
-  if (ep.size() == 2)
+  if (   ((ss >> col) && (col >= 'a' && col <= 'h'))
+      && ((ss >> row) && (row == '3' || row == '6')))
   {
-      st->epSquare = make_square(File(ep[0] - 'a'), Rank(ep[1] - '1'));
+      st->epSquare = make_square(File(col - 'a'), Rank(row - '1'));
+      Color them = opposite_color(sideToMove);
 
-      if (!(attackers_to(st->epSquare) & pieces(PAWN, sideToMove)))
+      if (!(attacks_from<PAWN>(st->epSquare, them) & pieces(PAWN, sideToMove)))
           st->epSquare = SQ_NONE;
   }
 
   // 5-6. Halfmove clock and fullmove number
-  ss >> st->rule50 >> fullMoves;
+  ss >> std::skipws >> st->rule50 >> fullMoves;
 
   // Various initialisations
   chess960 = isChess960;
@@ -248,28 +243,25 @@ 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);
 
-    if (toupper(token) == 'K')
-    {
+    token = toupper(token);
+
+    if (token == 'K')
         for (rsq = sqH; piece_on(rsq) != make_piece(c, ROOK); rsq--) {}
-        set_castle(WHITE_OO << c, ksq, rsq);
-    }
-    else if (toupper(token) == 'Q')
-    {
+
+    else if (token == 'Q')
         for (rsq = sqA; piece_on(rsq) != make_piece(c, ROOK); rsq++) {}
-        set_castle(WHITE_OOO << c, ksq, rsq);
-    }
-    else if (toupper(token) >= 'A' && toupper(token) <= 'H')
-    {
-        Square rsq = make_square(File(toupper(token) - 'A'), RANK_1);
 
-        if (square_file(rsq) < square_file(ksq))
-            set_castle(WHITE_OOO << c, ksq, rsq);
-        else
-            set_castle(WHITE_OO << c, ksq, rsq);
-    }
+    else if (token >= 'A' && token <= 'H')
+        rsq = make_square(File(token - 'A'), relative_rank(c, RANK_1));
+
+    else return;
+
+    if (square_file(rsq) < square_file(ksq))
+        set_castle(WHITE_OOO << c, ksq, rsq);
+    else
+        set_castle(WHITE_OO << c, ksq, rsq);
 }
 
 
@@ -290,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')
               {
@@ -372,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.
@@ -392,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;
@@ -483,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;
@@ -493,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.
@@ -510,7 +502,7 @@ bool Position::move_attacks_square(Move m, Square s) const {
 void Position::find_checkers() {
 
   Color us = side_to_move();
-  st->checkersBB = attackers_to(king_square(us)) & pieces_of_color(opposite_color(us));
+  st->checkersBB = attackers_to(king_square(us)) & pieces(opposite_color(us));
 }
 
 
@@ -556,7 +548,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.
@@ -689,7 +681,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
@@ -991,8 +983,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];
@@ -1018,7 +1010,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
@@ -1083,7 +1075,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]--;
@@ -1196,7 +1188,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);
@@ -1499,7 +1491,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];
 
@@ -1537,7 +1529,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)
@@ -1565,25 +1557,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;
 }
 
 
@@ -1599,9 +1590,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.
 }
 
 
@@ -1615,7 +1606,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)
@@ -1657,16 +1648,13 @@ Key Position::compute_pawn_key() const {
 
 Key Position::compute_material_key() const {
 
-  int count;
   Key result = 0;
 
   for (Color c = WHITE; c <= BLACK; c++)
       for (PieceType pt = PAWN; pt <= QUEEN; pt++)
-      {
-          count = piece_count(c, pt);
-          for (int i = 0; i < count; i++)
+          for (int i = 0, cnt = piece_count(c, pt); i < cnt; i++)
               result ^= zobrist[c][pt][i];
-      }
+
   return result;
 }
 
@@ -1685,7 +1673,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);
@@ -1893,7 +1881,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;
   }
 
@@ -1907,12 +1895,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