From 03861ab853bc4361dce1780479d8912152787251 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Thu, 13 Mar 2025 17:33:32 +0100 Subject: [PATCH 1/4] Refactor: extract code to function --- include/argparse.h | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/include/argparse.h b/include/argparse.h index f3549c53..52a669d7 100644 --- a/include/argparse.h +++ b/include/argparse.h @@ -802,14 +802,19 @@ namespace argparse } auto consume_arg(Token & arg) const -> std::any + { + arg.m_consumed = true; + return process_arg(arg.m_token); + } + + auto process_arg(std::string const & arg) const -> std::any { std::any value; - if (!m_options.type_handler->from_string(arg.m_token, value)) + if (!m_options.type_handler->from_string(arg, value)) { - throw parsing_error(std::format("argument {}: invalid value: '{}'", get_dest_name(), arg.m_token)); + throw parsing_error(std::format("argument {}: invalid value: '{}'", get_dest_name(), arg)); } check_choices(value); - arg.m_consumed = true; return value; } From c4988ed65fd03843d4f0ca76e02525e58f910c2b Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Thu, 13 Mar 2025 17:35:35 +0100 Subject: [PATCH 2/4] Refactor: rename function --- include/argparse.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/argparse.h b/include/argparse.h index 52a669d7..6c3f8377 100644 --- a/include/argparse.h +++ b/include/argparse.h @@ -883,7 +883,7 @@ namespace argparse } else { - m_value = consume_arg(value); + m_value = process_arg(value); } } break; @@ -1109,10 +1109,10 @@ namespace argparse auto consume_arg(Token & arg) const -> std::any { arg.m_consumed = true; - return consume_arg(arg.m_token); + return process_arg(arg.m_token); } - auto consume_arg(std::string const & arg) const -> std::any + auto process_arg(std::string const & arg) const -> std::any { std::any value; if (!m_options.type_handler->from_string(arg, value)) From d0c3624efe528a8b640e2137191a5725ab534019 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Thu, 13 Mar 2025 17:39:24 +0100 Subject: [PATCH 3/4] Separate processings args and marking as consumed --- include/argparse.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/include/argparse.h b/include/argparse.h index 6c3f8377..a59d40da 100644 --- a/include/argparse.h +++ b/include/argparse.h @@ -820,10 +820,15 @@ namespace argparse auto consume_args(std::ranges::view auto args) const -> std::vector { - auto transformation = args - | std::views::transform([&](auto & arg) { return consume_arg(arg); }) - | std::views::common; - return std::vector(transformation.begin(), transformation.end()); + auto result = std::vector(); + auto consumed = std::vector(); + for (auto & arg : args) + { + result.push_back(process_arg(arg.m_token)); + consumed.push_back(&arg); + } + std::ranges::for_each(consumed, [](auto arg) { arg->m_consumed = true; }); + return result; } private: From a0082aec44f8fa99066f72ee886c246b08396747 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Thu, 13 Mar 2025 17:44:00 +0100 Subject: [PATCH 4/4] Separate processings args and marking as consumed --- include/argparse.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/include/argparse.h b/include/argparse.h index a59d40da..9a37cdfe 100644 --- a/include/argparse.h +++ b/include/argparse.h @@ -1130,10 +1130,15 @@ namespace argparse auto consume_args(std::ranges::view auto args) const -> std::vector { - auto transformation = args - | std::views::transform([&](auto & arg) { return consume_arg(arg); }) - | std::views::common; - return std::vector(transformation.begin(), transformation.end()); + auto result = std::vector(); + auto consumed = std::vector(); + for (auto & arg : args) + { + result.push_back(process_arg(arg.m_token)); + consumed.push_back(&arg); + } + std::ranges::for_each(consumed, [](auto arg) { arg->m_consumed = true; }); + return result; } auto get_name_for_dest() const -> std::string