From: Marco Costalba Date: Sun, 4 Sep 2016 13:29:11 +0000 (+0200) Subject: Syntactic sugar to loop across pieces X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=e340ce221cc29113dc5f2f922d2759ca5fa52f8b Syntactic sugar to loop across pieces Also add some comments to the new operator~(Piece). No functional change. --- diff --git a/src/position.cpp b/src/position.cpp index eeedbbb2..26e8e1ce 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -109,10 +109,9 @@ void Position::init() { PRNG rng(1070372); - for (Color c = WHITE; c <= BLACK; ++c) - for (PieceType pt = PAWN; pt <= KING; ++pt) - for (Square s = SQ_A1; s <= SQ_H8; ++s) - Zobrist::psq[make_piece(c, pt)][s] = rng.rand(); + for (Piece pc : Pieces) + for (Square s = SQ_A1; s <= SQ_H8; ++s) + Zobrist::psq[pc][s] = rng.rand(); for (File f = FILE_A; f <= FILE_H; ++f) Zobrist::enpassant[f] = rng.rand(); @@ -342,14 +341,14 @@ void Position::set_state(StateInfo* si) const { si->pawnKey ^= Zobrist::psq[piece_on(s)][s]; } - for (Color c = WHITE; c <= BLACK; ++c) - for (PieceType pt = PAWN; pt <= KING; ++pt) - for (int cnt = 0; cnt < pieceCount[make_piece(c, pt)]; ++cnt) - si->materialKey ^= Zobrist::psq[make_piece(c, pt)][cnt]; + for (Piece pc : Pieces) + { + if (type_of(pc) != PAWN && type_of(pc) != KING) + si->nonPawnMaterial[color_of(pc)] += pieceCount[pc] * PieceValue[MG][pc]; - for (Color c = WHITE; c <= BLACK; ++c) - for (PieceType pt = KNIGHT; pt <= QUEEN; ++pt) - si->nonPawnMaterial[c] += pieceCount[make_piece(c, pt)] * PieceValue[MG][pt]; + for (int cnt = 0; cnt < pieceCount[pc]; ++cnt) + si->materialKey ^= Zobrist::psq[pc][cnt]; + } } @@ -1136,18 +1135,15 @@ bool Position::pos_is_ok(int* failedStep) const { } if (step == Lists) - for (Color c = WHITE; c <= BLACK; ++c) - for (PieceType pt = PAWN; pt <= KING; ++pt) - { - Piece pc = make_piece(c, pt); + for (Piece pc : Pieces) + { + if (pieceCount[pc] != popcount(pieces(color_of(pc), type_of(pc)))) + return false; - if (pieceCount[pc] != popcount(pieces(c, pt))) + for (int i = 0; i < pieceCount[pc]; ++i) + if (board[pieceList[pc][i]] != pc || index[pieceList[pc][i]] != i) return false; - - for (int i = 0; i < pieceCount[pc]; ++i) - if (board[pieceList[pc][i]] != pc || index[pieceList[pc][i]] != i) - return false; - } + } if (step == Castling) for (Color c = WHITE; c <= BLACK; ++c) diff --git a/src/types.h b/src/types.h index 867ebb29..b1810fad 100644 --- a/src/types.h +++ b/src/types.h @@ -205,6 +205,9 @@ enum Piece { PIECE_NB = 16 }; +const Piece Pieces[] = { W_PAWN, W_KNIGHT, W_BISHOP, W_ROOK, W_QUEEN, W_KING, + B_PAWN, B_KNIGHT, B_BISHOP, B_ROOK, B_QUEEN, B_KING }; + enum Depth { ONE_PLY = 1, @@ -329,7 +332,7 @@ inline Score operator/(Score s, int i) { extern Value PieceValue[PHASE_NB][PIECE_NB]; inline Color operator~(Color c) { - return Color(c ^ BLACK); + return Color(c ^ BLACK); // Toggle color } inline Square operator~(Square s) { @@ -337,7 +340,7 @@ inline Square operator~(Square s) { } inline Piece operator~(Piece pc) { - return Piece(pc ^ 8); + return Piece(pc ^ 8); // Swap color of piece B_KNIGHT -> W_KNIGHT } inline CastlingRight operator|(Color c, CastlingSide s) {