32 unsigned int levenshtein_distance(
const std::string& s1,
const std::string& s2)
34 const std::size_t len1 = s1.size(), len2 = s2.size();
35 std::vector<unsigned int> col(len2 + 1), prevCol(len2 + 1);
37 for (
unsigned int i = 0; i < prevCol.size(); i++)
39 for (
unsigned int i = 0; i < len1; i++)
42 for (
unsigned int j = 0; j < len2; j++)
43 col[j + 1] = std::min({prevCol[1 + j] + 1, col[j] + 1, prevCol[j] + (s1[i] == s2[j] ? 0 : 1)});
49 std::vector<std::string> findSimilarOptions(
const std::string& name,
const std::vector<std::string>& options)
51 constexpr
size_t MAX_SUGGESTIONS = 7;
53 std::vector<std::string> subStringOptions;
54 std::vector<std::string> levenshteinOptions;
59 auto nameStrip = name;
60 nameStrip.erase(std::remove(nameStrip.begin(), nameStrip.end(),
'-'), nameStrip.end());
63 for (
const auto& optionName : options)
65 if (subStringOptions.size() >= MAX_SUGGESTIONS)
68 if (optionName.find(nameStrip) != std::string::npos)
69 subStringOptions.push_back(optionName);
75 size_t bestDist = UINT_MAX;
77 for (
const auto& optionName : options)
79 if (levenshteinOptions.size() >= MAX_SUGGESTIONS)
82 const auto dist = levenshtein_distance(name, optionName);
85 levenshteinOptions.clear();
89 if (dist == bestDist &&
90 std::find(subStringOptions.begin(), subStringOptions.end(), optionName) == subStringOptions.end())
91 levenshteinOptions.push_back(optionName);
96 auto output = subStringOptions;
97 for (
const auto&
option : levenshteinOptions)
99 output.resize(std::min(output.size(), MAX_SUGGESTIONS));
106 CORE_INFO(
"Core " << PACKAGE_VERSION_STRING);
120 for (
auto parameters : _parameterSets)
121 _allOptions.add(parameters->parameters());
128 _parameterSets.push_back(parameters);
131 void ParametersManager::_parse(
int argc,
const char** argv)
135 po::options_description generalOptions(
"General options");
136 generalOptions.add_options()(
"help",
"Print this help")(
"version",
137 "Print the Core version")(
"verbose",
138 "Print parsed parameters");
140 _allOptions.add(generalOptions);
142 po::variables_map vm;
143 po::parsed_options parsedOptions =
144 po::command_line_parser(argc, argv)
145 .options(_allOptions)
146 .allow_unregistered()
147 .positional(_applicationParameters.
posArgs())
148 .style(po::command_line_style::unix_style & ~po::command_line_style::allow_short &
149 ~po::command_line_style::allow_guessing)
152 const auto unrecognizedOptions = po::collect_unrecognized(parsedOptions.options, po::exclude_positional);
154 _processUnrecognizedOptions(unrecognizedOptions);
156 po::store(parsedOptions, vm);
159 if (vm.count(
"help"))
166 if (vm.count(
"version"))
169 for (
auto parameters : _parameterSets)
170 parameters->parse(vm);
172 if (vm.count(
"verbose"))
175 catch (
const po::error& e)
184 std::cout << _allOptions << std::endl;
196 parameters->resetModified();
203 if (parameters->isModified())
211 return _animationParameters;
216 return _animationParameters;
221 return _applicationParameters;
226 return _applicationParameters;
231 return _renderingParameters;
236 return _renderingParameters;
241 return _geometryParameters;
246 return _geometryParameters;
251 return _volumeParameters;
256 return _volumeParameters;
261 return _fieldParameters;
266 return _fieldParameters;
269 void ParametersManager::_processUnrecognizedOptions(
const std::vector<std::string>& unrecognizedOptions)
const
271 if (unrecognizedOptions.empty())
274 const auto& unrecognized = unrecognizedOptions.front();
276 std::vector<std::string> availableOptions;
277 for (
auto option : _allOptions.options())
278 availableOptions.push_back(
option->format_name());
280 const auto suggestions = findSimilarOptions(unrecognized, availableOptions);
282 std::string errorMessage =
"Unrecognized option '" + unrecognized +
"'.\n\nMost similar options are:";
284 for (
const auto& suggestion : suggestions)
285 errorMessage +=
"\n\t" + suggestion;
287 throw po::error(errorMessage);
po::positional_options_description & posArgs()
PLATFORM_API GeometryParameters & getGeometryParameters()
PLATFORM_API ApplicationParameters & getApplicationParameters()
PLATFORM_API void print()
PLATFORM_API void registerParameters(AbstractParameters *parameters)
PLATFORM_API AnimationParameters & getAnimationParameters()
PLATFORM_API void usage()
PLATFORM_API RenderingParameters & getRenderingParameters()
bool isAnyModified() const
PLATFORM_API FieldParameters & getFieldParameters()
PLATFORM_API VolumeParameters & getVolumeParameters()
ParametersManager(int argc, const char **argv)