}
-/// 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;
}
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;
}
// pointer to point to the new, ready to be updated, state.
struct ReducedStateInfo {
Key pawnKey, materialKey;
- int castleRights, rule50, gamePly, pliesFromNull;
+ int castleRights, rule50, ply, pliesFromNull;
Square epSquare;
Score value;
Value npMaterial[2];
// Save the current key to the history[] array, in order to be able to
// detect repetition draws.
- history[st->gamePly++] = key;
+ history[st->ply++] = key;
// Update side to move
key ^= zobSideToMove;
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]--;
// Save the current key to the history[] array, in order to be able to
// detect repetition draws.
- history[st->gamePly++] = st->key;
+ history[st->ply++] = st->key;
// Update the necessary information
if (st->epSquare != SQ_NONE)
// Update the necessary information
sideToMove = opposite_color(sideToMove);
st->rule50--;
- st->gamePly--;
+ st->ply--;
}
}
-/// 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 <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() {
- st->gamePly = 0;
+ st->ply = 0;
}
if (st->rule50 > 100 || (st->rule50 == 100 && !is_check()))
return true;
+ assert(st->ply >= st->rule50);
+
// Draw by repetition?
- for (int i = 4, e = Min(Min(st->gamePly, st->rule50), st->pliesFromNull); i <= e; i += 2)
- if (history[st->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;
assert(pos.is_ok());
clear();
+ threadID = pos.thread();
// Board
for (Square s = SQ_A1; s <= SQ_H8; s++)