mirror of
https://github.com/opelly27/Stockfish.git
synced 2026-05-20 10:57:43 +00:00
Disallow same option being added twice
Now exits during startup. ``` ./stockfish Stockfish dev-20250202-243c7c6a by the Stockfish developers (see AUTHORS file) x1,5,0,10,0.5,0.0020 Option: "x1" was already added! ``` i.e. prevents and helps debug this case ```cpp int x1 = 5; TUNE(x1); TUNE(x1); ``` closes https://github.com/official-stockfish/Stockfish/pull/5847 No functional change
This commit is contained in:
+21
-19
@@ -21,6 +21,7 @@
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <cctype>
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <utility>
|
||||
@@ -57,17 +58,31 @@ void OptionsMap::setoption(std::istringstream& is) {
|
||||
sync_cout << "No such option: " << name << sync_endl;
|
||||
}
|
||||
|
||||
Option OptionsMap::operator[](const std::string& name) const {
|
||||
const Option& OptionsMap::operator[](const std::string& name) const {
|
||||
auto it = options_map.find(name);
|
||||
return it != options_map.end() ? it->second : Option(this);
|
||||
assert(it != options_map.end());
|
||||
return it->second;
|
||||
}
|
||||
|
||||
Option& OptionsMap::operator[](const std::string& name) {
|
||||
// Inits options and assigns idx in the correct printing order
|
||||
void OptionsMap::add(const std::string& name, const Option& option) {
|
||||
if (!options_map.count(name))
|
||||
options_map[name] = Option(this);
|
||||
return options_map[name];
|
||||
{
|
||||
static size_t insert_order = 0;
|
||||
|
||||
options_map[name] = option;
|
||||
|
||||
options_map[name].parent = this;
|
||||
options_map[name].idx = insert_order++;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cerr << "Option \"" << name << "\" was already added!" << std::endl;
|
||||
std::exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
std::size_t OptionsMap::count(const std::string& name) const { return options_map.count(name); }
|
||||
|
||||
Option::Option(const OptionsMap* map) :
|
||||
@@ -130,19 +145,6 @@ bool Option::operator==(const char* s) const {
|
||||
bool Option::operator!=(const char* s) const { return !(*this == s); }
|
||||
|
||||
|
||||
// Inits options and assigns idx in the correct printing order
|
||||
|
||||
void Option::operator<<(const Option& o) {
|
||||
|
||||
static size_t insert_order = 0;
|
||||
|
||||
auto p = this->parent;
|
||||
*this = o;
|
||||
|
||||
this->parent = p;
|
||||
idx = insert_order++;
|
||||
}
|
||||
|
||||
// Updates currentValue and triggers on_change() action. It's up to
|
||||
// the GUI to check for option's limits, but we could receive the new value
|
||||
// from the user by console window, so let's check the bounds anyway.
|
||||
@@ -161,7 +163,7 @@ Option& Option::operator=(const std::string& v) {
|
||||
std::string token;
|
||||
std::istringstream ss(defaultValue);
|
||||
while (ss >> token)
|
||||
comboMap[token] << Option();
|
||||
comboMap.add(token, Option());
|
||||
if (!comboMap.count(v) || v == "var")
|
||||
return *this;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user