Skip to content

Commit a9610ef

Browse files
committed
added long name
1 parent b12c27e commit a9610ef

2 files changed

Lines changed: 25 additions & 10 deletions

File tree

argparse.h

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,14 @@ class ArgumentParser {
4848
parse(argc, argv);
4949
}
5050

51+
void add_argument(const std::string &name, const std::string &long_name,
52+
const std::string &desc, const bool required = false) {
53+
_arguments.push_back({name, desc, required});
54+
_pairs[name] = long_name;
55+
}
56+
5157
void add_argument(const std::string &name, const std::string &desc,
52-
bool required = false) {
58+
const bool required = false) {
5359
_arguments.push_back({name, desc, required});
5460
}
5561

@@ -59,9 +65,11 @@ class ArgumentParser {
5965
std::cout << "Usage: " << f << " [options]" << std::endl;
6066
std::cout << "Options:" << std::endl;
6167
for (auto &a : _arguments) {
62-
std::cout << " " << std::setw(23) << std::left << a._name
63-
<< std::setw(23) << a._desc + (a._required ? " (Required)" : "")
64-
<< std::endl;
68+
std::string name = a._name;
69+
auto i = _pairs.find(name);
70+
if (i != _pairs.end()) name.append(", " + i->second);
71+
std::cout << " " << std::setw(23) << std::left << name << std::setw(23)
72+
<< a._desc + (a._required ? " (Required)" : "") << std::endl;
6573
}
6674
}
6775

@@ -101,7 +109,9 @@ class ArgumentParser {
101109
}
102110

103111
bool exists(const std::string &name) {
104-
return _variables.find(_delimit(name)) != _variables.end();
112+
std::string t = _delimit(name);
113+
if (_pairs.find(t) != _pairs.end()) t = _pairs[t];
114+
return _variables.find(t) != _variables.end();
105115
}
106116

107117
template <typename T>
@@ -134,14 +144,15 @@ class ArgumentParser {
134144
std::string _desc;
135145
bool _required;
136146
};
137-
inline bool _add_variable(std::string name,
147+
inline void _add_variable(std::string name,
138148
std::vector<std::string> &arg_parts, char *argv[]) {
139149
if (name == "h" || name == "-help") {
140150
_help = true;
141151
print_help(argv[0]);
142152
}
143153
_ltrim(name, [](int c) { return c != (int)'-'; });
144154
name = _delimit(name);
155+
if (_pairs.find(name) != _pairs.end()) name = _pairs[name];
145156
std::string val;
146157
if (arg_parts.size() > 1) {
147158
val = std::accumulate(arg_parts.begin() + 1, arg_parts.end(),
@@ -207,14 +218,17 @@ class ArgumentParser {
207218
return s;
208219
}
209220

210-
bool _help;
211221
std::string _desc;
222+
bool _help;
212223
std::vector<Argument> _arguments;
213224
std::unordered_map<std::string, std::string> _variables;
225+
std::unordered_map<std::string, std::string> _pairs;
214226
};
215227
template <>
216228
inline std::string ArgumentParser::get<std::string>(const std::string &name) {
217-
auto v = _variables.find(_delimit(name));
229+
std::string t = _delimit(name);
230+
if (_pairs.find(t) != _pairs.end()) t = _pairs[t];
231+
auto v = _variables.find(t);
218232
if (v != _variables.end()) return v->second;
219233
return "";
220234
}

example.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ int main(int argc, char* argv[]) {
2626
parser.add_argument("-f", "an combined flag", true);
2727
parser.add_argument("--flag", "a flag");
2828
parser.add_argument("-v", "a vector", true);
29+
parser.add_argument("-l", "--long", "a long argument", false);
2930
try {
3031
parser.parse(argc, argv);
3132
} catch (const ArgumentParser::ArgumentNotFound& ex) {
@@ -34,8 +35,8 @@ int main(int argc, char* argv[]) {
3435
}
3536
if (parser.is_help()) return 0;
3637
std::cout << parser.get<int>("a") << std::endl;
37-
std::cout << (parser.get<bool>("flag") ? "true" : "false") << std::endl;
38-
std::cout << (parser.get<bool>("d") ? "true" : "false") << std::endl;
38+
std::cout << std::boolalpha << parser.get<bool>("flag") << std::endl;
39+
std::cout << std::boolalpha << parser.get<bool>("d") << std::endl;
3940
auto v = parser.getv<double>("v");
4041
std::copy(v.begin(), v.end(), std::ostream_iterator<double>(std::cout, " "));
4142
if (v.size()) std::cout << std::endl;

0 commit comments

Comments
 (0)