From 0d868fdca8a7b0d5e1e9c7fd9d6fdc8c2ad1c9df Mon Sep 17 00:00:00 2001 From: Aayush Anand Date: Mon, 28 Feb 2022 13:20:08 -0700 Subject: [PATCH 1/4] Modify ArgumentParser::parse_args_validate() method to use a for loop instead of std::for_each() Suggested-by: Aayush Anand [skrobinson: Updated for latest formatting and naming conventions] Signed-off-by: Sean Robinson --- include/argparse/argparse.hpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/include/argparse/argparse.hpp b/include/argparse/argparse.hpp index 4cb17b8..6c8daf2 100644 --- a/include/argparse/argparse.hpp +++ b/include/argparse/argparse.hpp @@ -1139,11 +1139,9 @@ private: */ void parse_args_validate() { // Check if all arguments are parsed - std::for_each(std::begin(m_argument_map), std::end(m_argument_map), - [](const auto &pair) { - const auto &argument = pair.second; - argument->validate(); - }); + for (const auto& [unused, argument] : m_argument_map) { + argument->validate(); + } } // Used by print_help. From 063d708c3e9826a9ad9dfe0429b0960815ca3cb9 Mon Sep 17 00:00:00 2001 From: Sean Robinson Date: Mon, 28 Feb 2022 13:20:08 -0700 Subject: [PATCH 2/4] Modify ArgumentParser::get_length_of_longest_argument method run in O(1) space Closes #124 Reported-by: Aayush Anand Signed-off-by: Sean Robinson --- include/argparse/argparse.hpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/include/argparse/argparse.hpp b/include/argparse/argparse.hpp index 6c8daf2..8395675 100644 --- a/include/argparse/argparse.hpp +++ b/include/argparse/argparse.hpp @@ -1149,14 +1149,11 @@ private: if (m_argument_map.empty()) { return 0; } - std::vector argument_lengths(m_argument_map.size()); - std::transform(std::begin(m_argument_map), std::end(m_argument_map), - std::begin(argument_lengths), [](const auto &pair) { - const auto &argument = pair.second; - return argument->get_arguments_length(); - }); - return *std::max_element(std::begin(argument_lengths), - std::end(argument_lengths)); + std::size_t max_size = 0; + for (const auto& [unused, argument] : m_argument_map) { + max_size = std::max(max_size, argument->get_arguments_length()); + } + return max_size; } using list_iterator = std::list::iterator; From 843e4eefb0265a446f8576275fa22bbc1f395040 Mon Sep 17 00:00:00 2001 From: Sean Robinson Date: Mon, 28 Feb 2022 13:20:08 -0700 Subject: [PATCH 3/4] Move ArgumentParser::parse_args_validate logic into ::parse_args This code was previously moved from ::parse_args to its own method, but has since been simplified. Moving the actual work to Argument::validate in commit 603e87ae6 leaves a single loop that fits back into ::parse_args. Signed-off-by: Sean Robinson --- include/argparse/argparse.hpp | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/include/argparse/argparse.hpp b/include/argparse/argparse.hpp index 8395675..f54ec44 100644 --- a/include/argparse/argparse.hpp +++ b/include/argparse/argparse.hpp @@ -958,7 +958,10 @@ public: */ void parse_args(const std::vector &arguments) { parse_args_internal(arguments); - parse_args_validate(); + // Check if all arguments are parsed + for (const auto& [unused, argument] : m_argument_map) { + argument->validate(); + } } /* Main entry point for parsing command-line arguments using this @@ -1134,16 +1137,6 @@ private: m_is_parsed = true; } - /* - * @throws std::runtime_error in case of any invalid argument - */ - void parse_args_validate() { - // Check if all arguments are parsed - for (const auto& [unused, argument] : m_argument_map) { - argument->validate(); - } - } - // Used by print_help. std::size_t get_length_of_longest_argument() const { if (m_argument_map.empty()) { From 67d2e4476fc2b6de245566914ae87164a486cb25 Mon Sep 17 00:00:00 2001 From: Sean Robinson Date: Thu, 24 Mar 2022 14:04:46 -0700 Subject: [PATCH 4/4] Annotate range-for loops' structured bindings as [[maybe_unused]] The 'unused' variable in both cases is most-definitely unused in the loop. This is a cppcheck warning that appeared after moving these two loops to range-for. Signed-off-by: Sean Robinson --- include/argparse/argparse.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/argparse/argparse.hpp b/include/argparse/argparse.hpp index f54ec44..38e3244 100644 --- a/include/argparse/argparse.hpp +++ b/include/argparse/argparse.hpp @@ -959,7 +959,7 @@ public: void parse_args(const std::vector &arguments) { parse_args_internal(arguments); // Check if all arguments are parsed - for (const auto& [unused, argument] : m_argument_map) { + for ([[maybe_unused]] const auto& [unused, argument] : m_argument_map) { argument->validate(); } } @@ -1143,7 +1143,7 @@ private: return 0; } std::size_t max_size = 0; - for (const auto& [unused, argument] : m_argument_map) { + for ([[maybe_unused]] const auto& [unused, argument] : m_argument_map) { max_size = std::max(max_size, argument->get_arguments_length()); } return max_size;