9#include <kernel/util/string.hpp>
10#include <kernel/util/string_mapped.hpp>
147 std::map<String, std::pair<int, std::deque<String> > >
_opts;
166 for(
int i(0); i < argc; ++i)
178 return int(
_args.size());
202 if((i < 0) || (i >=
int(
_args.size())))
204 return _args.at(std::size_t(i));
212 std::deque<String> dsa;
214 dsa.push_back(
_args.at(i));
274 s += (double_newline ?
"\n\n" :
"\n");
275 s +=
"--" + it->first +
" " + it->second;
294 std::deque<std::pair<int,String> > result;
297 for(
auto it =
_opts.begin(); it !=
_opts.end(); ++it)
301 int idx = it->second.first;
311 result.push_back(std::make_pair(idx, name));
331 auto it =
_opts.find(option);
332 if(it ==
_opts.end())
334 return int(it->second.second.size());
356 const std::pair<int, std::deque<String> >*
query(
const String& option)
const
358 auto it =
_opts.find(option);
359 if(it ==
_opts.end())
361 return &(it->second);
383 template<
typename... Prms_>
387 auto it =
_opts.find(option);
388 if(it ==
_opts.end())
392 return _parse(it->second, std::size_t(0), std::forward<Prms_>(prms)...);
407 template<
typename T_>
410 T_ val(default_value);
411 return parse(option, val) == 1 ? val : default_value;
419 auto opt =
_opts.end();
425 for(
int i(1); i < int(
_args.size()); ++i)
431 if((arg.size() > std::size_t(1)) && (arg[0] ==
'-') && (arg[1] ==
'-'))
437 auto ik =
_opts.insert(std::make_pair(optname, std::make_pair(i, std::deque<String>())));
444 opt->second.first = i;
445 opt->second.second.clear();
448 else if(opt !=
_opts.end())
451 opt->second.second.push_back(arg);
461 template<
typename Prm_>
462 int _parse_prm(
const std::pair<
int,std::deque<String> >& isd, std::size_t offset, Prm_&& prm)
const
465 if(offset >= isd.second.size())
469 if(isd.second.at(offset).parse(std::forward<Prm_>(prm)))
472 return -isd.first - int(offset) - 1;
476 template<
typename ValueType_>
477 int _parse_prm(
const std::pair<
int,std::deque<String> >& isd, std::size_t offset, StringMapped<ValueType_>&& prm)
const
480 if(offset >= isd.second.size())
484 if(prm.lookup(isd.second.at(offset)))
487 return -isd.first - int(offset) - 1;
490 template<
typename Prm1_>
491 int _parse(
const std::pair<
int,std::deque<String> >& isd, std::size_t offset, Prm1_&& prm1)
const
493 int rtn = _parse_prm(isd, offset, std::forward<Prm1_>(prm1));
497 return int(offset) + 1;
511 template<
typename Prm1_,
typename... Prms_>
512 int _parse(
const std::pair<
int,std::deque<String> >& isd, std::size_t offset, Prm1_&& prm1, Prms_&&... prms)
const
514 int rtn = _parse_prm(isd, offset, std::forward<Prm1_>(prm1));
518 return _parse(isd, ++offset, std::forward<Prms_>(prms)...);
Simple argument parser implementation.
SimpleArgParser(int argc, const char *const *const argv)
Constructor.
std::map< String, String > _supported
supported option set
std::deque< String > _args
command line arguments
int num_skipped_args() const
Returns the number of arguments skipped by the parser.
int check(const String &option) const
Checks whether an option was given.
std::map< String, std::pair< int, std::deque< String > > > _opts
option-parameter map
T_ parse_default(const String &option, T_ default_value) const
Parses a single parameter of an option and returns it or, if not given, a default value.
String get_supported_help(bool double_newline=true) const
Returns a string of all supported options and their help strings.
String get_arg(int i) const
Returns an argument.
std::deque< String > skipped_args() const
Returns a deque of all arguments skipped by the parser.
const std::pair< int, std::deque< String > > * query(const String &option) const
Query the parameters of an option.
std::deque< std::pair< int, String > > query_unsupported() const
Queries all unsupported options passed in the command line.
void support(const String &option, const String &description=String())
Adds an option to the set of supported options.
int parse(const String &option, Prms_ &&... prms) const
Parses the parameters of an option.
int _num_skipped_args
number of skipped arguments
int num_args() const
Returns the total number of arguments passed in the constructor.
String class implementation.
bool starts_with(const String &head) const
Checks whether this string starts with another string.
String trim(const String &charset) const
Trims the string.