}
-/// 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;
}
}
}
- // En passant capture with check? We have already handled the case
+ // En passant capture with check ? We have already handled the case
// of direct checks and ordinary discovered check, the only case we
- // need to handle is the unusual case of a discovered check through the
- // captured pawn.
+ // need to handle is the unusual case of a discovered check through
+ // the captured pawn.
if (move_is_ep(m))
{
Square capsq = make_square(square_file(to), square_rank(from));
}
// Prefetch TT access as soon as we know key is updated
- TT.prefetch(key);
+ prefetch((char*)TT.first_entry(key));
// Move the piece
Bitboard move_bb = make_move_bb(from, to);
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]--;
st->key ^= zobEp[st->epSquare];
st->key ^= zobSideToMove;
- TT.prefetch(st->key);
+ prefetch((char*)TT.first_entry(st->key));
sideToMove = opposite_color(sideToMove);
st->epSquare = SQ_NONE;
Square from = move_from(m);
Square to = move_to(m);
- // Early return if SEE cannot be negative because capturing piece value
- // is not bigger then captured one.
- if ( midgame_value_of_piece_on(from) <= midgame_value_of_piece_on(to)
- && type_of_piece_on(from) != KING)
- return 1;
+ // Early return if SEE cannot be negative because captured piece value
+ // is not less then capturing one. Note that king moves always return
+ // here because king midgame value is set to 0.
+ if (midgame_value_of_piece_on(to) >= midgame_value_of_piece_on(from))
+ return 1;
return see(from, to);
}
assert(pos.is_ok());
clear();
+ threadID = pos.thread();
// Board
for (Square s = SQ_A1; s <= SQ_H8; s++)