Add support for removing an option from a genericparser
authorChris Lattner <sabre@nondot.org>
Tue, 23 Jul 2002 17:15:09 +0000 (17:15 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 23 Jul 2002 17:15:09 +0000 (17:15 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2998 91177308-0d34-0410-b5e6-96231b3b80d8

include/Support/CommandLine.h
include/llvm/Support/CommandLine.h

index 9e02a6cf41712a74637c8448506d3a3d407e0b34..633227adc388b70e47915f9b1ebed36086145b56 100644 (file)
@@ -372,6 +372,11 @@ struct generic_parser_base {
       return ValueDisallowed;
   }
 
+  // findOption - Return the option number corresponding to the specified
+  // argument string.  If the option is not found, getNumOptions() is returned.
+  //
+  unsigned findOption(const char *Name);
+
 protected:
   bool hasArgStr;
 };
@@ -384,8 +389,10 @@ protected:
 //
 template <class DataType>
 class parser : public generic_parser_base {
+protected:
   std::vector<std::pair<const char *,
                         std::pair<DataType, const char *> > > Values;
+public:
 
   // Implement virtual functions needed by generic_parser_base
   unsigned getNumOptions() const { return Values.size(); }
@@ -394,7 +401,6 @@ class parser : public generic_parser_base {
     return Values[N].second.second;
   }
 
-public:
   // Default implementation, requires user to populate it with values somehow.
   template<class Opt>   // parse - Return true on error.
   bool parse(Opt &O, const char *ArgName, const string &Arg) {
@@ -416,8 +422,17 @@ public:
   // addLiteralOption - Add an entry to the mapping table...
   template <class DT>
   void addLiteralOption(const char *Name, const DT &V, const char *HelpStr) {
+    assert(findOption(Name) == Values.size() && "Option already exists!");
     Values.push_back(std::make_pair(Name, std::make_pair((DataType)V,HelpStr)));
   }
+
+  // removeLiteralOption - Remove the specified option.
+  //
+  void removeLiteralOption(const char *Name) {
+    unsigned N = findOption(Name);
+    assert(N != Values.size() && "Option not found!");
+    Values.erase(Values.begin()+N);
+  }
 };
 
 
index 9e02a6cf41712a74637c8448506d3a3d407e0b34..633227adc388b70e47915f9b1ebed36086145b56 100644 (file)
@@ -372,6 +372,11 @@ struct generic_parser_base {
       return ValueDisallowed;
   }
 
+  // findOption - Return the option number corresponding to the specified
+  // argument string.  If the option is not found, getNumOptions() is returned.
+  //
+  unsigned findOption(const char *Name);
+
 protected:
   bool hasArgStr;
 };
@@ -384,8 +389,10 @@ protected:
 //
 template <class DataType>
 class parser : public generic_parser_base {
+protected:
   std::vector<std::pair<const char *,
                         std::pair<DataType, const char *> > > Values;
+public:
 
   // Implement virtual functions needed by generic_parser_base
   unsigned getNumOptions() const { return Values.size(); }
@@ -394,7 +401,6 @@ class parser : public generic_parser_base {
     return Values[N].second.second;
   }
 
-public:
   // Default implementation, requires user to populate it with values somehow.
   template<class Opt>   // parse - Return true on error.
   bool parse(Opt &O, const char *ArgName, const string &Arg) {
@@ -416,8 +422,17 @@ public:
   // addLiteralOption - Add an entry to the mapping table...
   template <class DT>
   void addLiteralOption(const char *Name, const DT &V, const char *HelpStr) {
+    assert(findOption(Name) == Values.size() && "Option already exists!");
     Values.push_back(std::make_pair(Name, std::make_pair((DataType)V,HelpStr)));
   }
+
+  // removeLiteralOption - Remove the specified option.
+  //
+  void removeLiteralOption(const char *Name) {
+    unsigned N = findOption(Name);
+    assert(N != Values.size() && "Option not found!");
+    Values.erase(Values.begin()+N);
+  }
 };