Joedb 10.4.3
The Journal-Only Embedded Database
Loading...
Searching...
No Matches
Arguments.h
Go to the documentation of this file.
1#ifndef joedb_Arguments_declared
2#define joedb_Arguments_declared
3
4#include "external/cstring_view.hpp"
5
6#include <vector>
7#include <ostream>
8#include <sstream>
9
10namespace joedb
11{
12 /// Class for conveniently parsing command-line arguments
13 ///
14 /// @ingroup ui
16 {
17 private:
18 const int argc;
19 const char * const * const argv;
20
21 struct Argument
22 {
23 beman::cstring_view s;
24 beman::cstring_view option;
25 bool used;
26
27 Argument(const char *argv);
28 };
29
30 std::vector<Argument> args;
31 int index = 1;
32 bool missing_arg = false;
33
34 struct Option
35 {
36 beman::cstring_view name;
37 beman::cstring_view parameter;
38 const std::vector<const char *> *labels = nullptr;
39 const size_t default_index = 0;
40
41 Option(beman::cstring_view parameter):
42 parameter(parameter)
43 {
44 }
45
46 Option(beman::cstring_view name, beman::cstring_view parameter):
47 name(name),
48 parameter(parameter)
49 {
50 }
51
52 Option
53 (
54 beman::cstring_view name,
55 const std::vector<const char *> &labels,
56 size_t default_index
57 ):
58 name(name),
59 labels(&labels),
60 default_index(default_index)
61 {
62 }
63 };
64
65 std::vector<Option> options;
66
67 void update_index();
68 beman::cstring_view use_index();
69
70 public:
71 Arguments(int argc, const char * const *argv);
72 Arguments(): Arguments(0, nullptr) {missing_arg = true;}
73
74 bool has_flag(const char * name);
75
76 beman::cstring_view get_string_option
77 (
78 const char * name,
79 const char * description,
80 const char * default_string
81 );
82
83 size_t get_enum_option
84 (
85 const char * name,
86 const std::vector<const char *> &labels,
87 size_t default_index
88 );
89
90 template<typename T> T get_option
91 (
92 const char * name,
93 const char * description,
94 T default_value
95 )
96 {
97 options.emplace_back(name, description);
98
99 for (size_t i = 0; i < args.size() - 1; i++)
100 {
101 if (args[i].option == name)
102 {
103 args[i].used = true;
104 args[i + 1].used = true;
105 update_index();
106 T result{};
107
108 if constexpr (std::is_same<T, std::string>::value || std::is_same<T, beman::cstring_view>::value)
109 result = args[i + 1].s;
110 else
111 std::istringstream(args[i + 1].s.c_str()) >> result;
112
113 return result;
114 }
115 }
116 return default_value;
117 }
118
119 template<typename T = beman::cstring_view> T next_option
120 (
121 const char * name,
122 const char * description,
123 T default_value
124 )
125 {
126 options.emplace_back(name, description);
127
128 if (index < argc && args[index].option == name)
129 {
130 use_index();
131 if (index < argc)
132 {
133 T result{};
134
135 if constexpr (std::is_same<T, std::string>::value || std::is_same<T, beman::cstring_view>::value)
136 result = args[index].s;
137 else
138 std::istringstream(args[index].s.c_str()) >> result;
139
140 use_index();
141 return result;
142 }
143 }
144
145 return default_value;
146 }
147
148 beman::cstring_view get_next();
149 beman::cstring_view get_next(const char * parameter);
150 bool peek(beman::cstring_view s);
151 void add_parameter(const char * parameter);
152 std::ostream &print_help(std::ostream &out) const;
153 bool has_error() const {return missing() || get_remaining_count();}
154
155 int get_remaining_count() const {return int(args.size() - index);}
156 int get_index() const {return int(index);}
157 bool missing() const {return missing_arg;}
158 size_t size() const {return args.size();}
159 beman::cstring_view operator[](size_t i) const {return args[i].s;}
160 };
161}
162
163#endif
Class for conveniently parsing command-line arguments.
Definition Arguments.h:16
size_t size() const
Definition Arguments.h:158
bool missing() const
Definition Arguments.h:157
beman::cstring_view operator[](size_t i) const
Definition Arguments.h:159
size_t get_enum_option(const char *name, const std::vector< const char * > &labels, size_t default_index)
Definition Arguments.cpp:77
T next_option(const char *name, const char *description, T default_value)
Definition Arguments.h:120
int get_index() const
Definition Arguments.h:156
int get_remaining_count() const
Definition Arguments.h:155
bool has_flag(const char *name)
Definition Arguments.cpp:36
T get_option(const char *name, const char *description, T default_value)
Definition Arguments.h:91
beman::cstring_view get_next()
std::ostream & print_help(std::ostream &out) const
bool has_error() const
Definition Arguments.h:153
bool peek(beman::cstring_view s)
void add_parameter(const char *parameter)
beman::cstring_view get_string_option(const char *name, const char *description, const char *default_string)
Definition Arguments.cpp:54