From 50a5e6db535a4d72fc6727f2141fd684e0b425db Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Mon, 1 Sep 2025 22:31:50 +0200 Subject: [PATCH 1/9] Change function signature --- include/argparse.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/argparse.hpp b/include/argparse.hpp index 60d3467..6860cc1 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -1550,7 +1550,7 @@ namespace argparse return optionals; } - auto format(ArgumentCommon const & argument) const -> std::string + auto format(Formattable const & argument) const -> std::string { if (!argument.expects_argument()) { @@ -1567,14 +1567,14 @@ namespace argparse } } - auto format_arg(ArgumentCommon const & argument) const -> std::string + auto format_arg(Formattable const & argument) const -> std::string { return argument.has_choices() ? "{" + argument.get_joined_choices(",") + "}" : argument.get_metavar_name(); } - auto format_nargs(ArgumentCommon const & argument) const -> std::string + auto format_nargs(Formattable const & argument) const -> std::string { auto result = std::string(); auto const formatted_arg = format_arg(argument); From 5fbc75c82d9bb0efd71b7cd36d4d9de83ccace84 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Mon, 1 Sep 2025 22:59:46 +0200 Subject: [PATCH 2/9] Change functions to operate on view instead of container --- include/argparse.hpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/include/argparse.hpp b/include/argparse.hpp index 6860cc1..d3e7fb8 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -306,13 +306,13 @@ namespace argparse auto format_usage() const -> std::string { auto const formatter = Formatter(); - return formatter.format_usage(m_arguments, m_usage, m_prog); + return formatter.format_usage(m_arguments | std::views::all, m_usage, m_prog); } auto format_help() const -> std::string { auto const formatter = Formatter(); - return formatter.format_help(m_arguments, m_prog, m_usage, m_description, m_epilog); + return formatter.format_help(m_arguments | std::views::all, m_prog, m_usage, m_description, m_epilog); } auto format_version() const -> std::string @@ -1374,7 +1374,7 @@ namespace argparse class Formatter { public: - auto format_usage(argument_uptrs const & arguments, optstring const & usage, optstring const & prog) const -> std::string + auto format_usage(std::ranges::view auto arguments, optstring const & usage, optstring const & prog) const -> std::string { if (usage) { @@ -1384,7 +1384,7 @@ namespace argparse return std::format("usage: {}{}{}", *prog, format_usage_optionals(arguments), format_usage_positionals(arguments)); } - auto format_help(argument_uptrs const & arguments, optstring const & prog, optstring const & usage, optstring const & description, optstring const & epilog) const -> std::string + auto format_help(std::ranges::view auto arguments, optstring const & prog, optstring const & usage, optstring const & description, optstring const & epilog) const -> std::string { auto message = format_usage(arguments, usage, prog); auto positionals = format_help_positionals(arguments, prog); @@ -1419,7 +1419,7 @@ namespace argparse } private: - auto format_usage_positionals(argument_uptrs const & arguments) const -> std::string + auto format_usage_positionals(std::ranges::view auto arguments) const -> std::string { auto positionals = std::string(); @@ -1440,11 +1440,11 @@ namespace argparse return positionals; } - auto format_usage_optionals(argument_uptrs const & arguments) const -> std::string + auto format_usage_optionals(std::ranges::view auto arguments) const -> std::string { auto optionals = std::string(); - for (auto it = arguments.cbegin(); it != arguments.cend(); ++it) + for (auto it = arguments.begin(); it != arguments.end(); ++it) { auto const & arg = *it; @@ -1454,7 +1454,7 @@ namespace argparse { optionals += " "; } - else if (arg->is_mutually_exclusive() && it != arguments.cbegin() && arg->is_mutually_exclusive_with(**std::prev(it))) + else if (arg->is_mutually_exclusive() && it != arguments.begin() && arg->is_mutually_exclusive_with(**std::prev(it))) { optionals += " | "; } @@ -1482,7 +1482,7 @@ namespace argparse { // skip } - else if (arg->is_mutually_exclusive() && std::next(it) != arguments.cend() && arg->is_mutually_exclusive_with(**std::next(it))) + else if (arg->is_mutually_exclusive() && std::next(it) != arguments.end() && arg->is_mutually_exclusive_with(**std::next(it))) { // skip } @@ -1496,7 +1496,7 @@ namespace argparse return optionals; } - auto format_help_positionals(argument_uptrs const & arguments, optstring const & prog) const -> std::string + auto format_help_positionals(std::ranges::view auto arguments, optstring const & prog) const -> std::string { auto positionals = std::string(); @@ -1517,7 +1517,7 @@ namespace argparse return positionals; } - auto format_help_optionals(argument_uptrs const & arguments, optstring const & prog) const -> std::string + auto format_help_optionals(std::ranges::view auto arguments, optstring const & prog) const -> std::string { auto optionals = std::string(); From dc6a5fd1e3997861e97e53d9ca789e54177bc992 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Mon, 1 Sep 2025 23:09:16 +0200 Subject: [PATCH 3/9] Fix build --- include/argparse.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/argparse.hpp b/include/argparse.hpp index d3e7fb8..c5344ee 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -1522,7 +1522,7 @@ namespace argparse auto optionals = std::string(); for (auto const & arg : arguments - | std::views::filter([](auto const & arg) { return !arg->is_positional(); })) + | std::views::filter([](auto const & a) { return !a->is_positional(); })) { auto arg_line = std::string(" "); auto const formatted_arg = format(*arg); From 160adb2e22ecc4a98890cb76599a2a79e8c1270f Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Mon, 1 Sep 2025 23:32:57 +0200 Subject: [PATCH 4/9] Change filtering predicate --- include/argparse.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/argparse.hpp b/include/argparse.hpp index c5344ee..feb6ff2 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -1424,7 +1424,7 @@ namespace argparse auto positionals = std::string(); for (auto const & arg : arguments - | std::views::filter(&ArgumentCommon::is_positional)) + | std::views::filter(&Formattable::is_positional)) { if (arg->has_nargs()) { @@ -1501,7 +1501,7 @@ namespace argparse auto positionals = std::string(); for (auto const & arg : arguments - | std::views::filter(&ArgumentCommon::is_positional)) + | std::views::filter(&Formattable::is_positional)) { auto arg_line = " " + format_arg(*arg); From 5fbd0889c08112aed04c1a072e09a00b73c7a3f1 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Mon, 1 Sep 2025 23:36:37 +0200 Subject: [PATCH 5/9] Make Formatter use Formattable interface --- include/argparse.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/argparse.hpp b/include/argparse.hpp index feb6ff2..fac3eac 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -306,13 +306,13 @@ namespace argparse auto format_usage() const -> std::string { auto const formatter = Formatter(); - return formatter.format_usage(m_arguments | std::views::all, m_usage, m_prog); + return formatter.format_usage(m_arguments | std::views::transform([](auto const & ca) { return static_cast(ca.get()); }), m_usage, m_prog); } auto format_help() const -> std::string { auto const formatter = Formatter(); - return formatter.format_help(m_arguments | std::views::all, m_prog, m_usage, m_description, m_epilog); + return formatter.format_help(m_arguments | std::views::transform([](auto const & ca) { return static_cast(ca.get()); }), m_prog, m_usage, m_description, m_epilog); } auto format_version() const -> std::string From c44f392180ea927c0951a6fd7a8f36376dfdc472 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Tue, 16 Sep 2025 18:18:33 +0200 Subject: [PATCH 6/9] Replace std::prev with its ranges counterpart --- include/argparse.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/argparse.hpp b/include/argparse.hpp index fac3eac..06a04eb 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -1454,7 +1454,7 @@ namespace argparse { optionals += " "; } - else if (arg->is_mutually_exclusive() && it != arguments.begin() && arg->is_mutually_exclusive_with(**std::prev(it))) + else if (arg->is_mutually_exclusive() && it != arguments.begin() && arg->is_mutually_exclusive_with(**std::ranges::prev(it))) { optionals += " | "; } From 0ad27d7e7661552b3495fe8a912843131ff7de97 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Tue, 16 Sep 2025 18:18:52 +0200 Subject: [PATCH 7/9] Replace std::next with its ranges counterpart --- include/argparse.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/argparse.hpp b/include/argparse.hpp index 06a04eb..be11835 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -1482,7 +1482,7 @@ namespace argparse { // skip } - else if (arg->is_mutually_exclusive() && std::next(it) != arguments.end() && arg->is_mutually_exclusive_with(**std::next(it))) + else if (arg->is_mutually_exclusive() && std::ranges::next(it) != arguments.end() && arg->is_mutually_exclusive_with(**std::ranges::next(it))) { // skip } From bfd8b913c259bd84a83c86fbec1997eada7be96b Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Tue, 16 Sep 2025 18:24:07 +0200 Subject: [PATCH 8/9] Replace std::next with its ranges counterpart --- include/argparse.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/argparse.hpp b/include/argparse.hpp index be11835..8194460 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -1266,7 +1266,7 @@ namespace argparse auto get_consumable_args(auto it, std::ranges::view auto consumable) const { - return std::ranges::subrange(std::next(it), consumable.end()) + return std::ranges::subrange(std::ranges::next(it), consumable.end()) | std::views::take_while([](auto const & token) { return !token.m_token.starts_with("-"); }); } From 76a2e8ddc28519f3f7508d74567a0aaef52e9af1 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Tue, 16 Sep 2025 18:40:31 +0200 Subject: [PATCH 9/9] Use view of references instead of view of pointers --- include/argparse.hpp | 46 ++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/include/argparse.hpp b/include/argparse.hpp index 8194460..c936b83 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -306,13 +306,13 @@ namespace argparse auto format_usage() const -> std::string { auto const formatter = Formatter(); - return formatter.format_usage(m_arguments | std::views::transform([](auto const & ca) { return static_cast(ca.get()); }), m_usage, m_prog); + return formatter.format_usage(m_arguments | std::views::transform([](auto const & ca) -> Formattable const & { return *ca; }), m_usage, m_prog); } auto format_help() const -> std::string { auto const formatter = Formatter(); - return formatter.format_help(m_arguments | std::views::transform([](auto const & ca) { return static_cast(ca.get()); }), m_prog, m_usage, m_description, m_epilog); + return formatter.format_help(m_arguments | std::views::transform([](auto const & ca) -> Formattable const & { return *ca; }), m_prog, m_usage, m_description, m_epilog); } auto format_version() const -> std::string @@ -1426,14 +1426,14 @@ namespace argparse for (auto const & arg : arguments | std::views::filter(&Formattable::is_positional)) { - if (arg->has_nargs()) + if (arg.has_nargs()) { - positionals += format_nargs(*arg); + positionals += format_nargs(arg); } else { positionals += " "; - positionals += format_arg(*arg); + positionals += format_arg(arg); } } @@ -1448,13 +1448,13 @@ namespace argparse { auto const & arg = *it; - if (!arg->is_positional()) + if (!arg.is_positional()) { - if (arg->is_required()) + if (arg.is_required()) { optionals += " "; } - else if (arg->is_mutually_exclusive() && it != arguments.begin() && arg->is_mutually_exclusive_with(**std::ranges::prev(it))) + else if (arg.is_mutually_exclusive() && it != arguments.begin() && arg.is_mutually_exclusive_with(*std::ranges::prev(it))) { optionals += " | "; } @@ -1463,26 +1463,26 @@ namespace argparse optionals += " ["; } - if (arg->has_nargs()) + if (arg.has_nargs()) { - optionals += arg->get_name(); - optionals += format_nargs(*arg); + optionals += arg.get_name(); + optionals += format_nargs(arg); } else { - optionals += arg->get_name(); - if (arg->expects_argument()) + optionals += arg.get_name(); + if (arg.expects_argument()) { optionals += " "; - optionals += format_arg(*arg); + optionals += format_arg(arg); } } - if (arg->is_required()) + if (arg.is_required()) { // skip } - else if (arg->is_mutually_exclusive() && std::ranges::next(it) != arguments.end() && arg->is_mutually_exclusive_with(**std::ranges::next(it))) + else if (arg.is_mutually_exclusive() && std::ranges::next(it) != arguments.end() && arg.is_mutually_exclusive_with(*std::ranges::next(it))) { // skip } @@ -1503,9 +1503,9 @@ namespace argparse for (auto const & arg : arguments | std::views::filter(&Formattable::is_positional)) { - auto arg_line = " " + format_arg(*arg); + auto arg_line = " " + format_arg(arg); - if (auto const & help = arg->get_help(); !help.empty()) + if (auto const & help = arg.get_help(); !help.empty()) { arg_line += help_string_separation(arg_line.size()); arg_line += replace_prog(help, prog); @@ -1522,14 +1522,14 @@ namespace argparse auto optionals = std::string(); for (auto const & arg : arguments - | std::views::filter([](auto const & a) { return !a->is_positional(); })) + | std::views::filter([](auto const & a) { return !a.is_positional(); })) { auto arg_line = std::string(" "); - auto const formatted_arg = format(*arg); + auto const formatted_arg = format(arg); - for (auto name_it = arg->get_names().begin(); name_it != arg->get_names().end(); ++name_it) + for (auto name_it = arg.get_names().begin(); name_it != arg.get_names().end(); ++name_it) { - if (name_it != arg->get_names().begin()) + if (name_it != arg.get_names().begin()) { arg_line += ", "; } @@ -1538,7 +1538,7 @@ namespace argparse arg_line += formatted_arg; } - if (auto const & help = arg->get_help(); !help.empty()) + if (auto const & help = arg.get_help(); !help.empty()) { arg_line += help_string_separation(arg_line.size()); arg_line += replace_prog(help, prog);