#include "conversion.hpp" #include "randomization.hpp" #include #include #include #include #include namespace { void optarg_error(char arg, const std::string_view &error) { std::cout << "Error: Invalid option argument for -" << arg << ". " << error << std::endl; exit(EXIT_FAILURE); } /** * Returns the current optarg as a string view. */ std::string_view get_str_optarg() { return std::string_view(optarg); } /** * Returns the current optarg as a unsigned integer. * * @param arg The current command-line argument character * @param check_zero Whether or not to make sure that the result is not zero */ unsigned int get_uint_optarg(char arg, bool check_zero = false) { auto conversion_result = str_to_uint(get_str_optarg()); if (!conversion_result.success || (check_zero && conversion_result.result == 0)) { optarg_error(arg, conversion_result.fail_reason); } return conversion_result.result; } } // namespace constexpr std::array options = { option({"seed", required_argument, nullptr, 's'}), option({"help", no_argument, nullptr, 0}), option({nullptr, 0, nullptr, 0})}; int main(int argc, char *argv[]) { auto args = std::vector(argv, argv + argc); std::shared_ptr random_gen = nullptr; char arg = 0; while ((arg = static_cast( getopt_long(argc, argv, "s:", options.data(), nullptr))) != -1) { switch (arg) { case 's': { auto seed = get_uint_optarg(arg, true); random_gen = std::make_shared(seed); break; } case 0: { std::cout << "Usage: " << args[0] << " [OPTION]...\n\n" "Options:\n" << " -s, --seed SEED The randomization seed used\n" " --help Displays usage information" << std::endl; return EXIT_SUCCESS; } case '?': { std::cout << "\nTry '" << args[0] << " --help' for more information" << std::endl; return EXIT_FAILURE; } default: abort(); } } if (random_gen == nullptr) { random_gen = std::make_shared(); } }