38 #include <type_traits> 40 #include <boost/program_options/parsers.hpp> 41 #include <boost/program_options/options_description.hpp> 42 #include <boost/program_options/variables_map.hpp> 53 template<
typename T,
bool required = false,
bool dependent = false,
int NUM_DEPS = 1>
98 std::function<T(bool, bool, T)>
depf;
103 template<
typename T,
int NUM_DEPS>
113 std::array<const arg_descriptor<bool, false> *, NUM_DEPS>
ref;
114 std::function<T(std::array<bool, NUM_DEPS>,
bool,
T)> depf;
122 return boost::program_options::value<T>()->required();
128 auto semantic = boost::program_options::value<T>();
137 auto semantic = boost::program_options::value<T>();
139 std::ostringstream format;
142 << arg.
ref.name <<
"'";
143 semantic->default_value(arg.
depf(arg.
ref.default_value,
true, arg.
default_value), format.str());
148 template<
typename T,
int NUM_DEPS>
151 auto semantic = boost::program_options::value<T>();
153 std::array<bool, NUM_DEPS> depval;
155 std::ostringstream format;
157 for (
size_t i = 0; i < depval.size(); ++i)
161 format <<
", " << arg.
depf(depval,
true, arg.
default_value) <<
" if '" << arg.
ref[i]->name <<
"'";
163 for (
size_t i = 0; i < depval.size(); ++i)
164 depval[i] = arg.
ref[i]->default_value;
165 semantic->default_value(arg.
depf(depval,
true, arg.
default_value), format.str());
173 auto semantic = boost::program_options::value<T>();
175 semantic->default_value(def);
182 auto semantic = boost::program_options::value< std::vector<T> >();
183 semantic->default_value(std::vector<T>(),
"");
187 template<
typename T,
bool required,
bool dependent,
int NUM_DEPS>
190 if (0 != description.find_nothrow(arg.name,
false))
196 description.add_options()(arg.name,
make_semantic(arg), arg.description);
202 if (0 != description.find_nothrow(arg.
name,
false))
214 if (0 != description.find_nothrow(arg.name,
false))
220 description.add_options()(arg.name, boost::program_options::bool_switch(), arg.description);
223 template<
typename charT>
224 boost::program_options::basic_parsed_options<charT>
parse_command_line(
int argc,
const charT*
const argv[],
225 const boost::program_options::options_description& desc,
bool allow_unregistered =
false)
227 auto parser = boost::program_options::command_line_parser(argc, argv);
228 parser.options(desc);
229 if (allow_unregistered)
231 parser.allow_unregistered();
243 catch (
const std::exception& e)
245 std::cerr <<
"Failed to parse arguments: " << e.what() << std::endl;
246 std::cerr << desc << std::endl;
251 std::cerr <<
"Failed to parse arguments: unknown exception" << std::endl;
252 std::cerr << desc << std::endl;
257 template<
typename T,
bool required,
bool dependent,
int NUM_DEPS>
260 auto value = vm[arg.name];
261 return !
value.empty();
264 template<
typename T,
bool required,
bool dependent,
int NUM_DEPS>
267 return vm[arg.name].defaulted();
276 template<
typename T,
int NUM_DEPS>
279 std::array<bool, NUM_DEPS> depval;
280 for (
size_t i = 0; i < depval.size(); ++i)
285 template<
typename T,
bool required>
288 return vm[arg.name].template as<T>();
291 template<
bool dependent,
int NUM_DEPS>
298 extern const arg_descriptor<bool>
arg_help;
bool is_no(const std::string &str)
#define CHECK_AND_ASSERT_MES(expr, fail_ret_val, message)
bool is_yes(const std::string &str)
const arg_descriptor< bool > arg_help
std::array< const arg_descriptor< bool, false > *, NUM_DEPS > ref
std::function< T(bool, bool, T)> depf
bool handle_error_helper(const boost::program_options::options_description &desc, F parser)
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)
boost::program_options::typed_value< T, char > * make_semantic(const arg_descriptor< T, true > &)
const arg_descriptor< bool, false > & ref
std::vector< T > value_type
void add_arg(boost::program_options::options_description &description, const arg_descriptor< T, required, dependent, NUM_DEPS > &arg, bool unique=true)
const GenericPointer< typename T::ValueType > T2 value
T get_arg(const boost::program_options::variables_map &vm, const arg_descriptor< T, false, true > &arg)
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)
const arg_descriptor< bool > arg_version
bool is_arg_defaulted(const boost::program_options::variables_map &vm, const arg_descriptor< T, required, dependent, NUM_DEPS > &arg)
std::function< T(std::array< bool, NUM_DEPS >, bool, T)> depf