And pass it as an argument.
No functional change.
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
// UCIInputParser is a class for parsing UCI input. The class
// is actually a string stream built on a given input string.
// UCIInputParser is a class for parsing UCI input. The class
// is actually a string stream built on a given input string.
typedef istringstream UCIInputParser;
typedef istringstream UCIInputParser;
- // The root position. This is set up when the user (or in practice, the GUI)
- // sends the "position" UCI command. The root position is sent to the think()
- // function when the program receives the "go" command.
- Position RootPosition(StartPositionFEN, 0);
-
- bool handle_command(const string& command);
+ bool handle_command(Position& pos, const string& command);
void set_option(UCIInputParser& uip);
void set_option(UCIInputParser& uip);
- void set_position(UCIInputParser& uip);
- bool go(UCIInputParser& uip);
- void perft(UCIInputParser& uip);
+ void set_position(Position& pos, UCIInputParser& uip);
+ bool go(Position& pos, UCIInputParser& uip);
+ void perft(Position& pos, UCIInputParser& uip);
+ Position pos(StartPositionFEN, 0); // The root position
if (!getline(cin, command))
command = "quit";
if (!getline(cin, command))
command = "quit";
- } while (handle_command(command));
+ } while (handle_command(pos, command));
// and calls the appropriate functions. In addition to the UCI
// commands, the function also supports a few debug commands.
// and calls the appropriate functions. In addition to the UCI
// commands, the function also supports a few debug commands.
- bool handle_command(const string& command) {
+ bool handle_command(Position& pos, const string& command) {
UCIInputParser uip(command);
string token;
UCIInputParser uip(command);
string token;
return false;
if (token == "go")
return false;
if (token == "go")
else if (token == "ucinewgame")
{
push_button("New Game");
else if (token == "ucinewgame")
{
push_button("New Game");
- RootPosition.from_fen(StartPositionFEN);
+ pos.from_fen(StartPositionFEN);
}
else if (token == "isready")
cout << "readyok" << endl;
else if (token == "position")
}
else if (token == "isready")
cout << "readyok" << endl;
else if (token == "position")
+ set_position(pos, uip);
else if (token == "setoption")
set_option(uip);
else if (token == "setoption")
set_option(uip);
// Perhaps they should be removed later in order to reduce the
// size of the program binary.
else if (token == "d")
// Perhaps they should be removed later in order to reduce the
// size of the program binary.
else if (token == "d")
else if (token == "flip")
else if (token == "flip")
- {
- Position p(RootPosition, RootPosition.thread());
- RootPosition.flipped_copy(p);
- }
+ pos.flipped_copy(Position(pos, pos.thread()));
else if (token == "eval")
{
Value evalMargin;
else if (token == "eval")
{
Value evalMargin;
- cout << "Incremental mg: " << mg_value(RootPosition.value())
- << "\nIncremental eg: " << eg_value(RootPosition.value())
- << "\nFull eval: " << evaluate(RootPosition, evalMargin) << endl;
+ cout << "Incremental mg: " << mg_value(pos.value())
+ << "\nIncremental eg: " << eg_value(pos.value())
+ << "\nFull eval: " << evaluate(pos, evalMargin) << endl;
}
else if (token == "key")
}
else if (token == "key")
- cout << "key: " << hex << RootPosition.get_key()
- << "\nmaterial key: " << RootPosition.get_material_key()
- << "\npawn key: " << RootPosition.get_pawn_key() << endl;
+ cout << "key: " << hex << pos.get_key()
+ << "\nmaterial key: " << pos.get_material_key()
+ << "\npawn key: " << pos.get_pawn_key() << endl;
else if (token == "perft")
else if (token == "perft")
else
cout << "Unknown command: " << command << endl;
else
cout << "Unknown command: " << command << endl;
// ("position"), and is ready to read the second token ("startpos"
// or "fen", if the input is well-formed).
// ("position"), and is ready to read the second token ("startpos"
// or "fen", if the input is well-formed).
- void set_position(UCIInputParser& uip) {
+ void set_position(Position& pos, UCIInputParser& uip) {
return;
if (token == "startpos")
return;
if (token == "startpos")
- RootPosition.from_fen(StartPositionFEN);
+ pos.from_fen(StartPositionFEN);
else if (token == "fen")
{
string fen;
else if (token == "fen")
{
string fen;
fen += token;
fen += ' ';
}
fen += token;
fen += ' ';
}
- RootPosition.from_fen(fen);
StateInfo st;
while (uip >> token)
{
StateInfo st;
while (uip >> token)
{
- move = move_from_string(RootPosition, token);
- RootPosition.do_move(move, st);
- if (RootPosition.rule_50_counter() == 0)
- RootPosition.reset_game_ply();
+ move = move_from_string(pos, token);
+ pos.do_move(move, st);
+ if (pos.rule_50_counter() == 0)
+ pos.reset_game_ply();
- RootPosition.inc_startpos_ply_counter(); //FIXME: make from_fen to support this and rule50
+ pos.inc_startpos_ply_counter(); //FIXME: make from_fen to support this and rule50
}
// Our StateInfo st is about going out of scope so copy
}
// Our StateInfo st is about going out of scope so copy
- // its content inside RootPosition before it disappears.
- RootPosition.detach();
+ // its content inside pos before it disappears.
+ pos.detach();
// parameters. Returns false if a quit command is received while
// thinking, returns true otherwise.
// parameters. Returns false if a quit command is received while
// thinking, returns true otherwise.
- bool go(UCIInputParser& uip) {
+ bool go(Position& pos, UCIInputParser& uip) {
{
int numOfMoves = 0;
while (uip >> token)
{
int numOfMoves = 0;
while (uip >> token)
- searchMoves[numOfMoves++] = move_from_string(RootPosition, token);
+ searchMoves[numOfMoves++] = move_from_string(pos, token);
searchMoves[numOfMoves] = MOVE_NONE;
}
}
searchMoves[numOfMoves] = MOVE_NONE;
}
}
- assert(RootPosition.is_ok());
- return think(RootPosition, infinite, ponder, time, inc, movesToGo,
+ return think(pos, infinite, ponder, time, inc, movesToGo,
depth, nodes, moveTime, searchMoves);
}
depth, nodes, moveTime, searchMoves);
}
- void perft(UCIInputParser& uip) {
+ void perft(Position& pos, UCIInputParser& uip) {
string token;
int depth, tm, n;
string token;
int depth, tm, n;
- n = perft(RootPosition, depth * ONE_PLY);
+ n = perft(pos, depth * ONE_PLY);
tm = get_system_time() - tm;
std::cout << "\nNodes " << n
tm = get_system_time() - tm;
std::cout << "\nNodes " << n