X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=c5c63c2b3862701ffdf65ba258d0a407b82c2a5c;hp=97d2d1fcb88f86825f44d9d07e0b394f8f91fc49;hb=2f6927ac08887ff3b709cfe9228b27a85bdd1d88;hpb=b7bc0d4c57371bc1850559e2b9a06568345343a9 diff --git a/src/position.cpp b/src/position.cpp index 97d2d1fc..c5c63c2b 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -74,23 +74,23 @@ CheckInfo::CheckInfo(const Position& pos) { } -/// Position c'tors. Here we always create a slower but safer copy of -/// the original position or the FEN string, we want the new born Position -/// object do not depend on any external data. Instead if we know what we -/// are doing and we need speed we can create a position with default -/// c'tor Position() and then use just fast_copy(). +/// Position c'tors. Here we always create a copy of the original position +/// or the FEN string, we want the new born Position object do not depend +/// on any external data so we detach state pointer from the source one. -Position::Position() {} +Position::Position(int th) : threadID(th) {} -Position::Position(const Position& pos) { +Position::Position(const Position& pos, int th) { memcpy(this, &pos, sizeof(Position)); detach(); // Always detach() in copy c'tor to avoid surprises + threadID = th; } -Position::Position(const string& fen) { +Position::Position(const string& fen, int th) { from_fen(fen); + threadID = th; } @@ -340,7 +340,7 @@ void Position::print(Move m) const { std::cout << std::endl; if (m != MOVE_NONE) { - Position p(*this); + Position p(*this, thread()); string col = (color_of_piece_on(move_from(m)) == BLACK ? ".." : ""); std::cout << "Move is: " << col << move_to_san(p, m) << std::endl; } @@ -703,7 +703,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI // pointer to point to the new, ready to be updated, state. struct ReducedStateInfo { Key pawnKey, materialKey; - int castleRights, rule50, pliesFromNull; + int castleRights, rule50, ply, pliesFromNull; Square epSquare; Score value; Value npMaterial[2]; @@ -715,8 +715,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI // Save the current key to the history[] array, in order to be able to // detect repetition draws. - history[gamePly] = key; - gamePly++; + history[st->ply++] = key; // Update side to move key ^= zobSideToMove; @@ -820,7 +819,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI set_bit(&(byTypeBB[promotion]), to); board[to] = piece_of_color_and_type(us, promotion); - // Update piece counts + // Update piece counts pieceCount[us][promotion]++; pieceCount[us][PAWN]--; @@ -1061,7 +1060,6 @@ void Position::undo_move(Move m) { assert(is_ok()); assert(move_is_ok(m)); - gamePly--; sideToMove = opposite_color(sideToMove); if (move_is_castle(m)) @@ -1111,7 +1109,6 @@ void Position::undo_move(Move m) { pieceList[us][PAWN][index[to]] = to; } - // Put the piece back at the source square Bitboard move_bb = make_move_bb(to, from); do_move_bb(&(byColorBB[us]), move_bb); @@ -1246,7 +1243,7 @@ void Position::do_null_move(StateInfo& backupSt) { // Save the current key to the history[] array, in order to be able to // detect repetition draws. - history[gamePly] = st->key; + history[st->ply++] = st->key; // Update the necessary information if (st->epSquare != SQ_NONE) @@ -1260,7 +1257,6 @@ void Position::do_null_move(StateInfo& backupSt) { st->rule50++; st->pliesFromNull = 0; st->value += (sideToMove == WHITE) ? TempoValue : -TempoValue; - gamePly++; } @@ -1282,7 +1278,7 @@ void Position::undo_null_move() { // Update the necessary information sideToMove = opposite_color(sideToMove); st->rule50--; - gamePly--; + st->ply--; } @@ -1479,22 +1475,21 @@ void Position::clear() { pieceList[0][i][j] = pieceList[1][i][j] = SQ_NONE; sideToMove = WHITE; - gamePly = 0; initialKFile = FILE_E; initialKRFile = FILE_H; initialQRFile = FILE_A; } -/// Position::reset_game_ply() simply sets gamePly to 0. It is used from the +/// Position::reset_ply() simply sets ply to 0. It is used from the /// UCI interface code, whenever a non-reversible move is made in a /// 'position fen moves m1 m2 ...' command. This makes it possible /// for the program to handle games of arbitrary length, as long as the GUI /// handles draws by the 50 move rule correctly. -void Position::reset_game_ply() { +void Position::reset_ply() { - gamePly = 0; + st->ply = 0; } @@ -1671,9 +1666,11 @@ bool Position::is_draw() const { if (st->rule50 > 100 || (st->rule50 == 100 && !is_check())) return true; + assert(st->ply >= st->rule50); + // Draw by repetition? - for (int i = 4; i <= Min(Min(gamePly, st->rule50), st->pliesFromNull); i += 2) - if (history[gamePly - i] == st->key) + for (int i = 4, e = Min(st->rule50, st->pliesFromNull); i <= e; i += 2) + if (history[st->ply - i] == st->key) return true; return false; @@ -1788,6 +1785,7 @@ void Position::flipped_copy(const Position& pos) { assert(pos.is_ok()); clear(); + threadID = pos.thread(); // Board for (Square s = SQ_A1; s <= SQ_H8; s++)