37 #include <type_traits> 39 #include <boost/program_options/parsers.hpp> 40 #include <boost/program_options/options_description.hpp> 41 #include <boost/program_options/variables_map.hpp> 52 template<
typename T,
bool required = false,
bool dependent = false,
int NUM_DEPS = 1>
97 std::function<T(bool, bool, T)>
depf;
102 template<
typename T,
int NUM_DEPS>
112 std::array<const arg_descriptor<bool, false> *, NUM_DEPS>
ref;
113 std::function<T(std::array<bool, NUM_DEPS>,
bool,
T)> depf;
121 return boost::program_options::value<T>()->required();
127 auto semantic = boost::program_options::value<T>();
136 auto semantic = boost::program_options::value<T>();
138 std::ostringstream format;
141 << arg.
ref.name <<
"'";
142 semantic->default_value(arg.
depf(arg.
ref.default_value,
true, arg.
default_value), format.str());
147 template<
typename T,
int NUM_DEPS>
150 auto semantic = boost::program_options::value<T>();
152 std::array<bool, NUM_DEPS> depval;
154 std::ostringstream format;
156 for (
size_t i = 0;
i < depval.size(); ++
i)
162 for (
size_t i = 0;
i < depval.size(); ++
i)
163 depval[
i] = arg.
ref[
i]->default_value;
164 semantic->default_value(arg.
depf(depval,
true, arg.
default_value), format.str());
172 auto semantic = boost::program_options::value<T>();
174 semantic->default_value(def);
181 auto semantic = boost::program_options::value< std::vector<T> >();
182 semantic->default_value(std::vector<T>(),
"");
186 template<
typename T,
bool required,
bool dependent,
int NUM_DEPS>
189 if (0 !=
description.find_nothrow(arg.name,
false))
191 CHECK_AND_ASSERT_MES(!unique,
void(),
"Argument already exists: " << arg.name);
203 CHECK_AND_ASSERT_MES(!unique,
void(),
"Argument already exists: " << arg.
name);
213 if (0 !=
description.find_nothrow(arg.name,
false))
215 CHECK_AND_ASSERT_MES(!unique,
void(),
"Argument already exists: " << arg.name);
219 description.add_options()(arg.name, boost::program_options::bool_switch(), arg.description);
222 template<
typename charT>
223 boost::program_options::basic_parsed_options<charT>
parse_command_line(
int argc,
const charT*
const argv[],
224 const boost::program_options::options_description&
desc,
bool allow_unregistered =
false)
226 auto parser = boost::program_options::command_line_parser(argc, argv);
228 if (allow_unregistered)
230 parser.allow_unregistered();
242 catch (
const std::exception&
e)
244 std::cerr <<
"Failed to parse arguments: " <<
e.what() << std::endl;
245 std::cerr <<
desc << std::endl;
250 std::cerr <<
"Failed to parse arguments: unknown exception" << std::endl;
251 std::cerr <<
desc << std::endl;
256 template<
typename T,
bool required,
bool dependent,
int NUM_DEPS>
260 return !
value.empty();
263 template<
typename T,
bool required,
bool dependent,
int NUM_DEPS>
266 return vm[arg.name].defaulted();
275 template<
typename T,
int NUM_DEPS>
278 std::array<bool, NUM_DEPS> depval;
279 for (
size_t i = 0;
i < depval.size(); ++
i)
284 template<
typename T,
bool required>
287 return vm[arg.name].template as<T>();
290 template<
bool dependent,
int NUM_DEPS>
297 extern const arg_descriptor<bool>
arg_help;
std::array< const arg_descriptor< bool, false > *, NUM_DEPS > ref
Definition: command_line.h:112
description
Definition: setupmingw32.py:29
bool is_no(const std::string &str)
Definition: command_line.cpp:60
T value_type
Definition: command_line.h:58
const uint32_t T[512]
Definition: groestl_tables.h:36
const arg_descriptor< bool, false > & ref
Definition: command_line.h:96
int i
Definition: pymoduletest.py:23
::std::string string
Definition: gtest-port.h:1097
#define F(w, k)
Definition: sha512-blocks.c:61
Definition: command_line.h:103
const char * description
Definition: command_line.h:61
bool not_use_default
Definition: command_line.h:63
bool is_yes(const std::string &str)
Definition: command_line.cpp:46
const char * description
Definition: command_line.h:83
const char * description
Definition: command_line.h:72
int type
Definition: superscalar.cpp:50
const arg_descriptor< bool > arg_help
Definition: command_line.cpp:74
const char * description
Definition: command_line.h:92
bool not_use_default
Definition: command_line.h:99
Definition: command_line.h:87
desc
Definition: pymoduletest.py:79
const char * name
Definition: command_line.h:60
std::function< T(std::array< bool, NUM_DEPS >, bool, T)> depf
Definition: command_line.h:113
T default_value
Definition: command_line.h:110
const char * name
Definition: command_line.h:71
e
Definition: pymoduletest.py:79
std::function< T(bool, bool, T)> depf
Definition: command_line.h:97
const char * description
Definition: command_line.h:108
bool not_use_default
Definition: command_line.h:115
const char * name
Definition: command_line.h:82
bool handle_error_helper(const boost::program_options::options_description &desc, F parser)
Definition: command_line.h:236
std::enable_if<!std::is_same< T, bool >::value, bool >::type has_arg(const boost::program_options::variables_map &vm, const arg_descriptor< T, required, dependent, NUM_DEPS > &arg)
Definition: command_line.h:257
boost::program_options::typed_value< T, char > * make_semantic(const arg_descriptor< T, true > &)
Definition: command_line.h:119
T default_value
Definition: command_line.h:94
#define false
Definition: stdbool.h:37
T value_type
Definition: command_line.h:105
Definition: command_line.cpp:36
void add_arg(boost::program_options::options_description &description, const arg_descriptor< T, required, dependent, NUM_DEPS > &arg, bool unique=true)
Definition: command_line.h:187
T value_type
Definition: command_line.h:89
const char *const str
Definition: portlistingparse.c:23
const char * name
Definition: command_line.h:107
randomx_vm * vm
Definition: tests.cpp:20
parser
Definition: pymoduletest.py:14
const GenericPointer< typename T::ValueType > T2 value
Definition: pointer.h:1225
T get_arg(const boost::program_options::variables_map &vm, const arg_descriptor< T, false, true > &arg)
Definition: command_line.h:270
boost::program_options::basic_parsed_options< charT > parse_command_line(int argc, const charT *const argv[], const boost::program_options::options_description &desc, bool allow_unregistered=false)
Definition: command_line.h:223
int bool
Definition: stdbool.h:35
T value_type
Definition: command_line.h:78
Definition: command_line.h:76
const char * name
Definition: command_line.h:91
Definition: command_line.h:53
const arg_descriptor< bool > arg_version
Definition: command_line.cpp:75
std::vector< T > value_type
Definition: command_line.h:69
#define true
Definition: stdbool.h:36
bool is_arg_defaulted(const boost::program_options::variables_map &vm, const arg_descriptor< T, required, dependent, NUM_DEPS > &arg)
Definition: command_line.h:264
T default_value
Definition: command_line.h:62
Definition: command_line.h:56