38 std::string_view valstr;
39 if (
auto eq = option.find(
'='); eq != std::string_view::npos)
40 valstr = option.substr(eq + 1);
44 throw std::invalid_argument(std::string(option) +
" requires a value");
47 if constexpr (std::same_as<T, std::string>)
49 return std::string(valstr);
51 else if constexpr (std::is_integral_v<T>)
54 std::string s{valstr};
56 if constexpr (std::is_signed_v<T>)
58 long long tmp = std::stoll(s, &idx);
60 throw std::invalid_argument(
"invalid integer for " + std::string(option));
62 if (tmp < std::numeric_limits<T>::min() ||
63 tmp > std::numeric_limits<T>::max())
64 throw std::out_of_range(
"integer out of range for " + std::string(option));
66 return static_cast<T
>(tmp);
70 if (!s.empty() && s.front() ==
'-')
71 throw std::invalid_argument(
"invalid unsigned integer for " + std::string(option));
73 unsigned long long tmp = std::stoull(s, &idx);
75 throw std::invalid_argument(
"invalid unsigned integer for " + std::string(option));
77 if (tmp > std::numeric_limits<T>::max())
78 throw std::out_of_range(
"unsigned integer out of range for " + std::string(option));
80 return static_cast<T
>(tmp);
83 else if constexpr (std::is_floating_point_v<T>)
86 long double tmp = std::stold(std::string(valstr), &idx);
87 if (idx != valstr.size())
88 throw std::invalid_argument(
"invalid floating-point for " + std::string(option));
89 return static_cast<T
>(tmp);
93 static_assert(std::is_arithmetic_v<T> || std::same_as<T, std::string>,
94 "get_arg_value supports only arithmetic types or std::string");
103 for (
int i = 1; i < argc; ++i)
105 std::string_view arg = argv[i];
107 auto get_next_arg_if_needed = [&](std::string_view a) ->
const char *
109 return (a.find(
'=') == std::string_view::npos && i + 1 < argc)
114 if (arg.rfind(
"--warmup", 0) == 0)
116 auto w = get_arg_value<std::uint64_t>(arg, get_next_arg_if_needed(arg));
119 else if (arg.rfind(
"--iter", 0) == 0)
121 auto n = get_arg_value<std::uint64_t>(arg, get_next_arg_if_needed(arg));
124 else if (arg.rfind(
"--tolerance", 0) == 0)
126 auto tol = get_arg_value<long double>(arg, get_next_arg_if_needed(arg));