diff --git a/include/CLI/App.hpp b/include/CLI/App.hpp index bae90197..8a17c80b 100644 --- a/include/CLI/App.hpp +++ b/include/CLI/App.hpp @@ -80,6 +80,9 @@ class App { /// /// This is faster and cleaner than storing just a list of strings and reparsing. This may contain the -- separator. missing_t missing_; + + /// This is a list of pointers to options with the orignal parse order + std::vector parse_order_; ///@} /// @name Subcommands @@ -710,6 +713,11 @@ class App { return local_name == name_to_check; } + + /// This gets a vector of pointers with the original parse order + const std::vector &parse_order() const { + return parse_order_; + } ///@} @@ -949,6 +957,7 @@ class App { (static_cast(opt->count()) < opt->get_expected() || opt->get_expected() < 0)) { opt->add_result(positional); + parse_order_.push_back(opt.get()); args.pop_back(); return; } @@ -1011,18 +1020,21 @@ class App { int num = op->get_expected(); - if(num == 0) + if(num == 0) { op->add_result(""); - else if(rest != "") { + parse_order_.push_back(op.get()); + } else if(rest != "") { if(num > 0) num--; op->add_result(rest); + parse_order_.push_back(op.get()); rest = ""; } if(num == -1) { while(!args.empty() && _recognize(args.back()) == detail::Classifer::NONE) { op->add_result(args.back()); + parse_order_.push_back(op.get()); args.pop_back(); } } else @@ -1031,6 +1043,7 @@ class App { std::string current_ = args.back(); args.pop_back(); op->add_result(current_); + parse_order_.push_back(op.get()); } if(rest != "") { @@ -1075,19 +1088,23 @@ class App { if(num != -1) num--; op->add_result(value); + parse_order_.push_back(op.get()); } else if(num == 0) { op->add_result(""); + parse_order_.push_back(op.get()); } if(num == -1) { while(!args.empty() && _recognize(args.back()) == detail::Classifer::NONE) { op->add_result(args.back()); + parse_order_.push_back(op.get()); args.pop_back(); } } else while(num > 0 && !args.empty()) { num--; op->add_result(args.back()); + parse_order_.push_back(op.get()); args.pop_back(); } return; diff --git a/tests/AppTest.cpp b/tests/AppTest.cpp index ca19f33a..283054dd 100644 --- a/tests/AppTest.cpp +++ b/tests/AppTest.cpp @@ -501,6 +501,23 @@ TEST_F(TApp, VectorFancyOpts) { EXPECT_THROW(run(), CLI::ParseError); } +TEST_F(TApp, OriginalOrder) { + std::vector st1; + CLI::Option* op1 = app.add_option("-a", st1); + std::vector st2; + CLI::Option* op2 = app.add_option("-b", st2); + + args = {"-a", "1", "-b", "2", "-a3", "-a", "4"}; + + run(); + + EXPECT_EQ(st1, std::vector({1,3,4})); + EXPECT_EQ(st2, std::vector({2})); + + EXPECT_EQ(app.parse_order(), std::vector({op1, op2, op1, op1})); + +} + TEST_F(TApp, RequiresFlags) { CLI::Option *opt = app.add_flag("-s,--string"); app.add_flag("--both")->requires(opt);