Hi,
I noticed that your argument parsing is unnecessarily complex. Here are two ideas to make it simpler. First, you have a lot of repetitive code, just checking for simple flags. Using a vector a lot of that can be folded away.
int main(int argc, char **argv){
auto simple_flags = std::vector<std::pair<std::string,bool&>>({
{"-a_cob", APPROX_CUT_ONE_B},
{"-a_c2b", APPROX_CUT_TWO_B},
{"-a_c2br", APPROX_CUT_TWO_B_ROOT} // ToDo: list all other flags
});
int max_args = argc-1;
while (argc > 1) {
char *arg = argv[--argc];
auto it = std::find_if(simple_flags.begin(), simple_flags.end(), [=](const std::pair<std::string,bool&>& flag){
return flag.first == arg;
});
if (it != simple_flags.end()) {
it->second = true;
continue;
}
// deal with more complicated flags …
}
// rest of main …
}
Second, for -pairwise you use a lot of nested ifs. Inverting the logic here can help.
else if (strcmp(arg, "-pairwise") == 0)
{
PAIRWISE = true;
QUIET = true;
do {
if (max_args <= argc)break;
if (argv[argc + 1][0] == '-') break;
PAIRWISE_START = atoi(argv[argc + 1]);
if (max_args <= argc + 1)break;
if (argv[argc + 2][0] == '-') break;
PAIRWISE_END = atoi(argv[argc + 2]);
if (max_args <= argc + 2)break;
if (argv[argc + 3][0] == '-') break;
PAIRWISE_COL_START = atoi(argv[argc + 3]);
if (max_args <= argc + 3)break;
if (argv[argc + 4][0] == '-') break;
PAIRWISE_COL_END = atoi(argv[argc + 4]);
} while (0);
}
Best,
Fabian
Hi,
I noticed that your argument parsing is unnecessarily complex. Here are two ideas to make it simpler. First, you have a lot of repetitive code, just checking for simple flags. Using a vector a lot of that can be folded away.
Second, for
-pairwiseyou use a lot of nested ifs. Inverting the logic here can help.Best,
Fabian