Commit c4f1fc8ea7762afe8b9247242893ef8ddb97c1e4
Committed by
GitHub
1 parent
e2e3cb2f
refactor!: remove add_complex (#600)
Showing
5 changed files
with
2 additions
and
194 deletions
CHANGELOG.md
| ... | ... | @@ -23,6 +23,7 @@ |
| 23 | 23 | * The final "defaulted" bool has been removed, use `->capture_default_str()` |
| 24 | 24 | instead. Use `app.option_defaults()->always_capture_default()` to set this for |
| 25 | 25 | all future options. [#597][] |
| 26 | +* Use `add_option` on a complex number instead of `add_complex`, which has been removed. | |
| 26 | 27 | |
| 27 | 28 | |
| 28 | 29 | [#435]: https://github.com/CLIUtils/CLI11/pull/435 | ... | ... |
README.md
| ... | ... | @@ -231,8 +231,6 @@ app.add_option_function<type>(option_name, |
| 231 | 231 | function <void(const type &value)>, // type can be any type supported by add_option |
| 232 | 232 | help_string="") |
| 233 | 233 | |
| 234 | -app.add_complex(... // Special case: support for complex numbers ⚠️. Complex numbers are now fully supported in the add_option so this function is redundant. | |
| 235 | - | |
| 236 | 234 | // 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. |
| 237 | 235 | |
| 238 | 236 | // 🆕 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 | ... | ... |
include/CLI/App.hpp
| ... | ... | @@ -896,56 +896,6 @@ class App { |
| 896 | 896 | } |
| 897 | 897 | #endif |
| 898 | 898 | |
| 899 | - /// Add a complex number DEPRECATED --use add_option instead | |
| 900 | - template <typename T, typename XC = double> | |
| 901 | - Option *add_complex(std::string option_name, | |
| 902 | - T &variable, | |
| 903 | - std::string option_description = "", | |
| 904 | - bool defaulted = false, | |
| 905 | - std::string label = "COMPLEX") { | |
| 906 | - | |
| 907 | - CLI::callback_t fun = [&variable](const results_t &res) { | |
| 908 | - XC x, y; | |
| 909 | - bool worked; | |
| 910 | - if(res.size() >= 2 && !res[1].empty()) { | |
| 911 | - auto str1 = res[1]; | |
| 912 | - if(str1.back() == 'i' || str1.back() == 'j') | |
| 913 | - str1.pop_back(); | |
| 914 | - worked = detail::lexical_cast(res[0], x) && detail::lexical_cast(str1, y); | |
| 915 | - } else { | |
| 916 | - auto str1 = res.front(); | |
| 917 | - auto nloc = str1.find_last_of('-'); | |
| 918 | - if(nloc != std::string::npos && nloc > 0) { | |
| 919 | - worked = detail::lexical_cast(str1.substr(0, nloc), x); | |
| 920 | - str1 = str1.substr(nloc); | |
| 921 | - if(str1.back() == 'i' || str1.back() == 'j') | |
| 922 | - str1.pop_back(); | |
| 923 | - worked = worked && detail::lexical_cast(str1, y); | |
| 924 | - } else { | |
| 925 | - if(str1.back() == 'i' || str1.back() == 'j') { | |
| 926 | - str1.pop_back(); | |
| 927 | - worked = detail::lexical_cast(str1, y); | |
| 928 | - x = XC{0}; | |
| 929 | - } else { | |
| 930 | - worked = detail::lexical_cast(str1, x); | |
| 931 | - y = XC{0}; | |
| 932 | - } | |
| 933 | - } | |
| 934 | - } | |
| 935 | - if(worked) | |
| 936 | - variable = T{x, y}; | |
| 937 | - return worked; | |
| 938 | - }; | |
| 939 | - | |
| 940 | - auto default_function = [&variable]() { return CLI::detail::checked_to_string<T, T>(variable); }; | |
| 941 | - | |
| 942 | - CLI::Option *opt = | |
| 943 | - add_option(option_name, std::move(fun), std::move(option_description), defaulted, default_function); | |
| 944 | - | |
| 945 | - opt->type_name(label)->type_size(1, 2)->delimiter('+')->run_callback_for_default(); | |
| 946 | - return opt; | |
| 947 | - } | |
| 948 | - | |
| 949 | 899 | /// Set a configuration ini file option, or clear it if no name passed |
| 950 | 900 | Option *set_config(std::string option_name = "", |
| 951 | 901 | std::string default_filename = "", | ... | ... |
tests/AppTest.cpp
| ... | ... | @@ -809,7 +809,7 @@ TEST_CASE_METHOD(TApp, "TakeFirstOptMulti", "[app]") { |
| 809 | 809 | |
| 810 | 810 | TEST_CASE_METHOD(TApp, "ComplexOptMulti", "[app]") { |
| 811 | 811 | std::complex<double> val; |
| 812 | - app.add_complex("--long", val)->take_first()->allow_extra_args(); | |
| 812 | + app.add_option("--long", val)->take_first()->allow_extra_args(); | |
| 813 | 813 | |
| 814 | 814 | args = {"--long", "1", "2", "3", "4"}; |
| 815 | 815 | ... | ... |
tests/NewParseTest.cpp
| ... | ... | @@ -13,26 +13,6 @@ using Catch::Matchers::Contains; |
| 13 | 13 | |
| 14 | 14 | using cx = std::complex<double>; |
| 15 | 15 | |
| 16 | -TEST_CASE_METHOD(TApp, "Complex", "[newparse]") { | |
| 17 | - cx comp{1, 2}; | |
| 18 | - app.add_complex("-c,--complex", comp, "", true); | |
| 19 | - | |
| 20 | - args = {"-c", "4", "3"}; | |
| 21 | - | |
| 22 | - std::string help = app.help(); | |
| 23 | - CHECK_THAT(help, Contains("1")); | |
| 24 | - CHECK_THAT(help, Contains("2")); | |
| 25 | - CHECK_THAT(help, Contains("COMPLEX")); | |
| 26 | - | |
| 27 | - CHECK(comp.real() == Approx(1)); | |
| 28 | - CHECK(comp.imag() == Approx(2)); | |
| 29 | - | |
| 30 | - run(); | |
| 31 | - | |
| 32 | - CHECK(comp.real() == Approx(4)); | |
| 33 | - CHECK(comp.imag() == Approx(3)); | |
| 34 | -} | |
| 35 | - | |
| 36 | 16 | TEST_CASE_METHOD(TApp, "ComplexOption", "[newparse]") { |
| 37 | 17 | cx comp{1, 2}; |
| 38 | 18 | app.add_option("-c,--complex", comp)->capture_default_str(); |
| ... | ... | @@ -53,26 +33,6 @@ TEST_CASE_METHOD(TApp, "ComplexOption", "[newparse]") { |
| 53 | 33 | CHECK(comp.imag() == Approx(3)); |
| 54 | 34 | } |
| 55 | 35 | |
| 56 | -TEST_CASE_METHOD(TApp, "ComplexFloat", "[newparse]") { | |
| 57 | - std::complex<float> comp{1, 2}; | |
| 58 | - app.add_complex<std::complex<float>, float>("-c,--complex", comp)->capture_default_str(); | |
| 59 | - | |
| 60 | - args = {"-c", "4", "3"}; | |
| 61 | - | |
| 62 | - std::string help = app.help(); | |
| 63 | - CHECK_THAT(help, Contains("1")); | |
| 64 | - CHECK_THAT(help, Contains("2")); | |
| 65 | - CHECK_THAT(help, Contains("COMPLEX")); | |
| 66 | - | |
| 67 | - CHECK(comp.real() == Approx(1)); | |
| 68 | - CHECK(comp.imag() == Approx(2)); | |
| 69 | - | |
| 70 | - run(); | |
| 71 | - | |
| 72 | - CHECK(comp.real() == Approx(4)); | |
| 73 | - CHECK(comp.imag() == Approx(3)); | |
| 74 | -} | |
| 75 | - | |
| 76 | 36 | TEST_CASE_METHOD(TApp, "ComplexFloatOption", "[newparse]") { |
| 77 | 37 | std::complex<float> comp{1, 2}; |
| 78 | 38 | app.add_option("-c,--complex", comp)->capture_default_str(); |
| ... | ... | @@ -93,38 +53,6 @@ TEST_CASE_METHOD(TApp, "ComplexFloatOption", "[newparse]") { |
| 93 | 53 | CHECK(comp.imag() == Approx(3)); |
| 94 | 54 | } |
| 95 | 55 | |
| 96 | -TEST_CASE_METHOD(TApp, "ComplexWithDelimiter", "[newparse]") { | |
| 97 | - cx comp{1, 2}; | |
| 98 | - app.add_complex("-c,--complex", comp)->capture_default_str()->delimiter('+'); | |
| 99 | - | |
| 100 | - args = {"-c", "4+3i"}; | |
| 101 | - | |
| 102 | - std::string help = app.help(); | |
| 103 | - CHECK_THAT(help, Contains("1")); | |
| 104 | - CHECK_THAT(help, Contains("2")); | |
| 105 | - CHECK_THAT(help, Contains("COMPLEX")); | |
| 106 | - | |
| 107 | - CHECK(comp.real() == Approx(1)); | |
| 108 | - CHECK(comp.imag() == Approx(2)); | |
| 109 | - | |
| 110 | - run(); | |
| 111 | - | |
| 112 | - CHECK(comp.real() == Approx(4)); | |
| 113 | - CHECK(comp.imag() == Approx(3)); | |
| 114 | - | |
| 115 | - args = {"-c", "5+-3i"}; | |
| 116 | - run(); | |
| 117 | - | |
| 118 | - CHECK(comp.real() == Approx(5)); | |
| 119 | - CHECK(comp.imag() == Approx(-3)); | |
| 120 | - | |
| 121 | - args = {"-c", "6", "-4i"}; | |
| 122 | - run(); | |
| 123 | - | |
| 124 | - CHECK(comp.real() == Approx(6)); | |
| 125 | - CHECK(comp.imag() == Approx(-4)); | |
| 126 | -} | |
| 127 | - | |
| 128 | 56 | TEST_CASE_METHOD(TApp, "ComplexWithDelimiterOption", "[newparse]") { |
| 129 | 57 | cx comp{1, 2}; |
| 130 | 58 | app.add_option("-c,--complex", comp)->capture_default_str()->delimiter('+'); |
| ... | ... | @@ -157,18 +85,6 @@ TEST_CASE_METHOD(TApp, "ComplexWithDelimiterOption", "[newparse]") { |
| 157 | 85 | CHECK(comp.imag() == Approx(-4)); |
| 158 | 86 | } |
| 159 | 87 | |
| 160 | -TEST_CASE_METHOD(TApp, "ComplexIgnoreI", "[newparse]") { | |
| 161 | - cx comp{1, 2}; | |
| 162 | - app.add_complex("-c,--complex", comp); | |
| 163 | - | |
| 164 | - args = {"-c", "4", "3i"}; | |
| 165 | - | |
| 166 | - run(); | |
| 167 | - | |
| 168 | - CHECK(comp.real() == Approx(4)); | |
| 169 | - CHECK(comp.imag() == Approx(3)); | |
| 170 | -} | |
| 171 | - | |
| 172 | 88 | TEST_CASE_METHOD(TApp, "ComplexIgnoreIOption", "[newparse]") { |
| 173 | 89 | cx comp{1, 2}; |
| 174 | 90 | app.add_option("-c,--complex", comp); |
| ... | ... | @@ -181,40 +97,6 @@ TEST_CASE_METHOD(TApp, "ComplexIgnoreIOption", "[newparse]") { |
| 181 | 97 | CHECK(comp.imag() == Approx(3)); |
| 182 | 98 | } |
| 183 | 99 | |
| 184 | -TEST_CASE_METHOD(TApp, "ComplexSingleArg", "[newparse]") { | |
| 185 | - cx comp{1, 2}; | |
| 186 | - app.add_complex("-c,--complex", comp); | |
| 187 | - | |
| 188 | - args = {"-c", "4"}; | |
| 189 | - run(); | |
| 190 | - CHECK(comp.real() == Approx(4)); | |
| 191 | - CHECK(comp.imag() == Approx(0)); | |
| 192 | - | |
| 193 | - args = {"-c", "4-2i"}; | |
| 194 | - run(); | |
| 195 | - CHECK(comp.real() == Approx(4)); | |
| 196 | - CHECK(comp.imag() == Approx(-2)); | |
| 197 | - args = {"-c", "4+2i"}; | |
| 198 | - run(); | |
| 199 | - CHECK(comp.real() == Approx(4)); | |
| 200 | - CHECK(comp.imag() == Approx(2)); | |
| 201 | - | |
| 202 | - args = {"-c", "-4+2j"}; | |
| 203 | - run(); | |
| 204 | - CHECK(comp.real() == Approx(-4)); | |
| 205 | - CHECK(comp.imag() == Approx(2)); | |
| 206 | - | |
| 207 | - args = {"-c", "-4.2-2j"}; | |
| 208 | - run(); | |
| 209 | - CHECK(comp.real() == Approx(-4.2)); | |
| 210 | - CHECK(comp.imag() == Approx(-2)); | |
| 211 | - | |
| 212 | - args = {"-c", "-4.2-2.7i"}; | |
| 213 | - run(); | |
| 214 | - CHECK(comp.real() == Approx(-4.2)); | |
| 215 | - CHECK(comp.imag() == Approx(-2.7)); | |
| 216 | -} | |
| 217 | - | |
| 218 | 100 | TEST_CASE_METHOD(TApp, "ComplexSingleArgOption", "[newparse]") { |
| 219 | 101 | cx comp{1, 2}; |
| 220 | 102 | app.add_option("-c,--complex", comp); |
| ... | ... | @@ -249,29 +131,6 @@ TEST_CASE_METHOD(TApp, "ComplexSingleArgOption", "[newparse]") { |
| 249 | 131 | CHECK(comp.imag() == Approx(-2.7)); |
| 250 | 132 | } |
| 251 | 133 | |
| 252 | -TEST_CASE_METHOD(TApp, "ComplexSingleImag", "[newparse]") { | |
| 253 | - cx comp{1, 2}; | |
| 254 | - app.add_complex("-c,--complex", comp); | |
| 255 | - | |
| 256 | - args = {"-c", "4j"}; | |
| 257 | - run(); | |
| 258 | - CHECK(comp.real() == Approx(0)); | |
| 259 | - CHECK(comp.imag() == Approx(4)); | |
| 260 | - | |
| 261 | - args = {"-c", "-4j"}; | |
| 262 | - run(); | |
| 263 | - CHECK(comp.real() == Approx(0)); | |
| 264 | - CHECK(comp.imag() == Approx(-4)); | |
| 265 | - args = {"-c", "-4"}; | |
| 266 | - run(); | |
| 267 | - CHECK(comp.real() == Approx(-4)); | |
| 268 | - CHECK(comp.imag() == Approx(0)); | |
| 269 | - args = {"-c", "+4"}; | |
| 270 | - run(); | |
| 271 | - CHECK(comp.real() == Approx(4)); | |
| 272 | - CHECK(comp.imag() == Approx(0)); | |
| 273 | -} | |
| 274 | - | |
| 275 | 134 | TEST_CASE_METHOD(TApp, "ComplexSingleImagOption", "[newparse]") { |
| 276 | 135 | cx comp{1, 2}; |
| 277 | 136 | app.add_option("-c,--complex", comp); | ... | ... |