10#include <unordered_map>
25 : short_name(
std::move(short_name))
26 , long_name(
std::move(long_name))
27 , description(description)
32 virtual void parse(
const char **&argv)
const = 0;
42 template<is_invocable<T> Callback>
44 :
Option(
std::move(short_name),
std::move(long_name), description)
45 , callback(
std::forward<Callback>(callback))
48 void parse(
const char **&argv)
const override;
57 using options_t = std::vector<std::unique_ptr<const Option>>;
65 std::unordered_map<PooledString, std::reference_wrapper<const Option>>
key_map_;
67 std::size_t short_len_ = 0;
69 std::size_t long_len_ = 0;
83 template<
typename T, is_invocable<T> Callback>
84 void add(
const char *group_name,
const char *short_name,
const char *long_name,
const char *description,
88 if (group_name) pooled_group_name = pool_(group_name);
89 if (short_name) pooled_short_name = pool_(short_name);
90 if (long_name) pooled_long_name = pool_(long_name);
94 pooled_short_name, pooled_long_name, description, std::forward<Callback>(callback)
96 auto it = std::prev(
options.end());
99 auto res = key_map_.emplace(std::move(pooled_short_name), **it);
100 M_insist(res.second,
"name already in list");
101 short_len_ = std::max(short_len_, strlen(short_name));
105 auto res = key_map_.emplace(std::move(pooled_long_name), **it);
106 M_insist(res.second,
"name already in list");
107 long_len_ = std::max(long_len_, strlen(long_name));
118 template<
typename T, is_invocable<T> Callback>
119 void add(
const char *short_name,
const char *long_name,
const char *description, Callback &&callback) {
120 add<T>(
nullptr, short_name, long_name, description, std::forward<Callback>(callback));
124 void print_args(std::ostream &out)
const;
133 void parse_args(
int argc,
const char **argv);
140 void operator()(
int argc,
const char **argv) { parse_args(argc, argv); }
143 const std::vector<const char*> &
args()
const {
return args_; }
A parser for command line arguments.
std::unordered_map< PooledString, std::reference_wrapper< const Option > > key_map_
maps the option name to the option object
void print_args(std::ostream &out) const
Prints a list of all options to out.
void operator()(int argc, const char **argv)
Parses the arguments from argv.
void print_args() const
Prints a list of all options to std::cout.
StringPool pool_
pool of internalized strings
std::vector< const char * > args_
positional arguments
void add(const char *group_name, const char *short_name, const char *long_name, const char *description, Callback &&callback)
Adds a new group option to the ArgParser.
options_t general_options_
general options
const std::vector< const char * > & args() const
Returns all positional arguments.
std::unordered_map< PooledString, options_t > grouped_options_
group options
std::vector< std::unique_ptr< const Option > > options_t
options type
void add(const char *short_name, const char *long_name, const char *description, Callback &&callback)
Adds a new option to the ArgParser.
M_LCOV_EXCL_START std::ostream & operator<<(std::ostream &out, const PlanTableBase< Actual > &PT)
command-line options for the HeuristicSearchPlanEnumerator
std::function< void(T)> callback
OptionImpl(PooledOptionalString short_name, PooledOptionalString long_name, const char *description, Callback &&callback)
void parse(const char **&argv) const override
PooledOptionalString long_name
Option(PooledOptionalString short_name, PooledOptionalString long_name, const char *description)
PooledOptionalString short_name
virtual void parse(const char **&argv) const =0
A data type representing a pooled (or internalized) object.
Pooled< T, Pool, false > assert_not_none() const