diff --git a/include/argparse/argparse.hpp b/include/argparse/argparse.hpp index ec06ba23..c41cdb14 100644 --- a/include/argparse/argparse.hpp +++ b/include/argparse/argparse.hpp @@ -545,10 +545,9 @@ std::size_t get_levenshtein_distance(const StringType &s1, } template -std::string_view -get_most_similar_string(const std::map &map, - const std::string_view input) { - std::string_view most_similar{}; +std::string get_most_similar_string(const std::map &map, + const std::string &input) { + std::string most_similar{}; std::size_t min_distance = std::numeric_limits::max(); for (const auto &entry : map) { @@ -1586,11 +1585,12 @@ class ArgumentParser { if constexpr (std::is_same_v) { return (*this)[name]; } else { - auto subparser_it = m_subparser_map.find(name); + std::string str_name(name); + auto subparser_it = m_subparser_map.find(str_name); if (subparser_it != m_subparser_map.end()) { return subparser_it->second->get(); } - throw std::logic_error("No such subparser: " + std::string(name)); + throw std::logic_error("No such subparser: " + str_name); } } @@ -1720,7 +1720,7 @@ class ArgumentParser { /* Getter that returns true if a subcommand is used. */ auto is_subcommand_used(std::string_view subcommand_name) const { - return m_subparser_used.at(subcommand_name); + return m_subparser_used.at(std::string(subcommand_name)); } /* Getter that returns true if a subcommand is used. @@ -1734,12 +1734,12 @@ class ArgumentParser { * @throws std::logic_error in case of an invalid argument name */ Argument &operator[](std::string_view arg_name) const { - auto it = m_argument_map.find(arg_name); + std::string name(arg_name); + auto it = m_argument_map.find(name); if (it != m_argument_map.end()) { return *(it->second); } if (!is_valid_prefix_char(arg_name.front())) { - std::string name(arg_name); const auto legal_prefix_char = get_any_valid_prefix_char(); const auto prefix = std::string(1, legal_prefix_char); @@ -1972,10 +1972,8 @@ class ArgumentParser { if (Argument::is_positional(current_argument, m_prefix_chars)) { if (positional_argument_it == std::end(m_positional_arguments)) { - std::string_view maybe_command = current_argument; - // Check sub-parsers - auto subparser_it = m_subparser_map.find(maybe_command); + auto subparser_it = m_subparser_map.find(current_argument); if (subparser_it != m_subparser_map.end()) { // build list of remaining args @@ -1984,7 +1982,7 @@ class ArgumentParser { // invoke subparser m_is_parsed = true; - m_subparser_used[maybe_command] = true; + m_subparser_used[current_argument] = true; return subparser_it->second->get().parse_args( unprocessed_arguments); } @@ -2075,10 +2073,8 @@ class ArgumentParser { if (Argument::is_positional(current_argument, m_prefix_chars)) { if (positional_argument_it == std::end(m_positional_arguments)) { - std::string_view maybe_command = current_argument; - // Check sub-parsers - auto subparser_it = m_subparser_map.find(maybe_command); + auto subparser_it = m_subparser_map.find(current_argument); if (subparser_it != m_subparser_map.end()) { // build list of remaining args @@ -2087,7 +2083,7 @@ class ArgumentParser { // invoke subparser m_is_parsed = true; - m_subparser_used[maybe_command] = true; + m_subparser_used[current_argument] = true; return subparser_it->second->get().parse_known_args_internal( unprocessed_arguments); } @@ -2172,11 +2168,11 @@ class ArgumentParser { bool m_is_parsed = false; std::list m_positional_arguments; std::list m_optional_arguments; - std::map m_argument_map; + std::map m_argument_map; std::string m_parser_path; std::list> m_subparsers; - std::map m_subparser_map; - std::map m_subparser_used; + std::map m_subparser_map; + std::map m_subparser_used; std::vector m_mutually_exclusive_groups; bool m_suppress = false; };