From d1633e5c99edcd9fa2bf6935e91356e66da59df5 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Thu, 6 Mar 2025 21:40:57 +0100 Subject: [PATCH 1/9] Refactor: change function signature --- include/argparse.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/include/argparse.h b/include/argparse.h index 43ba3758..176d2fbd 100644 --- a/include/argparse.h +++ b/include/argparse.h @@ -872,7 +872,7 @@ namespace argparse } else { - parse_arguments_option(consumable, std::next(it)); + parse_arguments_option(std::next(it), consumable.end()); } } else @@ -999,13 +999,13 @@ namespace argparse parse_arguments_number(it, nargs_number); } - auto parse_arguments_option(std::ranges::view auto args, auto it) -> void + auto parse_arguments_option(auto it, auto end) -> void { switch (get_nargs_option()) { case zero_or_one: { - if (it == args.end() || it->m_token.starts_with("-")) + if (it == end || it->m_token.starts_with("-")) { m_value = m_options.const_; } @@ -1017,13 +1017,13 @@ namespace argparse } case zero_or_more: { - auto const args_number = count_args(it, args.end()); + auto const args_number = count_args(it, end); parse_arguments_number(it, args_number); break; } case one_or_more: { - auto const args_number = count_args(it, args.end()); + auto const args_number = count_args(it, end); if (args_number == 0) { throw parsing_error(std::format("argument {}: expected at least one argument", join(get_names(), "/"))); From 610d72d7a530a4756643b693ece062ec1c9af8b3 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Thu, 6 Mar 2025 21:43:25 +0100 Subject: [PATCH 2/9] Refactor: change function signature --- include/argparse.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/argparse.h b/include/argparse.h index 176d2fbd..f406436c 100644 --- a/include/argparse.h +++ b/include/argparse.h @@ -868,7 +868,7 @@ namespace argparse { if (has_nargs_number()) { - parse_arguments_number(consumable, std::next(it)); + parse_arguments_number(std::next(it), consumable.end()); } else { @@ -988,10 +988,10 @@ namespace argparse } private: - auto parse_arguments_number(std::ranges::view auto args, auto it) -> void + auto parse_arguments_number(auto it, auto end) -> void { auto const nargs_number = get_nargs_number(); - auto const args_number = count_args(it, args.end()); + auto const args_number = count_args(it, end); if (args_number < nargs_number) { throw parsing_error(std::format("argument {}: expected {} argument{}", join(get_names(), "/"), std::to_string(nargs_number), nargs_number > 1 ? "s" : "")); From c00f88bcf2208a843ce129b3a42afc87ff5f76af Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Fri, 7 Mar 2025 14:58:04 +0100 Subject: [PATCH 3/9] Refactor: change function signature --- include/argparse.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/include/argparse.h b/include/argparse.h index f406436c..5e8affa5 100644 --- a/include/argparse.h +++ b/include/argparse.h @@ -991,7 +991,7 @@ namespace argparse auto parse_arguments_number(auto it, auto end) -> void { auto const nargs_number = get_nargs_number(); - auto const args_number = count_args(it, end); + auto const args_number = count_args(std::ranges::subrange(it, end)); if (args_number < nargs_number) { throw parsing_error(std::format("argument {}: expected {} argument{}", join(get_names(), "/"), std::to_string(nargs_number), nargs_number > 1 ? "s" : "")); @@ -1017,13 +1017,13 @@ namespace argparse } case zero_or_more: { - auto const args_number = count_args(it, end); + auto const args_number = count_args(std::ranges::subrange(it, end)); parse_arguments_number(it, args_number); break; } case one_or_more: { - auto const args_number = count_args(it, end); + auto const args_number = count_args(std::ranges::subrange(it, end)); if (args_number == 0) { throw parsing_error(std::format("argument {}: expected at least one argument", join(get_names(), "/"))); @@ -1114,9 +1114,9 @@ namespace argparse } } - auto count_args(auto it, auto end) const -> std::size_t + auto count_args(std::ranges::view auto args) const -> std::size_t { - return std::ranges::distance(std::ranges::subrange(it, end) | std::views::take_while([](auto const & arg) { return !arg.m_token.starts_with('-'); })); + return std::ranges::distance(args | std::views::take_while([](auto const & arg) { return !arg.m_token.starts_with('-'); })); } auto consume_arg(Token & arg) const -> std::any From 334038fe462beb2a08e40b83681baba0474de227 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Fri, 7 Mar 2025 15:03:19 +0100 Subject: [PATCH 4/9] Refactor: change function signature --- include/argparse.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/argparse.h b/include/argparse.h index 5e8affa5..b2099a97 100644 --- a/include/argparse.h +++ b/include/argparse.h @@ -868,7 +868,7 @@ namespace argparse { if (has_nargs_number()) { - parse_arguments_number(std::next(it), consumable.end()); + parse_arguments_number(std::ranges::subrange(std::next(it), consumable.end())); } else { @@ -988,15 +988,15 @@ namespace argparse } private: - auto parse_arguments_number(auto it, auto end) -> void + auto parse_arguments_number(std::ranges::view auto args) -> void { auto const nargs_number = get_nargs_number(); - auto const args_number = count_args(std::ranges::subrange(it, end)); + auto const args_number = count_args(args); if (args_number < nargs_number) { throw parsing_error(std::format("argument {}: expected {} argument{}", join(get_names(), "/"), std::to_string(nargs_number), nargs_number > 1 ? "s" : "")); } - parse_arguments_number(it, nargs_number); + parse_arguments_number(args.begin(), nargs_number); } auto parse_arguments_option(auto it, auto end) -> void From f2f3178ae6d2bd0ceef4520c9bff14f322ed7985 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Fri, 7 Mar 2025 15:08:32 +0100 Subject: [PATCH 5/9] Refactor: change function signature --- include/argparse.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/include/argparse.h b/include/argparse.h index b2099a97..e7e229d1 100644 --- a/include/argparse.h +++ b/include/argparse.h @@ -872,7 +872,7 @@ namespace argparse } else { - parse_arguments_option(std::next(it), consumable.end()); + parse_arguments_option(std::ranges::subrange(std::next(it), consumable.end())); } } else @@ -999,36 +999,36 @@ namespace argparse parse_arguments_number(args.begin(), nargs_number); } - auto parse_arguments_option(auto it, auto end) -> void + auto parse_arguments_option(std::ranges::view auto args) -> void { switch (get_nargs_option()) { case zero_or_one: { - if (it == end || it->m_token.starts_with("-")) + if (args.empty() || args.front().m_token.starts_with("-")) { m_value = m_options.const_; } else { - m_value = consume_arg(*it); + m_value = consume_arg(args.front()); } break; } case zero_or_more: { - auto const args_number = count_args(std::ranges::subrange(it, end)); - parse_arguments_number(it, args_number); + auto const args_number = count_args(args); + parse_arguments_number(args.begin(), args_number); break; } case one_or_more: { - auto const args_number = count_args(std::ranges::subrange(it, end)); + auto const args_number = count_args(args); if (args_number == 0) { throw parsing_error(std::format("argument {}: expected at least one argument", join(get_names(), "/"))); } - parse_arguments_number(it, args_number); + parse_arguments_number(args.begin(), args_number); break; } } From bd92ff1e1ede68da536b9338c49b74e5d4fc089a Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Fri, 7 Mar 2025 15:26:30 +0100 Subject: [PATCH 6/9] Refactor: rename function --- include/argparse.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/argparse.h b/include/argparse.h index e7e229d1..7f952107 100644 --- a/include/argparse.h +++ b/include/argparse.h @@ -996,7 +996,7 @@ namespace argparse { throw parsing_error(std::format("argument {}: expected {} argument{}", join(get_names(), "/"), std::to_string(nargs_number), nargs_number > 1 ? "s" : "")); } - parse_arguments_number(args.begin(), nargs_number); + parse_arguments(args.begin(), nargs_number); } auto parse_arguments_option(std::ranges::view auto args) -> void @@ -1018,7 +1018,7 @@ namespace argparse case zero_or_more: { auto const args_number = count_args(args); - parse_arguments_number(args.begin(), args_number); + parse_arguments(args.begin(), args_number); break; } case one_or_more: @@ -1028,13 +1028,13 @@ namespace argparse { throw parsing_error(std::format("argument {}: expected at least one argument", join(get_names(), "/"))); } - parse_arguments_number(args.begin(), args_number); + parse_arguments(args.begin(), args_number); break; } } } - auto parse_arguments_number(auto it, std::size_t args_number) -> void + auto parse_arguments(auto it, std::size_t args_number) -> void { auto values = consume_args(it, args_number); m_value = m_options.type_handler->transform(values); From b8fb08d0ef1ead7aaf3baa5d687c3ee90639d70c Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Fri, 7 Mar 2025 15:40:23 +0100 Subject: [PATCH 7/9] Refactor: change function signatures --- include/argparse.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/include/argparse.h b/include/argparse.h index 7f952107..595aba69 100644 --- a/include/argparse.h +++ b/include/argparse.h @@ -996,7 +996,7 @@ namespace argparse { throw parsing_error(std::format("argument {}: expected {} argument{}", join(get_names(), "/"), std::to_string(nargs_number), nargs_number > 1 ? "s" : "")); } - parse_arguments(args.begin(), nargs_number); + parse_arguments(args | std::views::take(nargs_number)); } auto parse_arguments_option(std::ranges::view auto args) -> void @@ -1018,7 +1018,7 @@ namespace argparse case zero_or_more: { auto const args_number = count_args(args); - parse_arguments(args.begin(), args_number); + parse_arguments(args | std::views::take(args_number)); break; } case one_or_more: @@ -1028,15 +1028,15 @@ namespace argparse { throw parsing_error(std::format("argument {}: expected at least one argument", join(get_names(), "/"))); } - parse_arguments(args.begin(), args_number); + parse_arguments(args | std::views::take(args_number)); break; } } } - auto parse_arguments(auto it, std::size_t args_number) -> void + auto parse_arguments(std::ranges::view auto args) -> void { - auto values = consume_args(it, args_number); + auto values = consume_args(args); m_value = m_options.type_handler->transform(values); } @@ -1139,12 +1139,12 @@ namespace argparse return value; } - auto consume_args(auto arg_it, std::size_t number) const -> std::vector + auto consume_args(std::ranges::view auto args) const -> std::vector { std::vector values; - for (std::size_t i = 0; i < number; ++i) + for (auto & arg : args) { - values.push_back(consume_arg(*arg_it++)); + values.push_back(consume_arg(arg)); } return values; } From 8e0aee27121dd78888a860cace61555531eb4feb Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Fri, 7 Mar 2025 16:35:22 +0100 Subject: [PATCH 8/9] Refactor: construct vector directly --- include/argparse.h | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/include/argparse.h b/include/argparse.h index 595aba69..5418a9f4 100644 --- a/include/argparse.h +++ b/include/argparse.h @@ -1141,12 +1141,10 @@ namespace argparse auto consume_args(std::ranges::view auto args) const -> std::vector { - std::vector values; - for (auto & arg : args) - { - values.push_back(consume_arg(arg)); - } - return values; + auto transformation = args + | std::views::transform([this](auto & arg) { return consume_arg(arg); }) + | std::views::common; + return std::vector(transformation.begin(), transformation.end()); } auto get_name_for_dest() const -> std::string From 0ca960948b63a6f7a43016f25ab4b255c7a02b91 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Fri, 7 Mar 2025 16:57:12 +0100 Subject: [PATCH 9/9] Cleanup: call via this pointer to fix Clang error --- include/argparse.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/argparse.h b/include/argparse.h index 5418a9f4..5462b41d 100644 --- a/include/argparse.h +++ b/include/argparse.h @@ -1142,7 +1142,7 @@ namespace argparse auto consume_args(std::ranges::view auto args) const -> std::vector { auto transformation = args - | std::views::transform([this](auto & arg) { return consume_arg(arg); }) + | std::views::transform([this](auto & arg) { return this->consume_arg(arg); }) | std::views::common; return std::vector(transformation.begin(), transformation.end()); }