Joedb 10.4.1
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
73 bool has_flag(const char * name);
74
75 beman::cstring_view get_string_option
76 (
77 const char * name,
78 const char * description,
79 const char * default_string
80 );
81
82 size_t get_enum_option
83 (
84 const char * name,
85 const std::vector<const char *> &labels,
86 size_t default_index
87 );
88
89 template<typename T> T get_option
90 (
91 const char * name,
92 const char * description,
93 T default_value
94 )
95 {
96 options.emplace_back(name, description);
97
98 for (size_t i = 0; i < args.size() - 1; i++)
99 {
100 if (args[i].option == name)
101 {
102 args[i].used = true;
103 args[i + 1].used = true;
104 update_index();
105 T result{};
106 std::istringstream(args[i + 1].s.c_str()) >> result;
107 return result;
108 }
109 }
110 return default_value;
111 }
112
113 template<typename T> T next_option
114 (
115 const char * name,
116 const char * description,
117 T default_value
118 )
119 {
120 if (index < argc && args[index].option == name)
121 {
122 use_index();
123 if (index < argc)
124 {
125 T result{};
126 std::istringstream(args[index].s.c_str()) >> result;
127 use_index();
128 return result;
129 }
130 }
131
132 return default_value;
133 }
134
135 beman::cstring_view get_next();
136 beman::cstring_view get_next(const char * parameter);
137 bool peek(beman::cstring_view s);
138 void add_parameter(const char * parameter);
139 std::ostream &print_help(std::ostream &out) const;
140 bool has_error() const {return missing() || get_remaining_count();}
141
142 int get_remaining_count() const {return int(args.size() - index);}
143 int get_index() const {return int(index);}
144 bool missing() const {return missing_arg;}
145 size_t size() const {return args.size();}
146 beman::cstring_view operator[](size_t i) const {return args[i].s;}
147 };
148}
149
150#endif
Class for conveniently parsing command-line arguments.
Definition Arguments.h:16
size_t size() const
Definition Arguments.h:145
bool missing() const
Definition Arguments.h:144
beman::cstring_view operator[](size_t i) const
Definition Arguments.h:146
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:114
int get_index() const
Definition Arguments.h:143
int get_remaining_count() const
Definition Arguments.h:142
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:90
beman::cstring_view get_next()
std::ostream & print_help(std::ostream &out) const
bool has_error() const
Definition Arguments.h:140
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