[llvm] r311887 - [Support][CommandLine] Add cl::Option::setDefault()

Evgeny Mankov via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 28 06:39:43 PDT 2017


Author: emankov
Date: Mon Aug 28 06:39:43 2017
New Revision: 311887

URL: http://llvm.org/viewvc/llvm-project?rev=311887&view=rev
Log:
[Support][CommandLine] Add cl::Option::setDefault()

Add abstract virtual method setDefault() to class Option and implement it in its inheritors in order to be able to set all the options to its default values in user's code without actually knowing all these options. For instance:

for (auto &OM : cl::getRegisteredOptions(*cl::TopLevelSubCommand)) {
  cl::Option *O = OM.second;
  O->setDefault();
}

Reviewed by: rampitec, Eugene.Zelenko, kasaurov

Differential Revision: http://reviews.llvm.org/D36877

Modified:
    llvm/trunk/include/llvm/Support/CommandLine.h
    llvm/trunk/unittests/Support/CommandLineTest.cpp

Modified: llvm/trunk/include/llvm/Support/CommandLine.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/CommandLine.h?rev=311887&r1=311886&r2=311887&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/CommandLine.h (original)
+++ llvm/trunk/include/llvm/Support/CommandLine.h Mon Aug 28 06:39:43 2017
@@ -349,6 +349,8 @@ public:
 
   virtual void printOptionValue(size_t GlobalWidth, bool Force) const = 0;
 
+  virtual void setDefault() = 0;
+
   static void printHelpStr(StringRef HelpStr, size_t Indent,
                            size_t FirstLineIndentedBy);
 
@@ -1318,6 +1320,20 @@ class opt : public Option,
     }
   }
 
+  template <class T, class = typename std::enable_if<
+            std::is_assignable<T&, T>::value>::type>
+  void setDefaultImpl() {
+    const OptionValue<DataType> &V = this->getDefault();
+    if (V.hasValue())
+      this->setValue(V.getValue());
+  }
+
+  template <class T, class = typename std::enable_if<
+            !std::is_assignable<T&, T>::value>::type>
+  void setDefaultImpl(...) {}
+
+  void setDefault() override { setDefaultImpl<DataType>(); }
+
   void done() {
     addArgument();
     Parser.initialize();
@@ -1493,6 +1509,8 @@ class list : public Option, public list_
   void printOptionValue(size_t /*GlobalWidth*/, bool /*Force*/) const override {
   }
 
+  void setDefault() override {}
+
   void done() {
     addArgument();
     Parser.initialize();
@@ -1634,6 +1652,8 @@ class bits : public Option, public bits_
   void printOptionValue(size_t /*GlobalWidth*/, bool /*Force*/) const override {
   }
 
+  void setDefault() override {}
+
   void done() {
     addArgument();
     Parser.initialize();
@@ -1684,6 +1704,8 @@ class alias : public Option {
   void printOptionValue(size_t /*GlobalWidth*/, bool /*Force*/) const override {
   }
 
+  void setDefault() override { AliasFor->setDefault(); }
+
   ValueExpected getValueExpectedFlagDefault() const override {
     return AliasFor->getValueExpectedFlag();
   }

Modified: llvm/trunk/unittests/Support/CommandLineTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/CommandLineTest.cpp?rev=311887&r1=311886&r2=311887&view=diff
==============================================================================
--- llvm/trunk/unittests/Support/CommandLineTest.cpp (original)
+++ llvm/trunk/unittests/Support/CommandLineTest.cpp Mon Aug 28 06:39:43 2017
@@ -613,4 +613,39 @@ TEST(CommandLineTest, ResponseFiles) {
   llvm::sys::fs::remove(TestDir);
 }
 
+TEST(CommandLineTest, SetDefautValue) {
+  cl::ResetCommandLineParser();
+
+  StackOption<std::string> Opt1("opt1", cl::init("true"));
+  StackOption<bool> Opt2("opt2", cl::init(true));
+  cl::alias Alias("alias", llvm::cl::aliasopt(Opt2));
+  StackOption<int> Opt3("opt3", cl::init(3));
+
+  const char *args[] = {"prog", "-opt1=false", "-opt2", "-opt3"};
+
+  EXPECT_TRUE(
+    cl::ParseCommandLineOptions(2, args, StringRef(), &llvm::nulls()));
+
+  EXPECT_TRUE(Opt1 == "false");
+  EXPECT_TRUE(Opt2);
+  EXPECT_TRUE(Opt3 == 3);
+
+  Opt2 = false;
+  Opt3 = 1;
+
+  cl::ResetAllOptionOccurrences();
+
+  for (auto &OM : cl::getRegisteredOptions(*cl::TopLevelSubCommand)) {
+    cl::Option *O = OM.second;
+    if (O->ArgStr == "opt2") {
+      continue;
+    }
+    O->setDefault();
+  }
+
+  EXPECT_TRUE(Opt1 == "true");
+  EXPECT_TRUE(Opt2);
+  EXPECT_TRUE(Opt3 == 3);
+}
+
 }  // anonymous namespace




More information about the llvm-commits mailing list