Mercurial > code
annotate cpp/options/options.hpp @ 658:868663a44b5e
options: use std::string_view::compare for better readability
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 15 Jul 2019 20:58:11 +0200 |
parents | 11fa64b69530 |
children | 913c8ef054d3 |
rev | line source |
---|---|
657
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * options.hpp -- getopt(3) similar interface for C++ |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2019 David Demelier <markand@malikania.fr> |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #ifndef OPTIONS_HPP |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #define OPTIONS_HPP |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 /** |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 * \file options.hpp |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 * \brief C++ alternative to getopt(3). |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 */ |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 #include <stdexcept> |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 #include <string> |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 #include <string_view> |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 #include <tuple> |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 #include <unordered_map> |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 #include <vector> |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 /** |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 * \brief C++ alternative to getopt(3). |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 */ |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 namespace options { |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 /** |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 * Store the positional arguments and options. |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 */ |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 using pack = std::tuple< |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 std::vector<std::string>, |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 std::unordered_multimap<char, std::string> |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 >; |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 /** |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 * Parse a collection of options and arguments. |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 * |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 * This function uses the same format as getopt(3) function, you need specify |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 * each option in the fmt string and add a colon after the option character if |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 * it requires a value. |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 * |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 * If a -- option appears in the argument list, it stops option parsing and all |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 * next tokens are considered arguments even if they start with an hyphen. |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 * |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 * Example of format strings: |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 * |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 * - "abc": are all three boolean options, |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 * - "c:v": v is a boolean option c requires a value. |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 * |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 * Example of invocation: |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 * |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 * - `mycli -v -a`: is similar to `-va` if both 'v' and 'a' are boolean options, |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 * - `mycli -v -- -c`: -c will be a positional argument rather than an option |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 * but '-v' is still an option. |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 * |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 * \tparam InputIt must dereference a string type (literal, std::string_view or |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 * std::string) |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 * \param it the first item |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 * \param end the next item |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 * \param fmt the format string |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 * \return the result |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 */ |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 template <typename InputIt> |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 inline auto parse(InputIt it, InputIt end, std::string_view fmt) -> pack |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 { |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 pack result; |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 for (; it != end; ++it) { |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 const std::string_view token(*it); |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 if (token == "--") { |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 for (++it; it != end; ++it) |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 std::get<0>(result).push_back(std::string(*it)); |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 break; |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 } |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 |
658
868663a44b5e
options: use std::string_view::compare for better readability
David Demelier <markand@malikania.fr>
parents:
657
diff
changeset
|
89 if (token.compare(0, 1, "-") != 0) { |
657
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 std::get<0>(result).push_back(std::string(token)); |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 continue; |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 } |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 const auto sub = it->substr(1); |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 for (std::size_t i = 0U; i < sub.size(); ++i) { |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 const auto idx = fmt.find(sub[i]); |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 if (idx == std::string_view::npos) |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 throw std::runtime_error("invalid option"); |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 |
658
868663a44b5e
options: use std::string_view::compare for better readability
David Demelier <markand@malikania.fr>
parents:
657
diff
changeset
|
102 if (fmt.compare(idx + 1U, 1, ":") != 0) { |
657
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 std::get<1>(result).emplace(sub[i], ""); |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
104 continue; |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 } |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 if (idx + 1U < sub.size()) { |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 std::get<1>(result).emplace(sub[i], std::string(sub.substr(i + 1))); |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 break; |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
110 } |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
111 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
112 if (++it == end || std::string_view(*it).compare(0U, 1U, "-") == 0) |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
113 throw std::runtime_error("option require a value"); |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 std::get<1>(result).emplace(sub[i], std::string(*it)); |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 } |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 } |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 return result; |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 } |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 /** |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
123 * Convenient overload with an initializer_list. |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 * |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
125 * \tparam StringType must be either a std::string or std::string_view |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 * \param args the arguments |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
127 * \param fmt the format string |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 * \return the result |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
129 */ |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 inline auto parse(std::initializer_list<std::string_view> args, std::string_view fmt) -> pack |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
131 { |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
132 return parse(args.begin(), args.end(), fmt); |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
133 } |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
134 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
135 /** |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
136 * Convenient overload for main() arguments. |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
137 * |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
138 * \param argc the number of arguments |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
139 * \param argv the arguments |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
140 * \param fmt the format string |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
141 * \return the result |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
142 */ |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
143 inline auto parse(int argc, char** argv, std::string_view fmt) -> pack |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
144 { |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
145 std::vector<std::string_view> args(argc); |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
146 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
147 for (int i = 0; i < argc; ++i) |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
148 args[i] = argv[i]; |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
149 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
150 return parse(args.begin(), args.end(), fmt); |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
151 } |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
152 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
153 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
154 } // !options |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
155 |
11fa64b69530
options: reintroduce a very basic getopt(3) alternative
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
156 #endif // !OPTIONS_HPP |