const string StartPositionFEN = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
// Keep track of position keys along the setup moves (from start position to the
- // position just before to start searching). This is needed by draw detection.
- std::vector<StateInfo> SetupState;
+ // position just before to start searching). This is needed by draw detection
+ // where, due to 50 moves rule, we need to check at most 100 plies back.
+ StateInfo StateRingBuf[102], *SetupState = StateRingBuf;
// UCIParser is a class for parsing UCI input. The class
// is actually a string stream built on a given input string.
}
else return;
- SetupState.clear();
-
// Parse move list (if any)
while (up >> token && (m = move_from_uci(pos, token)) != MOVE_NONE)
{
- SetupState.push_back(StateInfo());
- pos.do_move(m, SetupState.back());
+ pos.do_move(m, *SetupState);
+
+ // Increment pointer to StateRingBuf circular buffer
+ if (++SetupState - StateRingBuf >= 102)
+ SetupState = StateRingBuf;
}
}
string token;
SearchLimits limits;
- Move searchMoves[MAX_MOVES], *cur = searchMoves;
+ std::vector<Move> searchMoves;
int time[] = { 0, 0 }, inc[] = { 0, 0 };
while (up >> token)
up >> limits.maxTime;
else if (token == "searchmoves")
while (up >> token)
- *cur++ = move_from_uci(pos, token);
+ searchMoves.push_back(move_from_uci(pos, token));
}
- *cur = MOVE_NONE;
+ searchMoves.push_back(MOVE_NONE);
limits.time = time[pos.side_to_move()];
limits.increment = inc[pos.side_to_move()];
- return think(pos, limits, searchMoves);
+ return think(pos, limits, &searchMoves[0]);
}