mutable
A Database System for Research and Fast Prototyping
Loading...
Searching...
No Matches
ArgParser.hpp
Go to the documentation of this file.
1#pragma once
2
3
4#include <functional>
5#include <iostream>
6#include <memory>
10#include <unordered_map>
11#include <vector>
12
13
14namespace m {
15
19class M_EXPORT ArgParser
20{
21 /* Option for the ArgParser. */
22 struct Option
23 {
24 Option(PooledOptionalString short_name, PooledOptionalString long_name, const char *description)
25 : short_name(std::move(short_name))
26 , long_name(std::move(long_name))
27 , description(description)
28 { }
29
30 virtual ~Option() { }
31
32 virtual void parse(const char **&argv) const = 0;
33
36 const char *description;
37 };
38
39 template<typename T>
40 struct OptionImpl : public Option
41 {
42 template<is_invocable<T> Callback>
43 OptionImpl(PooledOptionalString short_name, PooledOptionalString long_name, const char* description, Callback &&callback)
44 : Option(std::move(short_name), std::move(long_name), description)
45 , callback(std::forward<Callback>(callback))
46 { }
47
48 void parse(const char **&argv) const override;
49
50 std::function<void(T)> callback;
51 };
52
53 private:
57 using options_t = std::vector<std::unique_ptr<const Option>>;
61 std::unordered_map<PooledString, options_t> grouped_options_;
63 std::vector<const char*> args_;
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;
70
71 public:
74
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,
85 Callback &&callback)
86 {
87 PooledOptionalString pooled_group_name, pooled_short_name, pooled_long_name;
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);
91
92 auto &options = group_name ? grouped_options_[pooled_group_name.assert_not_none()] : general_options_;
93 options.push_back(std::make_unique<const OptionImpl<T>>(
94 pooled_short_name, pooled_long_name, description, std::forward<Callback>(callback)
95 ));
96 auto it = std::prev(options.end());
97
98 if (short_name) {
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));
102 }
103
104 if (long_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));
108 }
109 }
110
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));
121 }
122
124 void print_args(std::ostream &out) const;
126 void print_args() const { print_args(std::cout); }
127
133 void parse_args(int argc, const char **argv);
134
140 void operator()(int argc, const char **argv) { parse_args(argc, argv); }
141
143 const std::vector<const char*> & args() const { return args_; }
144};
145
147inline std::ostream & operator<<(std::ostream &out, const ArgParser &AP)
148{
149 AP.print_args(out);
150 return out;
151}
153
154}
A parser for command line arguments.
Definition: ArgParser.hpp:20
std::unordered_map< PooledString, std::reference_wrapper< const Option > > key_map_
‍maps the option name to the option object
Definition: ArgParser.hpp:65
void print_args(std::ostream &out) const
Prints a list of all options to out.
Definition: ArgParser.cpp:158
void operator()(int argc, const char **argv)
Parses the arguments from argv.
Definition: ArgParser.hpp:140
void print_args() const
Prints a list of all options to std::cout.
Definition: ArgParser.hpp:126
StringPool pool_
‍pool of internalized strings
Definition: ArgParser.hpp:55
std::vector< const char * > args_
‍positional arguments
Definition: ArgParser.hpp:63
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.
Definition: ArgParser.hpp:84
options_t general_options_
‍general options
Definition: ArgParser.hpp:59
const std::vector< const char * > & args() const
Returns all positional arguments.
Definition: ArgParser.hpp:143
std::unordered_map< PooledString, options_t > grouped_options_
‍group options
Definition: ArgParser.hpp:61
std::vector< std::unique_ptr< const Option > > options_t
‍options type
Definition: ArgParser.hpp:57
void add(const char *short_name, const char *long_name, const char *description, Callback &&callback)
Adds a new option to the ArgParser.
Definition: ArgParser.hpp:119
#define M_insist(...)
Definition: macro.hpp:129
‍mutable namespace
Definition: Backend.hpp:10
M_LCOV_EXCL_START std::ostream & operator<<(std::ostream &out, const PlanTableBase< Actual > &PT)
Definition: PlanTable.hpp:401
‍command-line options for the HeuristicSearchPlanEnumerator
Definition: V8Engine.cpp:44
STL namespace.
std::function< void(T)> callback
Definition: ArgParser.hpp:50
OptionImpl(PooledOptionalString short_name, PooledOptionalString long_name, const char *description, Callback &&callback)
Definition: ArgParser.hpp:43
void parse(const char **&argv) const override
const char * description
Definition: ArgParser.hpp:36
PooledOptionalString long_name
Definition: ArgParser.hpp:35
Option(PooledOptionalString short_name, PooledOptionalString long_name, const char *description)
Definition: ArgParser.hpp:24
PooledOptionalString short_name
Definition: ArgParser.hpp:34
virtual void parse(const char **&argv) const =0
A data type representing a pooled (or internalized) object.
Definition: Pool.hpp:168
Pooled< T, Pool, false > assert_not_none() const
Definition: Pool.hpp:239