diff --git a/CHANGELOG.md b/CHANGELOG.md index 83f94ee..5bf4404 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ * The final "defaulted" bool has been removed, use `->capture_default_str()` instead. Use `app.option_defaults()->always_capture_default()` to set this for all future options. [#597][] +* Use `add_option` on a complex number instead of `add_complex`, which has been removed. [#435]: https://github.com/CLIUtils/CLI11/pull/435 diff --git a/README.md b/README.md index 67df3f3..8f4a298 100644 --- a/README.md +++ b/README.md @@ -231,8 +231,6 @@ app.add_option_function(option_name, function , // type can be any type supported by add_option help_string="") -app.add_complex(... // Special case: support for complex numbers ⚠️. Complex numbers are now fully supported in the add_option so this function is redundant. - // char as an option type is supported before 2.0 but in 2.0 it defaulted to allowing single non numerical characters in addition to the numeric values. // 🆕 There is a template overload which takes two template parameters the first is the type of object to assign the value to, the second is the conversion type. The conversion type should have a known way to convert from a string, such as any of the types that work in the non-template version. If XC is a std::pair and T is some non pair type. Then a two argument constructor for T is called to assign the value. For tuples or other multi element types, XC must be a single type or a tuple like object of the same size as the assignment type diff --git a/include/CLI/App.hpp b/include/CLI/App.hpp index acae2a1..eca29f4 100644 --- a/include/CLI/App.hpp +++ b/include/CLI/App.hpp @@ -896,56 +896,6 @@ class App { } #endif - /// Add a complex number DEPRECATED --use add_option instead - template - Option *add_complex(std::string option_name, - T &variable, - std::string option_description = "", - bool defaulted = false, - std::string label = "COMPLEX") { - - CLI::callback_t fun = [&variable](const results_t &res) { - XC x, y; - bool worked; - if(res.size() >= 2 && !res[1].empty()) { - auto str1 = res[1]; - if(str1.back() == 'i' || str1.back() == 'j') - str1.pop_back(); - worked = detail::lexical_cast(res[0], x) && detail::lexical_cast(str1, y); - } else { - auto str1 = res.front(); - auto nloc = str1.find_last_of('-'); - if(nloc != std::string::npos && nloc > 0) { - worked = detail::lexical_cast(str1.substr(0, nloc), x); - str1 = str1.substr(nloc); - if(str1.back() == 'i' || str1.back() == 'j') - str1.pop_back(); - worked = worked && detail::lexical_cast(str1, y); - } else { - if(str1.back() == 'i' || str1.back() == 'j') { - str1.pop_back(); - worked = detail::lexical_cast(str1, y); - x = XC{0}; - } else { - worked = detail::lexical_cast(str1, x); - y = XC{0}; - } - } - } - if(worked) - variable = T{x, y}; - return worked; - }; - - auto default_function = [&variable]() { return CLI::detail::checked_to_string(variable); }; - - CLI::Option *opt = - add_option(option_name, std::move(fun), std::move(option_description), defaulted, default_function); - - opt->type_name(label)->type_size(1, 2)->delimiter('+')->run_callback_for_default(); - return opt; - } - /// Set a configuration ini file option, or clear it if no name passed Option *set_config(std::string option_name = "", std::string default_filename = "", diff --git a/tests/AppTest.cpp b/tests/AppTest.cpp index d5e6c38..c4f153c 100644 --- a/tests/AppTest.cpp +++ b/tests/AppTest.cpp @@ -809,7 +809,7 @@ TEST_CASE_METHOD(TApp, "TakeFirstOptMulti", "[app]") { TEST_CASE_METHOD(TApp, "ComplexOptMulti", "[app]") { std::complex val; - app.add_complex("--long", val)->take_first()->allow_extra_args(); + app.add_option("--long", val)->take_first()->allow_extra_args(); args = {"--long", "1", "2", "3", "4"}; diff --git a/tests/NewParseTest.cpp b/tests/NewParseTest.cpp index 6e88fee..81173e0 100644 --- a/tests/NewParseTest.cpp +++ b/tests/NewParseTest.cpp @@ -13,26 +13,6 @@ using Catch::Matchers::Contains; using cx = std::complex; -TEST_CASE_METHOD(TApp, "Complex", "[newparse]") { - cx comp{1, 2}; - app.add_complex("-c,--complex", comp, "", true); - - args = {"-c", "4", "3"}; - - std::string help = app.help(); - CHECK_THAT(help, Contains("1")); - CHECK_THAT(help, Contains("2")); - CHECK_THAT(help, Contains("COMPLEX")); - - CHECK(comp.real() == Approx(1)); - CHECK(comp.imag() == Approx(2)); - - run(); - - CHECK(comp.real() == Approx(4)); - CHECK(comp.imag() == Approx(3)); -} - TEST_CASE_METHOD(TApp, "ComplexOption", "[newparse]") { cx comp{1, 2}; app.add_option("-c,--complex", comp)->capture_default_str(); @@ -53,26 +33,6 @@ TEST_CASE_METHOD(TApp, "ComplexOption", "[newparse]") { CHECK(comp.imag() == Approx(3)); } -TEST_CASE_METHOD(TApp, "ComplexFloat", "[newparse]") { - std::complex comp{1, 2}; - app.add_complex, float>("-c,--complex", comp)->capture_default_str(); - - args = {"-c", "4", "3"}; - - std::string help = app.help(); - CHECK_THAT(help, Contains("1")); - CHECK_THAT(help, Contains("2")); - CHECK_THAT(help, Contains("COMPLEX")); - - CHECK(comp.real() == Approx(1)); - CHECK(comp.imag() == Approx(2)); - - run(); - - CHECK(comp.real() == Approx(4)); - CHECK(comp.imag() == Approx(3)); -} - TEST_CASE_METHOD(TApp, "ComplexFloatOption", "[newparse]") { std::complex comp{1, 2}; app.add_option("-c,--complex", comp)->capture_default_str(); @@ -93,38 +53,6 @@ TEST_CASE_METHOD(TApp, "ComplexFloatOption", "[newparse]") { CHECK(comp.imag() == Approx(3)); } -TEST_CASE_METHOD(TApp, "ComplexWithDelimiter", "[newparse]") { - cx comp{1, 2}; - app.add_complex("-c,--complex", comp)->capture_default_str()->delimiter('+'); - - args = {"-c", "4+3i"}; - - std::string help = app.help(); - CHECK_THAT(help, Contains("1")); - CHECK_THAT(help, Contains("2")); - CHECK_THAT(help, Contains("COMPLEX")); - - CHECK(comp.real() == Approx(1)); - CHECK(comp.imag() == Approx(2)); - - run(); - - CHECK(comp.real() == Approx(4)); - CHECK(comp.imag() == Approx(3)); - - args = {"-c", "5+-3i"}; - run(); - - CHECK(comp.real() == Approx(5)); - CHECK(comp.imag() == Approx(-3)); - - args = {"-c", "6", "-4i"}; - run(); - - CHECK(comp.real() == Approx(6)); - CHECK(comp.imag() == Approx(-4)); -} - TEST_CASE_METHOD(TApp, "ComplexWithDelimiterOption", "[newparse]") { cx comp{1, 2}; app.add_option("-c,--complex", comp)->capture_default_str()->delimiter('+'); @@ -157,18 +85,6 @@ TEST_CASE_METHOD(TApp, "ComplexWithDelimiterOption", "[newparse]") { CHECK(comp.imag() == Approx(-4)); } -TEST_CASE_METHOD(TApp, "ComplexIgnoreI", "[newparse]") { - cx comp{1, 2}; - app.add_complex("-c,--complex", comp); - - args = {"-c", "4", "3i"}; - - run(); - - CHECK(comp.real() == Approx(4)); - CHECK(comp.imag() == Approx(3)); -} - TEST_CASE_METHOD(TApp, "ComplexIgnoreIOption", "[newparse]") { cx comp{1, 2}; app.add_option("-c,--complex", comp); @@ -181,40 +97,6 @@ TEST_CASE_METHOD(TApp, "ComplexIgnoreIOption", "[newparse]") { CHECK(comp.imag() == Approx(3)); } -TEST_CASE_METHOD(TApp, "ComplexSingleArg", "[newparse]") { - cx comp{1, 2}; - app.add_complex("-c,--complex", comp); - - args = {"-c", "4"}; - run(); - CHECK(comp.real() == Approx(4)); - CHECK(comp.imag() == Approx(0)); - - args = {"-c", "4-2i"}; - run(); - CHECK(comp.real() == Approx(4)); - CHECK(comp.imag() == Approx(-2)); - args = {"-c", "4+2i"}; - run(); - CHECK(comp.real() == Approx(4)); - CHECK(comp.imag() == Approx(2)); - - args = {"-c", "-4+2j"}; - run(); - CHECK(comp.real() == Approx(-4)); - CHECK(comp.imag() == Approx(2)); - - args = {"-c", "-4.2-2j"}; - run(); - CHECK(comp.real() == Approx(-4.2)); - CHECK(comp.imag() == Approx(-2)); - - args = {"-c", "-4.2-2.7i"}; - run(); - CHECK(comp.real() == Approx(-4.2)); - CHECK(comp.imag() == Approx(-2.7)); -} - TEST_CASE_METHOD(TApp, "ComplexSingleArgOption", "[newparse]") { cx comp{1, 2}; app.add_option("-c,--complex", comp); @@ -249,29 +131,6 @@ TEST_CASE_METHOD(TApp, "ComplexSingleArgOption", "[newparse]") { CHECK(comp.imag() == Approx(-2.7)); } -TEST_CASE_METHOD(TApp, "ComplexSingleImag", "[newparse]") { - cx comp{1, 2}; - app.add_complex("-c,--complex", comp); - - args = {"-c", "4j"}; - run(); - CHECK(comp.real() == Approx(0)); - CHECK(comp.imag() == Approx(4)); - - args = {"-c", "-4j"}; - run(); - CHECK(comp.real() == Approx(0)); - CHECK(comp.imag() == Approx(-4)); - args = {"-c", "-4"}; - run(); - CHECK(comp.real() == Approx(-4)); - CHECK(comp.imag() == Approx(0)); - args = {"-c", "+4"}; - run(); - CHECK(comp.real() == Approx(4)); - CHECK(comp.imag() == Approx(0)); -} - TEST_CASE_METHOD(TApp, "ComplexSingleImagOption", "[newparse]") { cx comp{1, 2}; app.add_option("-c,--complex", comp);