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>
78 static_assert(!std::is_same<T, bool>::value,
"Boolean switch can't be required");
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>();
128 if (!arg.not_use_default)
129 semantic->default_value(arg.default_value);
136 auto semantic = boost::program_options::value<T>();
137 if (!arg.not_use_default) {
138 std::ostringstream format;
139 format << arg.depf(
false,
true, arg.default_value) <<
", "
140 << arg.depf(
true,
true, arg.default_value) <<
" if '"
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>();
151 if (!arg.not_use_default) {
152 std::array<bool, NUM_DEPS> depval;
154 std::ostringstream format;
155 format << arg.depf(depval,
true, arg.default_value);
156 for (
size_t i = 0; i < depval.size(); ++i)
160 format <<
", " << arg.depf(depval,
true, arg.default_value) <<
" if '" << arg.ref[i]->name <<
"'";
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>();
173 if (!arg.not_use_default)
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);
195 description.add_options()(arg.name,
make_semantic(arg), arg.description);
201 if (0 != description.find_nothrow(arg.name,
false))
203 CHECK_AND_ASSERT_MES(!unique,
void(),
"Argument already exists: " << arg.name);
207 description.add_options()(arg.name,
make_semantic(arg, def), arg.description);
212 if (0 != description.find_nothrow(arg.name,
false))
214 CHECK_AND_ASSERT_MES(!unique,
void(),
"Argument already exists: " << arg.name);
218 description.add_options()(arg.name, boost::program_options::bool_switch(), arg.description);
221 template<
typename charT>
222 boost::program_options::basic_parsed_options<charT>
parse_command_line(
int argc,
const charT*
const argv[],
223 const boost::program_options::options_description& desc,
bool allow_unregistered =
false)
225 auto parser = boost::program_options::command_line_parser(argc, argv);
226 parser.options(desc);
227 if (allow_unregistered)
229 parser.allow_unregistered();
241 catch (
const std::exception& e)
243 std::cerr <<
"Failed to parse arguments: " << e.what() << std::endl;
244 std::cerr << desc << std::endl;
249 std::cerr <<
"Failed to parse arguments: unknown exception" << std::endl;
250 std::cerr << desc << std::endl;
255 template<
typename T,
bool required,
bool dependent,
int NUM_DEPS>
259 return !
value.empty();
262 template<
typename T,
bool required,
bool dependent,
int NUM_DEPS>
265 return vm[arg.name].defaulted();
274 template<
typename T,
int NUM_DEPS>
277 std::array<bool, NUM_DEPS> depval;
278 for (
size_t i = 0; i < depval.size(); ++i)
283 template<
typename T,
bool required>
286 return vm[arg.name].template as<T>();
289 template<
bool dependent,
int NUM_DEPS>
296 extern const arg_descriptor<bool>
arg_help;
Definition command_line.cpp:37
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
const arg_descriptor< bool > arg_help
Definition command_line.cpp:74
bool is_no(const std::string &str)
Definition command_line.cpp:60
const arg_descriptor< bool > arg_version
Definition command_line.cpp:75
bool is_yes(const std::string &str)
Definition command_line.cpp:46
boost::program_options::typed_value< T, char > * make_semantic(const arg_descriptor< T, true > &)
Definition command_line.h:119
bool is_arg_defaulted(const boost::program_options::variables_map &vm, const arg_descriptor< T, required, dependent, NUM_DEPS > &arg)
Definition command_line.h:263
bool handle_error_helper(const boost::program_options::options_description &desc, F parser)
Definition command_line.h:235
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:256
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:222
T get_arg(const boost::program_options::variables_map &vm, const arg_descriptor< T, false, true > &arg)
Definition command_line.h:269
const GenericPointer< typename T::ValueType > T2 value
Definition pointer.h:1225
const char *const str
Definition portlistingparse.c:23
#define F(w, k)
Definition sha512-blocks.c:61
std::array< const arg_descriptor< bool, false > *, NUM_DEPS > ref
Definition command_line.h:112
bool not_use_default
Definition command_line.h:115
T value_type
Definition command_line.h:105
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 * description
Definition command_line.h:108
const char * name
Definition command_line.h:107
const arg_descriptor< bool, false > & ref
Definition command_line.h:96
T value_type
Definition command_line.h:89
T default_value
Definition command_line.h:94
const char * description
Definition command_line.h:92
bool not_use_default
Definition command_line.h:99
const char * name
Definition command_line.h:91
std::function< T(bool, bool, T)> depf
Definition command_line.h:97
const char * description
Definition command_line.h:61
T value_type
Definition command_line.h:58
const char * name
Definition command_line.h:60
bool not_use_default
Definition command_line.h:63
T default_value
Definition command_line.h:62
const char * name
Definition command_line.h:82
const char * description
Definition command_line.h:83
T value_type
Definition command_line.h:80
const char * description
Definition command_line.h:72
std::vector< T > value_type
Definition command_line.h:69
const char * name
Definition command_line.h:71
Definition command_line.h:53
randomx_vm * vm
Definition tests.cpp:20