From 995d46a205faba0fa81bded8a6d48dd533b69b57 Mon Sep 17 00:00:00 2001 From: Christian Menges Date: Sun, 9 May 2021 11:00:57 +0200 Subject: [PATCH] Bump cxxopts from 2.2.0 to 2.2.1 (#602) --- example/cxxopts.hpp | 119 +++++++++++++++++++++++++++++--------------- 1 file changed, 78 insertions(+), 41 deletions(-) diff --git a/example/cxxopts.hpp b/example/cxxopts.hpp index 6fd170d..80b695a 100644 --- a/example/cxxopts.hpp +++ b/example/cxxopts.hpp @@ -29,6 +29,7 @@ THE SOFTWARE. #include #include #include +#include #include #include #include @@ -43,9 +44,13 @@ THE SOFTWARE. #define CXXOPTS_HAS_OPTIONAL #endif +#ifndef CXXOPTS_VECTOR_DELIMITER +#define CXXOPTS_VECTOR_DELIMITER ',' +#endif + #define CXXOPTS__VERSION_MAJOR 2 #define CXXOPTS__VERSION_MINOR 2 -#define CXXOPTS__VERSION_PATCH 0 +#define CXXOPTS__VERSION_PATCH 1 namespace cxxopts { @@ -309,6 +314,9 @@ namespace cxxopts virtual std::shared_ptr implicit_value(const std::string& value) = 0; + virtual std::shared_ptr + no_implicit_value() = 0; + virtual bool is_boolean() const = 0; }; @@ -354,7 +362,7 @@ namespace cxxopts { public: option_exists_error(const std::string& option) - : OptionSpecException(u8"Option " + LQUOTE + option + RQUOTE + u8" already exists") + : OptionSpecException("Option " + LQUOTE + option + RQUOTE + " already exists") { } }; @@ -363,7 +371,7 @@ namespace cxxopts { public: invalid_option_format_error(const std::string& format) - : OptionSpecException(u8"Invalid option format " + LQUOTE + format + RQUOTE) + : OptionSpecException("Invalid option format " + LQUOTE + format + RQUOTE) { } }; @@ -371,8 +379,8 @@ namespace cxxopts class option_syntax_exception : public OptionParseException { public: option_syntax_exception(const std::string& text) - : OptionParseException(u8"Argument " + LQUOTE + text + RQUOTE + - u8" starts with a - but has incorrect syntax") + : OptionParseException("Argument " + LQUOTE + text + RQUOTE + + " starts with a - but has incorrect syntax") { } }; @@ -381,7 +389,7 @@ namespace cxxopts { public: option_not_exists_exception(const std::string& option) - : OptionParseException(u8"Option " + LQUOTE + option + RQUOTE + u8" does not exist") + : OptionParseException("Option " + LQUOTE + option + RQUOTE + " does not exist") { } }; @@ -391,7 +399,7 @@ namespace cxxopts public: missing_argument_exception(const std::string& option) : OptionParseException( - u8"Option " + LQUOTE + option + RQUOTE + u8" is missing an argument" + "Option " + LQUOTE + option + RQUOTE + " is missing an argument" ) { } @@ -402,7 +410,7 @@ namespace cxxopts public: option_requires_argument_exception(const std::string& option) : OptionParseException( - u8"Option " + LQUOTE + option + RQUOTE + u8" requires an argument" + "Option " + LQUOTE + option + RQUOTE + " requires an argument" ) { } @@ -417,8 +425,8 @@ namespace cxxopts const std::string& arg ) : OptionParseException( - u8"Option " + LQUOTE + option + RQUOTE + - u8" does not take an argument, but argument " + + "Option " + LQUOTE + option + RQUOTE + + " does not take an argument, but argument " + LQUOTE + arg + RQUOTE + " given" ) { @@ -429,7 +437,7 @@ namespace cxxopts { public: option_not_present_exception(const std::string& option) - : OptionParseException(u8"Option " + LQUOTE + option + RQUOTE + u8" not present") + : OptionParseException("Option " + LQUOTE + option + RQUOTE + " not present") { } }; @@ -442,7 +450,7 @@ namespace cxxopts const std::string& arg ) : OptionParseException( - u8"Argument " + LQUOTE + arg + RQUOTE + u8" failed to parse" + "Argument " + LQUOTE + arg + RQUOTE + " failed to parse" ) { } @@ -453,7 +461,7 @@ namespace cxxopts public: option_required_exception(const std::string& option) : OptionParseException( - u8"Option " + LQUOTE + option + RQUOTE + u8" is required but not present" + "Option " + LQUOTE + option + RQUOTE + " is required but not present" ) { } @@ -466,9 +474,9 @@ namespace cxxopts std::basic_regex integer_pattern ("(-)?(0x)?([0-9a-zA-Z]+)|((0x)?0)"); std::basic_regex truthy_pattern - ("(t|T)(rue)?"); + ("(t|T)(rue)?|1"); std::basic_regex falsy_pattern - ("((f|F)(alse)?)?"); + ("(f|F)(alse)?|0"); } namespace detail @@ -485,14 +493,14 @@ namespace cxxopts { if (negative) { - if (u > static_cast(-std::numeric_limits::min())) + if (u > static_cast((std::numeric_limits::min)())) { throw argument_incorrect_type(text); } } else { - if (u > static_cast(std::numeric_limits::max())) + if (u > static_cast((std::numeric_limits::max)())) { throw argument_incorrect_type(text); } @@ -523,7 +531,7 @@ namespace cxxopts // if we got to here, then `t` is a positive number that fits into // `R`. So to avoid MSVC C4146, we first cast it to `R`. // See https://github.com/jarro2783/cxxopts/issues/62 for more details. - return -static_cast(t); + return -static_cast(t-1)-1; } template @@ -553,7 +561,6 @@ namespace cxxopts using US = typename std::make_unsigned::type; - constexpr auto umax = std::numeric_limits::max(); constexpr bool is_signed = std::numeric_limits::is_signed; const bool negative = match.length(1) > 0; const uint8_t base = match.length(2) > 0 ? 16 : 10; @@ -568,27 +575,28 @@ namespace cxxopts if (*iter >= '0' && *iter <= '9') { - digit = *iter - '0'; + digit = static_cast(*iter - '0'); } else if (base == 16 && *iter >= 'a' && *iter <= 'f') { - digit = *iter - 'a' + 10; + digit = static_cast(*iter - 'a' + 10); } else if (base == 16 && *iter >= 'A' && *iter <= 'F') { - digit = *iter - 'A' + 10; + digit = static_cast(*iter - 'A' + 10); } else { throw argument_incorrect_type(text); } - if (umax - digit < result * base) + US next = result * base + digit; + if (result > next) { throw argument_incorrect_type(text); } - result = result * base + digit; + result = next; } detail::check_signed_range(negative, result, text); @@ -601,7 +609,7 @@ namespace cxxopts } else { - value = result; + value = static_cast(result); } } @@ -714,9 +722,13 @@ namespace cxxopts void parse_value(const std::string& text, std::vector& value) { - T v; - parse_value(text, v); - value.push_back(v); + std::stringstream in(text); + std::string token; + while(in.eof() == false && std::getline(in, token, CXXOPTS_VECTOR_DELIMITER)) { + T v; + parse_value(token, v); + value.emplace_back(std::move(v)); + } } #ifdef CXXOPTS_HAS_OPTIONAL @@ -825,6 +837,13 @@ namespace cxxopts return shared_from_this(); } + std::shared_ptr + no_implicit_value() + { + m_implicit = false; + return shared_from_this(); + } + std::string get_default_value() const { @@ -1035,19 +1054,31 @@ namespace cxxopts parse_default(std::shared_ptr details) { ensure_value(details); + m_default = true; m_value->parse(); } size_t - count() const + count() const noexcept { return m_count; } + // TODO: maybe default options should count towards the number of arguments + bool + has_default() const noexcept + { + return m_default; + } + template const T& as() const { + if (m_value == nullptr) { + throw std::domain_error("No value"); + } + #ifdef CXXOPTS_NO_RTTI return static_cast&>(*m_value).get(); #else @@ -1067,6 +1098,7 @@ namespace cxxopts std::shared_ptr m_value; size_t m_count = 0; + bool m_default = false; }; class KeyValue @@ -1085,7 +1117,8 @@ namespace cxxopts return m_key; } - const std::string + const + std::string& value() const { return m_value; @@ -1277,7 +1310,7 @@ namespace cxxopts } std::string - help(const std::vector& groups = {""}) const; + help(const std::vector& groups = {}) const; const std::vector groups() const; @@ -1451,6 +1484,7 @@ namespace cxxopts stringAppend(result, "\n"); stringAppend(result, start, ' '); startLine = lastSpace + 1; + lastSpace = startLine; } size = 0; } @@ -1654,7 +1688,10 @@ ParseResult::consume_positional(std::string a) return true; } } - ++m_next_positional; + else + { + throw option_not_exists_exception(*m_next_positional); + } } return false; @@ -1719,8 +1756,10 @@ ParseResult::parse(int& argc, char**& argv) //not a flag // but if it starts with a `-`, then it's an error - if (argv[current][0] == '-') { - throw option_syntax_exception(argv[current]); + if (argv[current][0] == '-' && argv[current][1] != '\0') { + if (!m_allow_unrecognised) { + throw option_syntax_exception(argv[current]); + } } //if true is returned here then it was consumed, otherwise it is @@ -1829,7 +1868,7 @@ ParseResult::parse(int& argc, char**& argv) auto& store = m_results[detail]; - if(!store.count() && value.has_default()){ + if(value.has_default() && !store.count() && !store.has_default()){ parse_default(detail); } } @@ -1933,19 +1972,18 @@ Options::help_one_group(const std::string& g) const for (const auto& o : group->second.options) { - if (o.is_container && - m_positional_set.find(o.l) != m_positional_set.end() && + if (m_positional_set.find(o.l) != m_positional_set.end() && !m_show_positional) { continue; } auto s = format_option(o); - longest = std::max(longest, stringLength(s)); + longest = (std::max)(longest, stringLength(s)); format.push_back(std::make_pair(s, String())); } - longest = std::min(longest, static_cast(OPTION_LONGEST)); + longest = (std::min)(longest, static_cast(OPTION_LONGEST)); //widest allowed description auto allowed = size_t{76} - longest - OPTION_DESC_GAP; @@ -1953,8 +1991,7 @@ Options::help_one_group(const std::string& g) const auto fiter = format.begin(); for (const auto& o : group->second.options) { - if (o.is_container && - m_positional_set.find(o.l) != m_positional_set.end() && + if (m_positional_set.find(o.l) != m_positional_set.end() && !m_show_positional) { continue; -- 2.30.2