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);