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> 42 #include "include_base_utils.h" 48 bool is_yes(
const std::string& str);
50 bool is_no(
const std::string& str);
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>();
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)
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>();
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);
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);
227 parser.options(desc);
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>
259 auto value = vm[arg.name];
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
bool is_no(const std::string &str)
Definition: command_line.cpp:63
T value_type
Definition: command_line.h:58
const uint32_t T[512]
Definition: groestl_tables.h:33
const arg_descriptor< bool, false > & ref
Definition: command_line.h:96
#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:49
const char * description
Definition: command_line.h:83
const char * description
Definition: command_line.h:72
Definition: blockchain_ancestry.cpp:70
const arg_descriptor< bool > arg_help
Definition: command_line.cpp:77
const char * description
Definition: command_line.h:92
bool not_use_default
Definition: command_line.h:99
Definition: command_line.h:87
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
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:39
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 * name
Definition: command_line.h:107
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:78
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