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>
43 #include "include_base_utils.h"
49 bool is_yes(
const std::string& str);
51 bool is_no(
const std::string& str);
53 template<
typename T,
bool required = false,
bool dependent = false,
int NUM_DEPS = 1>
79 static_assert(!std::is_same<T, bool>::value,
"Boolean switch can't be required");
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))
192 CHECK_AND_ASSERT_MES(!unique,
void(),
"Argument already exists: " << arg.name);
196 description.add_options()(arg.name,
make_semantic(arg), arg.description);
202 if (0 != description.find_nothrow(arg.
name,
false))
204 CHECK_AND_ASSERT_MES(!unique,
void(),
"Argument already exists: " << arg.
name);
214 if (0 != description.find_nothrow(arg.name,
false))
216 CHECK_AND_ASSERT_MES(!unique,
void(),
"Argument already exists: " << arg.name);
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);
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;
const uint32_t T[512]
Definition: groestl_tables.h:37
parser
Definition: build_protob.py:8
Definition: command_line.cpp:39
boost::program_options::typed_value< T, char > * make_semantic(const arg_descriptor< T, true > &)
Definition: command_line.h:120
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:224
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:188
const arg_descriptor< bool > arg_help
Definition: command_line.cpp:76
bool is_no(const std::string &str)
Definition: command_line.cpp:62
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:258
const arg_descriptor< bool > arg_version
Definition: command_line.cpp:77
bool is_yes(const std::string &str)
Definition: command_line.cpp:48
bool is_arg_defaulted(const boost::program_options::variables_map &vm, const arg_descriptor< T, required, dependent, NUM_DEPS > &arg)
Definition: command_line.h:265
bool handle_error_helper(const boost::program_options::options_description &desc, F parser)
Definition: command_line.h:237
T get_arg(const boost::program_options::variables_map &vm, const arg_descriptor< T, false, true > &arg)
Definition: command_line.h:271
Definition: blockchain_ancestry.cpp:73
#define F(w, k)
Definition: sha512-blocks.c:61
#define true
Definition: stdbool.h:37
#define false
Definition: stdbool.h:38
Definition: command_line.h:105
std::array< const arg_descriptor< bool, false > *, NUM_DEPS > ref
Definition: command_line.h:113
bool not_use_default
Definition: command_line.h:116
T value_type
Definition: command_line.h:106
std::function< T(std::array< bool, NUM_DEPS >, bool, T)> depf
Definition: command_line.h:114
T default_value
Definition: command_line.h:111
const char * description
Definition: command_line.h:109
const char * name
Definition: command_line.h:108
Definition: command_line.h:89
const arg_descriptor< bool, false > & ref
Definition: command_line.h:97
T value_type
Definition: command_line.h:90
T default_value
Definition: command_line.h:95
const char * description
Definition: command_line.h:93
bool not_use_default
Definition: command_line.h:100
const char * name
Definition: command_line.h:92
std::function< T(bool, bool, T)> depf
Definition: command_line.h:98
Definition: command_line.h:58
const char * description
Definition: command_line.h:62
T value_type
Definition: command_line.h:59
const char * name
Definition: command_line.h:61
bool not_use_default
Definition: command_line.h:64
T default_value
Definition: command_line.h:63
Definition: command_line.h:78
const char * name
Definition: command_line.h:83
const char * description
Definition: command_line.h:84
T value_type
Definition: command_line.h:79
const char * description
Definition: command_line.h:73
std::vector< T > value_type
Definition: command_line.h:70
const char * name
Definition: command_line.h:72
Definition: command_line.h:54