diff --git a/README.md b/README.md index ab5e6e5..4c8b0e7 100644 --- a/README.md +++ b/README.md @@ -199,7 +199,7 @@ Default values are not counted by `Options::count`. You can specify an option for which an argument cannot be specified using below syntax. ```cpp -cxxopts::value()->implicit_value("true", true) +cxxopts::value()->implicit_value("true", cxxopts::ImplicitArgPolicy::Disabled) ``` In this case specifying option as `--option=` is disallowed and will throw `specified_disabled_args` exception. Note that `--option value` is not supported for implicit values. It is treated as positional/unmatched. diff --git a/include/cxxopts.hpp b/include/cxxopts.hpp index 451b3e2..0bae743 100644 --- a/include/cxxopts.hpp +++ b/include/cxxopts.hpp @@ -364,6 +364,11 @@ CXXOPTS_LINKONCE_CONST std::string RQUOTE("\'"); CXXOPTS_DIAGNOSTIC_PUSH CXXOPTS_IGNORE_WARNING("-Wnon-virtual-dtor") +enum class ImplicitArgPolicy { + Disabled, + Enabled +}; + // some older versions of GCC warn under this warning CXXOPTS_IGNORE_WARNING("-Weffc++") class Value : public std::enable_shared_from_this @@ -407,7 +412,7 @@ class Value : public std::enable_shared_from_this default_value(const std::string& value) = 0; virtual std::shared_ptr - implicit_value(const std::string& value, bool disabled_args = false) = 0; + implicit_value(const std::string& value, ImplicitArgPolicy arg_policy = ImplicitArgPolicy::Enabled) = 0; virtual std::shared_ptr no_implicit_value() = 0; @@ -1286,7 +1291,7 @@ class abstract_value : public Value bool has_disabled_args() const override { - return m_disabled_args; + return m_implicit && (m_implicit_arg_policy == ImplicitArgPolicy::Disabled); } std::shared_ptr @@ -1298,11 +1303,11 @@ class abstract_value : public Value } std::shared_ptr - implicit_value(const std::string& value, bool disabled_args = false) override + implicit_value(const std::string& value, ImplicitArgPolicy arg_policy = ImplicitArgPolicy::Enabled) override { m_implicit = true; m_implicit_value = value; - m_disabled_args = disabled_args; + m_implicit_arg_policy = arg_policy; return shared_from_this(); } @@ -1310,7 +1315,6 @@ class abstract_value : public Value no_implicit_value() override { m_implicit = false; - m_disabled_args = false; return shared_from_this(); } @@ -1348,7 +1352,9 @@ class abstract_value : public Value bool m_default = false; bool m_implicit = false; - bool m_disabled_args = false; + + // NOTE: Only meaningful when m_implicit == true + ImplicitArgPolicy m_implicit_arg_policy = ImplicitArgPolicy::Enabled; std::string m_default_value{}; std::string m_implicit_value{}; diff --git a/test/options.cpp b/test/options.cpp index 7c595e2..5293291 100644 --- a/test/options.cpp +++ b/test/options.cpp @@ -643,10 +643,10 @@ TEST_CASE("Implicit value with disabled_args", "[no_value]") const char prog_name[] = "disabled_args"; cxxopts::Options options(prog_name, "Implicit value with disabled args"); options.add_options() - ("b,bool", "bool with disabled_args", cxxopts::value()->implicit_value("true", true)) - ("s,string", "string with disabled_args", cxxopts::value()->implicit_value("value", true)) + ("b,bool", "bool with disabled_args", cxxopts::value()->implicit_value("true", cxxopts::ImplicitArgPolicy::Disabled)) + ("s,string", "string with disabled_args", cxxopts::value()->implicit_value("value", cxxopts::ImplicitArgPolicy::Disabled)) ("x,string2", "string with first disabled and then enabled args", - cxxopts::value()->implicit_value("value", true)->no_implicit_value()); + cxxopts::value()->implicit_value("value", cxxopts::ImplicitArgPolicy::Disabled)->no_implicit_value()); struct testcase{ std::string name; Argv argv;