From 4ac173901a3e8f6e294eb8f4cb064c22c701647b Mon Sep 17 00:00:00 2001 From: q66 Date: Wed, 17 May 2017 20:07:25 +0200 Subject: [PATCH] remove unnecessary friend decls in argparse --- ostd/argparse.hh | 80 ++++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/ostd/argparse.hh b/ostd/argparse.hh index 9925f91..fc505a2 100644 --- a/ostd/argparse.hh +++ b/ostd/argparse.hh @@ -51,17 +51,7 @@ enum class arg_value { REST }; -template -struct basic_arg_parser; -struct arg_description_container; -struct default_help_formatter; - struct arg_description { - template - friend struct basic_arg_parser; - friend struct arg_description_container; - friend struct default_help_formatter; - virtual ~arg_description() {} virtual arg_type type() const = 0; @@ -73,16 +63,15 @@ protected: }; struct arg_argument: arg_description { - template - friend struct basic_arg_parser; - friend struct arg_description_container; - friend struct default_help_formatter; - arg_argument &help(string_range str) { p_helpstr = std::string{str}; return *this; } + string_range get_help() const { + return p_helpstr; + } + protected: arg_argument(arg_value req = arg_value::NONE, int nargs = 1): arg_description(), p_valreq(req), p_nargs(nargs) @@ -104,7 +93,6 @@ struct arg_optional: arg_argument { template friend struct basic_arg_parser; friend struct arg_description_container; - friend struct default_help_formatter; arg_type type() const { return arg_type::OPTIONAL; @@ -143,6 +131,10 @@ struct arg_optional: arg_argument { return *this; } + auto get_names() const { + return iter(p_names); + } + protected: arg_optional() = delete; @@ -186,10 +178,7 @@ private: }; struct arg_positional: arg_argument { - template - friend struct basic_arg_parser; friend struct arg_description_container; - friend struct default_help_formatter; arg_type type() const { return arg_type::POSITIONAL; @@ -199,6 +188,10 @@ struct arg_positional: arg_argument { return (name == ostd::citer(p_name)); } + string_range get_name() const { + return p_name; + } + protected: arg_positional() = delete; arg_positional( @@ -217,10 +210,7 @@ private: }; struct arg_category: arg_description { - template - friend struct basic_arg_parser; friend struct arg_description_container; - friend struct default_help_formatter; arg_type type() const { return arg_type::CATEGORY; @@ -261,6 +251,10 @@ struct arg_description_container { return static_cast(*p_opts.emplace_back(p)); } + auto iter() const { + return ostd::citer(p_opts); + } + protected: arg_description_container() {} @@ -289,8 +283,6 @@ protected: template struct basic_arg_parser: arg_description_container { - friend struct default_help_formatter; - basic_arg_parser(string_range progname = string_range{}): arg_description_container(), p_progname(progname) {} @@ -299,7 +291,7 @@ struct basic_arg_parser: arg_description_container { if (p_progname.empty()) { p_progname = argv[0]; } - parse(iter(&argv[1], &argv[argc])); + parse(ostd::iter(&argv[1], &argv[argc])); } template @@ -364,6 +356,10 @@ struct basic_arg_parser: arg_description_container { return arg.p_used; } + string_range get_progname() const { + return p_progname; + } + private: template void parse_long(string_range arg, R &args) { @@ -424,7 +420,7 @@ private: } } if (val) { - desc.set_values(iter({ *val })); + desc.set_values(ostd::iter({ *val })); if (arg_val) { args.pop_front(); } @@ -447,7 +443,7 @@ struct default_help_formatter { template void format_usage(OutputRange &out) { - string_range progname = p_parser.p_progname; + string_range progname = p_parser.get_progname(); if (progname.empty()) { progname = "program"; } @@ -457,22 +453,23 @@ struct default_help_formatter { template void format_options(OutputRange &out) { 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()) { case arg_type::OPTIONAL: { auto &opt = static_cast(*p); + auto names = opt.get_names(); std::size_t nl = 0; - for (auto &s: opt.p_names) { + for (auto &s: names) { nl += s.size(); } - nl += 2 * (opt.p_names.size() - 1); + nl += 2 * (names.size() - 1); opt_namel = std::max(opt_namel, nl); break; } case arg_type::POSITIONAL: pos_namel = std::max( pos_namel, - static_cast(*p).p_name.size() + static_cast(*p).get_name().size() ); break; default: @@ -484,34 +481,37 @@ struct default_help_formatter { if (pos_namel) { format(out, "\npositional arguments:\n"); - for (auto &p: p_parser.p_opts) { + for (auto &p: p_parser.iter()) { if (p->type() != arg_type::POSITIONAL) { continue; } auto &parg = static_cast(*p.get()); - format(out, " %s", parg.p_name); - if (parg.p_helpstr.empty()) { + auto name = parg.get_name(), help = parg.get_help(); + format(out, " %s", name); + if (help.empty()) { out.put('\n'); } 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) { out.put(' '); } - format(out, "%s\n", parg.p_helpstr); + format(out, "%s\n", help); } } } if (opt_namel) { format(out, "\noptional arguments:\n"); - for (auto &p: p_parser.p_opts) { + for (auto &p: p_parser.iter()) { if (p->type() != arg_type::OPTIONAL) { continue; } auto &parg = static_cast(*p.get()); + auto names = parg.get_names(); + auto help = parg.get_help(); format(out, " "); std::size_t nd = 0; - for (auto &s: parg.p_names) { + for (auto &s: names) { if (nd) { nd += 2; format(out, ", "); @@ -519,14 +519,14 @@ struct default_help_formatter { nd += s.size(); format(out, "%s", s); } - if (parg.p_helpstr.empty()) { + if (help.empty()) { out.put('\n'); } else { nd = maxpad - nd + 2; for (std::size_t i = 0; i < nd; ++i) { out.put(' '); } - format(out, "%s\n", parg.p_helpstr); + format(out, "%s\n", help); } } }