remove unnecessary friend decls in argparse

master
Daniel Kolesa 2017-05-17 20:07:25 +02:00
parent 43a0422786
commit 4ac173901a
1 changed files with 40 additions and 40 deletions

View File

@ -51,17 +51,7 @@ enum class arg_value {
REST REST
}; };
template<typename HelpFormatter>
struct basic_arg_parser;
struct arg_description_container;
struct default_help_formatter;
struct arg_description { struct arg_description {
template<typename HelpFormatter>
friend struct basic_arg_parser;
friend struct arg_description_container;
friend struct default_help_formatter;
virtual ~arg_description() {} virtual ~arg_description() {}
virtual arg_type type() const = 0; virtual arg_type type() const = 0;
@ -73,16 +63,15 @@ protected:
}; };
struct arg_argument: arg_description { struct arg_argument: arg_description {
template<typename HelpFormatter>
friend struct basic_arg_parser;
friend struct arg_description_container;
friend struct default_help_formatter;
arg_argument &help(string_range str) { arg_argument &help(string_range str) {
p_helpstr = std::string{str}; p_helpstr = std::string{str};
return *this; return *this;
} }
string_range get_help() const {
return p_helpstr;
}
protected: protected:
arg_argument(arg_value req = arg_value::NONE, int nargs = 1): arg_argument(arg_value req = arg_value::NONE, int nargs = 1):
arg_description(), p_valreq(req), p_nargs(nargs) arg_description(), p_valreq(req), p_nargs(nargs)
@ -104,7 +93,6 @@ struct arg_optional: arg_argument {
template<typename HelpFormatter> template<typename HelpFormatter>
friend struct basic_arg_parser; friend struct basic_arg_parser;
friend struct arg_description_container; friend struct arg_description_container;
friend struct default_help_formatter;
arg_type type() const { arg_type type() const {
return arg_type::OPTIONAL; return arg_type::OPTIONAL;
@ -143,6 +131,10 @@ struct arg_optional: arg_argument {
return *this; return *this;
} }
auto get_names() const {
return iter(p_names);
}
protected: protected:
arg_optional() = delete; arg_optional() = delete;
@ -186,10 +178,7 @@ private:
}; };
struct arg_positional: arg_argument { struct arg_positional: arg_argument {
template<typename HelpFormatter>
friend struct basic_arg_parser;
friend struct arg_description_container; friend struct arg_description_container;
friend struct default_help_formatter;
arg_type type() const { arg_type type() const {
return arg_type::POSITIONAL; return arg_type::POSITIONAL;
@ -199,6 +188,10 @@ struct arg_positional: arg_argument {
return (name == ostd::citer(p_name)); return (name == ostd::citer(p_name));
} }
string_range get_name() const {
return p_name;
}
protected: protected:
arg_positional() = delete; arg_positional() = delete;
arg_positional( arg_positional(
@ -217,10 +210,7 @@ private:
}; };
struct arg_category: arg_description { struct arg_category: arg_description {
template<typename HelpFormatter>
friend struct basic_arg_parser;
friend struct arg_description_container; friend struct arg_description_container;
friend struct default_help_formatter;
arg_type type() const { arg_type type() const {
return arg_type::CATEGORY; return arg_type::CATEGORY;
@ -261,6 +251,10 @@ struct arg_description_container {
return static_cast<arg_category &>(*p_opts.emplace_back(p)); return static_cast<arg_category &>(*p_opts.emplace_back(p));
} }
auto iter() const {
return ostd::citer(p_opts);
}
protected: protected:
arg_description_container() {} arg_description_container() {}
@ -289,8 +283,6 @@ protected:
template<typename HelpFormatter> template<typename HelpFormatter>
struct basic_arg_parser: arg_description_container { struct basic_arg_parser: arg_description_container {
friend struct default_help_formatter;
basic_arg_parser(string_range progname = string_range{}): basic_arg_parser(string_range progname = string_range{}):
arg_description_container(), p_progname(progname) arg_description_container(), p_progname(progname)
{} {}
@ -299,7 +291,7 @@ struct basic_arg_parser: arg_description_container {
if (p_progname.empty()) { if (p_progname.empty()) {
p_progname = argv[0]; p_progname = argv[0];
} }
parse(iter(&argv[1], &argv[argc])); parse(ostd::iter(&argv[1], &argv[argc]));
} }
template<typename InputRange> template<typename InputRange>
@ -364,6 +356,10 @@ struct basic_arg_parser: arg_description_container {
return arg.p_used; return arg.p_used;
} }
string_range get_progname() const {
return p_progname;
}
private: private:
template<typename R> template<typename R>
void parse_long(string_range arg, R &args) { void parse_long(string_range arg, R &args) {
@ -424,7 +420,7 @@ private:
} }
} }
if (val) { if (val) {
desc.set_values(iter({ *val })); desc.set_values(ostd::iter({ *val }));
if (arg_val) { if (arg_val) {
args.pop_front(); args.pop_front();
} }
@ -447,7 +443,7 @@ struct default_help_formatter {
template<typename OutputRange> template<typename OutputRange>
void format_usage(OutputRange &out) { void format_usage(OutputRange &out) {
string_range progname = p_parser.p_progname; string_range progname = p_parser.get_progname();
if (progname.empty()) { if (progname.empty()) {
progname = "program"; progname = "program";
} }
@ -457,22 +453,23 @@ struct default_help_formatter {
template<typename OutputRange> template<typename OutputRange>
void format_options(OutputRange &out) { void format_options(OutputRange &out) {
std::size_t opt_namel = 0, pos_namel = 0; std::size_t opt_namel = 0, pos_namel = 0;
for (auto &p: p_parser.p_opts) { for (auto &p: p_parser.iter()) {
switch (p->type()) { switch (p->type()) {
case arg_type::OPTIONAL: { case arg_type::OPTIONAL: {
auto &opt = static_cast<arg_optional &>(*p); auto &opt = static_cast<arg_optional &>(*p);
auto names = opt.get_names();
std::size_t nl = 0; std::size_t nl = 0;
for (auto &s: opt.p_names) { for (auto &s: names) {
nl += s.size(); nl += s.size();
} }
nl += 2 * (opt.p_names.size() - 1); nl += 2 * (names.size() - 1);
opt_namel = std::max(opt_namel, nl); opt_namel = std::max(opt_namel, nl);
break; break;
} }
case arg_type::POSITIONAL: case arg_type::POSITIONAL:
pos_namel = std::max( pos_namel = std::max(
pos_namel, pos_namel,
static_cast<arg_positional &>(*p).p_name.size() static_cast<arg_positional &>(*p).get_name().size()
); );
break; break;
default: default:
@ -484,34 +481,37 @@ struct default_help_formatter {
if (pos_namel) { if (pos_namel) {
format(out, "\npositional arguments:\n"); format(out, "\npositional arguments:\n");
for (auto &p: p_parser.p_opts) { for (auto &p: p_parser.iter()) {
if (p->type() != arg_type::POSITIONAL) { if (p->type() != arg_type::POSITIONAL) {
continue; continue;
} }
auto &parg = static_cast<arg_positional &>(*p.get()); auto &parg = static_cast<arg_positional &>(*p.get());
format(out, " %s", parg.p_name); auto name = parg.get_name(), help = parg.get_help();
if (parg.p_helpstr.empty()) { format(out, " %s", name);
if (help.empty()) {
out.put('\n'); out.put('\n');
} else { } else {
std::size_t nd = maxpad - parg.p_name.size() + 2; std::size_t nd = maxpad - name.size() + 2;
for (std::size_t i = 0; i < nd; ++i) { for (std::size_t i = 0; i < nd; ++i) {
out.put(' '); out.put(' ');
} }
format(out, "%s\n", parg.p_helpstr); format(out, "%s\n", help);
} }
} }
} }
if (opt_namel) { if (opt_namel) {
format(out, "\noptional arguments:\n"); format(out, "\noptional arguments:\n");
for (auto &p: p_parser.p_opts) { for (auto &p: p_parser.iter()) {
if (p->type() != arg_type::OPTIONAL) { if (p->type() != arg_type::OPTIONAL) {
continue; continue;
} }
auto &parg = static_cast<arg_optional &>(*p.get()); auto &parg = static_cast<arg_optional &>(*p.get());
auto names = parg.get_names();
auto help = parg.get_help();
format(out, " "); format(out, " ");
std::size_t nd = 0; std::size_t nd = 0;
for (auto &s: parg.p_names) { for (auto &s: names) {
if (nd) { if (nd) {
nd += 2; nd += 2;
format(out, ", "); format(out, ", ");
@ -519,14 +519,14 @@ struct default_help_formatter {
nd += s.size(); nd += s.size();
format(out, "%s", s); format(out, "%s", s);
} }
if (parg.p_helpstr.empty()) { if (help.empty()) {
out.put('\n'); out.put('\n');
} else { } else {
nd = maxpad - nd + 2; nd = maxpad - nd + 2;
for (std::size_t i = 0; i < nd; ++i) { for (std::size_t i = 0; i < nd; ++i) {
out.put(' '); out.put(' ');
} }
format(out, "%s\n", parg.p_helpstr); format(out, "%s\n", help);
} }
} }
} }