Joedb 10.0.0
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 <string_view>
5#include <vector>
6#include <ostream>
7#include <sstream>
8
9namespace joedb
10{
11 /// Class for conveniently parsing command-line arguments
12 ///
13 /// All strings passed as input to this class are zero-terminated, so all
14 /// the std::string_view returned by member functions are zero-terminated.
15 /// This way, it is safe to use view.data() as zero-terminated string.
16 ///
17 /// @ingroup ui
19 {
20 private:
21 const int argc;
22 const char * const * const argv;
23
24 struct Argument
25 {
26 std::string_view s;
27 std::string_view option;
28 bool used;
29
30 Argument(const char *argv);
31 };
32
33 std::vector<Argument> args;
34 int index = 1;
35 bool missing_arg = false;
36
37 struct Option
38 {
39 std::string_view name;
40 std::string_view parameter;
41 const std::vector<const char *> *labels = nullptr;
42 const size_t default_index = 0;
43
44 Option(std::string_view parameter):
45 parameter(parameter)
46 {
47 }
48
49 Option(std::string_view name, std::string_view parameter):
50 name(name),
51 parameter(parameter)
52 {
53 }
54
55 Option
56 (
57 std::string_view name,
58 const std::vector<const char *> &labels,
59 size_t default_index
60 ):
61 name(name),
62 labels(&labels),
63 default_index(default_index)
64 {
65 }
66 };
67
68 std::vector<Option> options;
69
70 void update_index();
71 std::string_view use_index();
72
73 public:
74 Arguments(int argc, const char * const *argv);
75
76 bool has_flag(const char * name);
77
78 std::string_view get_string_option
79 (
80 const char * name,
81 const char * description,
82 const char * default_string
83 );
84
85 size_t get_enum_option
86 (
87 const char * name,
88 const std::vector<const char *> &labels,
89 size_t default_index
90 );
91
92 template<typename T> T get_option
93 (
94 const char * name,
95 const char * description,
96 T default_value
97 )
98 {
99 options.emplace_back(name, description);
100
101 for (size_t i = 0; i < args.size() - 1; i++)
102 {
103 if (args[i].option == name)
104 {
105 args[i].used = true;
106 args[i + 1].used = true;
107 update_index();
108 T result{};
109 std::istringstream(args[i + 1].s.data()) >> result;
110 return result;
111 }
112 }
113 return default_value;
114 }
115
116 std::string_view get_next();
117 std::string_view get_next(const char * parameter);
118 bool peek(const char *s);
119 void add_parameter(const char * parameter);
120 std::ostream &print_help(std::ostream &out) const;
121
122 int get_remaining_count() const {return int(args.size() - index);}
123 int get_index() const {return int(index);}
124 bool missing() const {return missing_arg;}
125 size_t size() const {return args.size();}
126 std::string_view operator[](size_t i) const {return args[i].s;}
127 };
128}
129
130#endif
Class for conveniently parsing command-line arguments.
Definition Arguments.h:19
bool peek(const char *s)
std::string_view operator[](size_t i) const
Definition Arguments.h:126
size_t size() const
Definition Arguments.h:125
bool missing() const
Definition Arguments.h:124
size_t get_enum_option(const char *name, const std::vector< const char * > &labels, size_t default_index)
Definition Arguments.cpp:77
std::string_view get_next()
std::string_view get_string_option(const char *name, const char *description, const char *default_string)
Definition Arguments.cpp:54
int get_index() const
Definition Arguments.h:123
int get_remaining_count() const
Definition Arguments.h:122
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:93
std::ostream & print_help(std::ostream &out) const
void add_parameter(const char *parameter)
Definition Blob.h:7