lib/Support/CommandLine.cpp:
[oota-llvm.git] / include / Support / CommandLine.h
1 //===- Support/CommandLine.h - Flexible Command line parser ------*- C++ -*--=//
2 //
3 // This class implements a command line argument processor that is useful when
4 // creating a tool.  It provides a simple, minimalistic interface that is easily
5 // extensible and supports nonlocal (library) command line options.
6 //
7 // Note that rather than trying to figure out what this code does, you should
8 // read the library documentation located in docs/CommandLine.html or looks at
9 // the many example usages in tools/*/*.cpp
10 //
11 //===----------------------------------------------------------------------===//
12
13 #ifndef SUPPORT_COMMANDLINE_H
14 #define SUPPORT_COMMANDLINE_H
15
16 #include <string>
17 #include <vector>
18 #include <utility>
19 #include <cstdarg>
20 #include <cassert>
21 #include "boost/type_traits/object_traits.hpp"
22
23 /// cl Namespace - This namespace contains all of the command line option
24 /// processing machinery.  It is intentionally a short name to make qualified
25 /// usage concise.
26 namespace cl {
27
28 //===----------------------------------------------------------------------===//
29 // ParseCommandLineOptions - Command line option processing entry point.
30 //
31 void ParseCommandLineOptions(int &argc, char **argv,
32                              const char *Overview = 0);
33
34 //===----------------------------------------------------------------------===//
35 // ParseEnvironmentOptions - Environment variable option processing alternate
36 //                           entry point.
37 //
38 void ParseEnvironmentOptions(const char *progName, const char *envvar,
39                              const char *Overview = 0);
40
41 //===----------------------------------------------------------------------===//
42 // Flags permitted to be passed to command line arguments
43 //
44
45 enum NumOccurrences {           // Flags for the number of occurrences allowed
46   Optional        = 0x01,      // Zero or One occurrence
47   ZeroOrMore      = 0x02,      // Zero or more occurrences allowed
48   Required        = 0x03,      // One occurrence required
49   OneOrMore       = 0x04,      // One or more occurrences required
50
51   // ConsumeAfter - Indicates that this option is fed anything that follows the
52   // last positional argument required by the application (it is an error if
53   // there are zero positional arguments, and a ConsumeAfter option is used).
54   // Thus, for example, all arguments to LLI are processed until a filename is
55   // found.  Once a filename is found, all of the succeeding arguments are
56   // passed, unprocessed, to the ConsumeAfter option.
57   //
58   ConsumeAfter    = 0x05,
59
60   OccurrencesMask  = 0x07,
61 };
62
63 enum ValueExpected {           // Is a value required for the option?
64   ValueOptional   = 0x08,      // The value can appear... or not
65   ValueRequired   = 0x10,      // The value is required to appear!
66   ValueDisallowed = 0x18,      // A value may not be specified (for flags)
67   ValueMask       = 0x18,
68 };
69
70 enum OptionHidden {            // Control whether -help shows this option
71   NotHidden       = 0x20,      // Option included in --help & --help-hidden
72   Hidden          = 0x40,      // -help doesn't, but --help-hidden does
73   ReallyHidden    = 0x60,      // Neither --help nor --help-hidden show this arg
74   HiddenMask      = 0x60,
75 };
76
77 // Formatting flags - This controls special features that the option might have
78 // that cause it to be parsed differently...
79 //
80 // Prefix - This option allows arguments that are otherwise unrecognized to be
81 // matched by options that are a prefix of the actual value.  This is useful for
82 // cases like a linker, where options are typically of the form '-lfoo' or
83 // '-L../../include' where -l or -L are the actual flags.  When prefix is
84 // enabled, and used, the value for the flag comes from the suffix of the
85 // argument.
86 //
87 // Grouping - With this option enabled, multiple letter options are allowed to
88 // bunch together with only a single hyphen for the whole group.  This allows
89 // emulation of the behavior that ls uses for example: ls -la === ls -l -a
90 //
91
92 enum FormattingFlags {
93   NormalFormatting = 0x000,     // Nothing special
94   Positional       = 0x080,     // Is a positional argument, no '-' required
95   Prefix           = 0x100,     // Can this option directly prefix its value?
96   Grouping         = 0x180,     // Can this option group with other options?
97   FormattingMask   = 0x180,
98 };
99
100 enum MiscFlags {                // Miscellaneous flags to adjust argument
101   CommaSeparated   = 0x200,     // Should this cl::list split between commas?
102   MiscMask         = 0x200,
103 };
104
105
106
107 //===----------------------------------------------------------------------===//
108 // Option Base class
109 //
110 class alias;
111 class Option {
112   friend void cl::ParseCommandLineOptions(int &, char **, const char *, int);
113   friend class alias;
114
115   // handleOccurrences - Overriden by subclasses to handle the value passed into
116   // an argument.  Should return true if there was an error processing the
117   // argument and the program should exit.
118   //
119   virtual bool handleOccurrence(const char *ArgName, const std::string &Arg) = 0;
120
121   virtual enum NumOccurrences getNumOccurrencesFlagDefault() const { 
122     return Optional;
123   }
124   virtual enum ValueExpected getValueExpectedFlagDefault() const {
125     return ValueOptional; 
126   }
127   virtual enum OptionHidden getOptionHiddenFlagDefault() const {
128     return NotHidden;
129   }
130   virtual enum FormattingFlags getFormattingFlagDefault() const {
131     return NormalFormatting;
132   }
133
134   int NumOccurrences;    // The number of times specified
135   int Flags;            // Flags for the argument
136 public:
137   const char *ArgStr;   // The argument string itself (ex: "help", "o")
138   const char *HelpStr;  // The descriptive text message for --help
139   const char *ValueStr; // String describing what the value of this option is
140
141   inline enum NumOccurrences getNumOccurrencesFlag() const {
142     int NO = Flags & OccurrencesMask;
143     return NO ? (enum NumOccurrences)NO : getNumOccurrencesFlagDefault();
144   }
145   inline enum ValueExpected getValueExpectedFlag() const {
146     int VE = Flags & ValueMask;
147     return VE ? (enum ValueExpected)VE : getValueExpectedFlagDefault();
148   }
149   inline enum OptionHidden getOptionHiddenFlag() const {
150     int OH = Flags & HiddenMask;
151     return OH ? (enum OptionHidden)OH : getOptionHiddenFlagDefault();
152   }
153   inline enum FormattingFlags getFormattingFlag() const {
154     int OH = Flags & FormattingMask;
155     return OH ? (enum FormattingFlags)OH : getFormattingFlagDefault();
156   }
157   inline unsigned getMiscFlags() const {
158     return Flags & MiscMask;
159   }
160
161   // hasArgStr - Return true if the argstr != ""
162   bool hasArgStr() const { return ArgStr[0] != 0; }
163
164   //-------------------------------------------------------------------------===
165   // Accessor functions set by OptionModifiers
166   //
167   void setArgStr(const char *S) { ArgStr = S; }
168   void setDescription(const char *S) { HelpStr = S; }
169   void setValueStr(const char *S) { ValueStr = S; }
170
171   void setFlag(unsigned Flag, unsigned FlagMask) {
172     if (Flags & FlagMask) {
173       error(": Specified two settings for the same option!");
174       exit(1);
175     }
176
177     Flags |= Flag;
178   }
179
180   void setNumOccurrencesFlag(enum NumOccurrences Val) {
181     setFlag(Val, OccurrencesMask);
182   }
183   void setValueExpectedFlag(enum ValueExpected Val) { setFlag(Val, ValueMask); }
184   void setHiddenFlag(enum OptionHidden Val) { setFlag(Val, HiddenMask); }
185   void setFormattingFlag(enum FormattingFlags V) { setFlag(V, FormattingMask); }
186   void setMiscFlag(enum MiscFlags M) { setFlag(M, M); }
187 protected:
188   Option() : NumOccurrences(0), Flags(0),
189              ArgStr(""), HelpStr(""), ValueStr("") {}
190
191 public:
192   // addArgument - Tell the system that this Option subclass will handle all
193   // occurrences of -ArgStr on the command line.
194   //
195   void addArgument(const char *ArgStr);
196   void removeArgument(const char *ArgStr);
197
198   // Return the width of the option tag for printing...
199   virtual unsigned getOptionWidth() const = 0;
200
201   // printOptionInfo - Print out information about this option.  The 
202   // to-be-maintained width is specified.
203   //
204   virtual void printOptionInfo(unsigned GlobalWidth) const = 0;
205
206   // addOccurrence - Wrapper around handleOccurrence that enforces Flags
207   //
208   bool addOccurrence(const char *ArgName, const std::string &Value);
209
210   // Prints option name followed by message.  Always returns true.
211   bool error(std::string Message, const char *ArgName = 0);
212
213 public:
214   inline int getNumOccurrences() const { return NumOccurrences; }
215   virtual ~Option() {}
216 };
217
218
219 //===----------------------------------------------------------------------===//
220 // Command line option modifiers that can be used to modify the behavior of
221 // command line option parsers...
222 //
223
224 // desc - Modifier to set the description shown in the --help output...
225 struct desc {
226   const char *Desc;
227   desc(const char *Str) : Desc(Str) {}
228   void apply(Option &O) const { O.setDescription(Desc); }
229 };
230
231 // value_desc - Modifier to set the value description shown in the --help
232 // output...
233 struct value_desc {
234   const char *Desc;
235   value_desc(const char *Str) : Desc(Str) {}
236   void apply(Option &O) const { O.setValueStr(Desc); }
237 };
238
239
240 // init - Specify a default (initial) value for the command line argument, if
241 // the default constructor for the argument type does not give you what you
242 // want.  This is only valid on "opt" arguments, not on "list" arguments.
243 //
244 template<class Ty>
245 struct initializer {
246   const Ty &Init;
247   initializer(const Ty &Val) : Init(Val) {}
248
249   template<class Opt>
250   void apply(Opt &O) const { O.setInitialValue(Init); }
251 };
252
253 template<class Ty>
254 initializer<Ty> init(const Ty &Val) {
255   return initializer<Ty>(Val);
256 }
257
258
259 // location - Allow the user to specify which external variable they want to
260 // store the results of the command line argument processing into, if they don't
261 // want to store it in the option itself.
262 //
263 template<class Ty>
264 struct LocationClass {
265   Ty &Loc;
266   LocationClass(Ty &L) : Loc(L) {}
267
268   template<class Opt>
269   void apply(Opt &O) const { O.setLocation(O, Loc); }
270 };
271
272 template<class Ty>
273 LocationClass<Ty> location(Ty &L) { return LocationClass<Ty>(L); }
274
275
276 //===----------------------------------------------------------------------===//
277 // Enum valued command line option
278 //
279 #define clEnumVal(ENUMVAL, DESC) #ENUMVAL, (int)ENUMVAL, DESC
280 #define clEnumValN(ENUMVAL, FLAGNAME, DESC) FLAGNAME, (int)ENUMVAL, DESC
281
282 // values - For custom data types, allow specifying a group of values together
283 // as the values that go into the mapping that the option handler uses.  Note
284 // that the values list must always have a 0 at the end of the list to indicate
285 // that the list has ended.
286 //
287 template<class DataType>
288 class ValuesClass {
289   // Use a vector instead of a map, because the lists should be short,
290   // the overhead is less, and most importantly, it keeps them in the order
291   // inserted so we can print our option out nicely.
292   std::vector<std::pair<const char *, std::pair<int, const char *> > > Values;
293   void processValues(va_list Vals);
294 public:
295   ValuesClass(const char *EnumName, DataType Val, const char *Desc, 
296               va_list ValueArgs) {
297     // Insert the first value, which is required.
298     Values.push_back(std::make_pair(EnumName, std::make_pair(Val, Desc)));
299
300     // Process the varargs portion of the values...
301     while (const char *EnumName = va_arg(ValueArgs, const char *)) {
302       DataType EnumVal = (DataType)va_arg(ValueArgs, int);
303       const char *EnumDesc = va_arg(ValueArgs, const char *);
304       Values.push_back(std::make_pair(EnumName,      // Add value to value map
305                                       std::make_pair(EnumVal, EnumDesc)));
306     }
307   }
308
309   template<class Opt>
310   void apply(Opt &O) const {
311     for (unsigned i = 0, e = Values.size(); i != e; ++i)
312       O.getParser().addLiteralOption(Values[i].first, Values[i].second.first,
313                                      Values[i].second.second);
314   }
315 };
316
317 template<class DataType>
318 ValuesClass<DataType> values(const char *Arg, DataType Val, const char *Desc,
319                              ...) {
320     va_list ValueArgs;
321     va_start(ValueArgs, Desc);
322     ValuesClass<DataType> Vals(Arg, Val, Desc, ValueArgs);
323     va_end(ValueArgs);
324     return Vals;
325 }
326
327
328 //===----------------------------------------------------------------------===//
329 // parser class - Parameterizable parser for different data types.  By default,
330 // known data types (string, int, bool) have specialized parsers, that do what
331 // you would expect.  The default parser, used for data types that are not
332 // built-in, uses a mapping table to map specific options to values, which is
333 // used, among other things, to handle enum types.
334
335 //--------------------------------------------------
336 // generic_parser_base - This class holds all the non-generic code that we do
337 // not need replicated for every instance of the generic parser.  This also
338 // allows us to put stuff into CommandLine.cpp
339 //
340 struct generic_parser_base {
341   virtual ~generic_parser_base() {}  // Base class should have virtual-dtor
342
343   // getNumOptions - Virtual function implemented by generic subclass to
344   // indicate how many entries are in Values.
345   //
346   virtual unsigned getNumOptions() const = 0;
347
348   // getOption - Return option name N.
349   virtual const char *getOption(unsigned N) const = 0;
350   
351   // getDescription - Return description N
352   virtual const char *getDescription(unsigned N) const = 0;
353
354   // Return the width of the option tag for printing...
355   virtual unsigned getOptionWidth(const Option &O) const;
356
357   // printOptionInfo - Print out information about this option.  The 
358   // to-be-maintained width is specified.
359   //
360   virtual void printOptionInfo(const Option &O, unsigned GlobalWidth) const;
361
362   void initialize(Option &O) {
363     // All of the modifiers for the option have been processed by now, so the
364     // argstr field should be stable, copy it down now.
365     //
366     hasArgStr = O.hasArgStr();
367
368     // If there has been no argstr specified, that means that we need to add an
369     // argument for every possible option.  This ensures that our options are
370     // vectored to us.
371     //
372     if (!hasArgStr)
373       for (unsigned i = 0, e = getNumOptions(); i != e; ++i)
374         O.addArgument(getOption(i));
375   }
376
377   enum ValueExpected getValueExpectedFlagDefault() const {
378     // If there is an ArgStr specified, then we are of the form:
379     //
380     //    -opt=O2   or   -opt O2  or  -optO2
381     //
382     // In which case, the value is required.  Otherwise if an arg str has not
383     // been specified, we are of the form:
384     //
385     //    -O2 or O2 or -la (where -l and -a are separate options)
386     //
387     // If this is the case, we cannot allow a value.
388     //
389     if (hasArgStr)
390       return ValueRequired;
391     else
392       return ValueDisallowed;
393   }
394
395   // findOption - Return the option number corresponding to the specified
396   // argument string.  If the option is not found, getNumOptions() is returned.
397   //
398   unsigned findOption(const char *Name);
399
400 protected:
401   bool hasArgStr;
402 };
403
404 // Default parser implementation - This implementation depends on having a
405 // mapping of recognized options to values of some sort.  In addition to this,
406 // each entry in the mapping also tracks a help message that is printed with the
407 // command line option for --help.  Because this is a simple mapping parser, the
408 // data type can be any unsupported type.
409 //
410 template <class DataType>
411 class parser : public generic_parser_base {
412 protected:
413   std::vector<std::pair<const char *,
414                         std::pair<DataType, const char *> > > Values;
415 public:
416   typedef DataType parser_data_type;
417
418   // Implement virtual functions needed by generic_parser_base
419   unsigned getNumOptions() const { return Values.size(); }
420   const char *getOption(unsigned N) const { return Values[N].first; }
421   const char *getDescription(unsigned N) const {
422     return Values[N].second.second;
423   }
424
425   // parse - Return true on error.
426   bool parse(Option &O, const char *ArgName, const std::string &Arg,
427              DataType &V) {
428     std::string ArgVal;
429     if (hasArgStr)
430       ArgVal = Arg;
431     else
432       ArgVal = ArgName;
433
434     for (unsigned i = 0, e = Values.size(); i != e; ++i)
435       if (ArgVal == Values[i].first) {
436         V = Values[i].second.first;
437         return false;
438       }
439
440     return O.error(": Cannot find option named '" + ArgVal + "'!");
441   }
442
443   // addLiteralOption - Add an entry to the mapping table...
444   template <class DT>
445   void addLiteralOption(const char *Name, const DT &V, const char *HelpStr) {
446     assert(findOption(Name) == Values.size() && "Option already exists!");
447     Values.push_back(std::make_pair(Name, std::make_pair((DataType)V,HelpStr)));
448   }
449
450   // removeLiteralOption - Remove the specified option.
451   //
452   void removeLiteralOption(const char *Name) {
453     unsigned N = findOption(Name);
454     assert(N != Values.size() && "Option not found!");
455     Values.erase(Values.begin()+N);
456   }
457 };
458
459 //--------------------------------------------------
460 // basic_parser - Super class of parsers to provide boilerplate code
461 //
462 struct basic_parser_impl {  // non-template implementation of basic_parser<t>
463   virtual ~basic_parser_impl() {}
464
465   enum ValueExpected getValueExpectedFlagDefault() const {
466     return ValueRequired;
467   }
468   
469   void initialize(Option &O) {}
470   
471   // Return the width of the option tag for printing...
472   unsigned getOptionWidth(const Option &O) const;
473   
474   // printOptionInfo - Print out information about this option.  The
475   // to-be-maintained width is specified.
476   //
477   void printOptionInfo(const Option &O, unsigned GlobalWidth) const;
478
479
480   // getValueName - Overload in subclass to provide a better default value.
481   virtual const char *getValueName() const { return "value"; }
482 };
483
484 // basic_parser - The real basic parser is just a template wrapper that provides
485 // a typedef for the provided data type.
486 //
487 template<class DataType>
488 struct basic_parser : public basic_parser_impl {
489   typedef DataType parser_data_type;
490 };
491
492
493 //--------------------------------------------------
494 // parser<bool>
495 //
496 template<>
497 struct parser<bool> : public basic_parser<bool> {
498
499   // parse - Return true on error.
500   bool parse(Option &O, const char *ArgName, const std::string &Arg, bool &Val);
501
502   enum ValueExpected getValueExpectedFlagDefault() const {
503     return ValueOptional; 
504   }
505
506   // getValueName - Do not print =<value> at all
507   virtual const char *getValueName() const { return 0; }
508 };
509
510
511 //--------------------------------------------------
512 // parser<int>
513 //
514 template<>
515 struct parser<int> : public basic_parser<int> {
516   
517   // parse - Return true on error.
518   bool parse(Option &O, const char *ArgName, const std::string &Arg, int &Val);
519
520   // getValueName - Overload in subclass to provide a better default value.
521   virtual const char *getValueName() const { return "int"; }
522 };
523
524
525 //--------------------------------------------------
526 // parser<unsigned>
527 //
528 template<>
529 struct parser<unsigned> : public basic_parser<unsigned> {
530   
531   // parse - Return true on error.
532   bool parse(Option &O, const char *ArgName, const std::string &Arg,
533              unsigned &Val);
534
535   // getValueName - Overload in subclass to provide a better default value.
536   virtual const char *getValueName() const { return "uint"; }
537 };
538
539
540 //--------------------------------------------------
541 // parser<double>
542 //
543 template<>
544 struct parser<double> : public basic_parser<double> {
545   // parse - Return true on error.
546   bool parse(Option &O, const char *AN, const std::string &Arg, double &Val);
547
548   // getValueName - Overload in subclass to provide a better default value.
549   virtual const char *getValueName() const { return "number"; }
550 };
551
552
553 //--------------------------------------------------
554 // parser<float>
555 //
556 template<>
557 struct parser<float> : public basic_parser<float> {
558   // parse - Return true on error.
559   bool parse(Option &O, const char *AN, const std::string &Arg, float &Val);
560
561   // getValueName - Overload in subclass to provide a better default value.
562   virtual const char *getValueName() const { return "number"; }
563 };
564
565
566 //--------------------------------------------------
567 // parser<std::string>
568 //
569 template<>
570 struct parser<std::string> : public basic_parser<std::string> {
571   // parse - Return true on error.
572   bool parse(Option &O, const char *ArgName, const std::string &Arg,
573              std::string &Value) {
574     Value = Arg;
575     return false;
576   }
577
578   // getValueName - Overload in subclass to provide a better default value.
579   virtual const char *getValueName() const { return "string"; }
580 };
581
582
583
584 //===----------------------------------------------------------------------===//
585 // applicator class - This class is used because we must use partial
586 // specialization to handle literal string arguments specially (const char* does
587 // not correctly respond to the apply method).  Because the syntax to use this
588 // is a pain, we have the 'apply' method below to handle the nastiness...
589 //
590 template<class Mod> struct applicator {
591   template<class Opt>
592   static void opt(const Mod &M, Opt &O) { M.apply(O); }
593 };
594
595 // Handle const char* as a special case...
596 template<unsigned n> struct applicator<char[n]> {
597   template<class Opt>
598   static void opt(const char *Str, Opt &O) { O.setArgStr(Str); }
599 };
600 template<unsigned n> struct applicator<const char[n]> {
601   template<class Opt>
602   static void opt(const char *Str, Opt &O) { O.setArgStr(Str); }
603 };
604 template<> struct applicator<const char*> {
605   template<class Opt>
606   static void opt(const char *Str, Opt &O) { O.setArgStr(Str); }
607 };
608
609 template<> struct applicator<NumOccurrences> {
610   static void opt(NumOccurrences NO, Option &O) { O.setNumOccurrencesFlag(NO); }
611 };
612 template<> struct applicator<ValueExpected> {
613   static void opt(ValueExpected VE, Option &O) { O.setValueExpectedFlag(VE); }
614 };
615 template<> struct applicator<OptionHidden> {
616   static void opt(OptionHidden OH, Option &O) { O.setHiddenFlag(OH); }
617 };
618 template<> struct applicator<FormattingFlags> {
619   static void opt(FormattingFlags FF, Option &O) { O.setFormattingFlag(FF); }
620 };
621 template<> struct applicator<MiscFlags> {
622   static void opt(MiscFlags MF, Option &O) { O.setMiscFlag(MF); }
623 };
624
625 // apply method - Apply a modifier to an option in a type safe way.
626 template<class Mod, class Opt>
627 void apply(const Mod &M, Opt *O) {
628   applicator<Mod>::opt(M, *O);
629 }
630
631
632 //===----------------------------------------------------------------------===//
633 // opt_storage class
634
635 // Default storage class definition: external storage.  This implementation
636 // assumes the user will specify a variable to store the data into with the
637 // cl::location(x) modifier.
638 //
639 template<class DataType, bool ExternalStorage, bool isClass>
640 class opt_storage {
641   DataType *Location;   // Where to store the object...
642
643   void check() {
644     assert(Location != 0 && "cl::location(...) not specified for a command "
645            "line option with external storage!");
646   }
647 public:
648   opt_storage() : Location(0) {}
649
650   bool setLocation(Option &O, DataType &L) {
651     if (Location)
652       return O.error(": cl::location(x) specified more than once!");
653     Location = &L;
654     return false;
655   }
656
657   template<class T>
658   void setValue(const T &V) {
659     check();
660     *Location = V;
661   }
662
663   DataType &getValue() { check(); return *Location; }
664   const DataType &getValue() const { check(); return *Location; }
665 };
666
667
668 // Define how to hold a class type object, such as a string.  Since we can
669 // inherit from a class, we do so.  This makes us exactly compatible with the
670 // object in all cases that it is used.
671 //
672 template<class DataType>
673 struct opt_storage<DataType,false,true> : public DataType {
674
675   template<class T>
676   void setValue(const T &V) { DataType::operator=(V); }
677
678   DataType &getValue() { return *this; }
679   const DataType &getValue() const { return *this; }
680 };
681
682 // Define a partial specialization to handle things we cannot inherit from.  In
683 // this case, we store an instance through containment, and overload operators
684 // to get at the value.
685 //
686 template<class DataType>
687 struct opt_storage<DataType, false, false> {
688   DataType Value;
689
690   // Make sure we initialize the value with the default constructor for the
691   // type.
692   opt_storage() : Value(DataType()) {}
693
694   template<class T>
695   void setValue(const T &V) { Value = V; }
696   DataType &getValue() { return Value; }
697   DataType getValue() const { return Value; }
698 };
699
700
701 //===----------------------------------------------------------------------===//
702 // opt - A scalar command line option.
703 //
704 template <class DataType, bool ExternalStorage = false,
705           class ParserClass = parser<DataType> >
706 class opt : public Option, 
707             public opt_storage<DataType, ExternalStorage,
708                                ::boost::is_class<DataType>::value> {
709   ParserClass Parser;
710
711   virtual bool handleOccurrence(const char *ArgName, const std::string &Arg) {
712     typename ParserClass::parser_data_type Val;
713     if (Parser.parse(*this, ArgName, Arg, Val))
714       return true;                            // Parse error!
715     setValue(Val);
716     return false;
717   }
718
719   virtual enum ValueExpected getValueExpectedFlagDefault() const {
720     return Parser.getValueExpectedFlagDefault();
721   }
722
723   // Forward printing stuff to the parser...
724   virtual unsigned getOptionWidth() const {return Parser.getOptionWidth(*this);}
725   virtual void printOptionInfo(unsigned GlobalWidth) const {
726     Parser.printOptionInfo(*this, GlobalWidth);
727   }
728
729   void done() {
730     addArgument(ArgStr);
731     Parser.initialize(*this);
732   }
733 public:
734   // setInitialValue - Used by the cl::init modifier...
735   void setInitialValue(const DataType &V) { setValue(V); }
736
737   ParserClass &getParser() { return Parser; }
738
739   operator DataType() const { return getValue(); }
740
741   template<class T>
742   DataType &operator=(const T &Val) { setValue(Val); return getValue(); }
743
744   // One option...
745   template<class M0t>
746   opt(const M0t &M0) {
747     apply(M0, this);
748     done();
749   }
750
751   // Two options...
752   template<class M0t, class M1t>
753   opt(const M0t &M0, const M1t &M1) {
754     apply(M0, this); apply(M1, this);
755     done();
756   }
757
758   // Three options...
759   template<class M0t, class M1t, class M2t>
760   opt(const M0t &M0, const M1t &M1, const M2t &M2) {
761     apply(M0, this); apply(M1, this); apply(M2, this);
762     done();
763   }
764   // Four options...
765   template<class M0t, class M1t, class M2t, class M3t>
766   opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3) {
767     apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
768     done();
769   }
770   // Five options...
771   template<class M0t, class M1t, class M2t, class M3t, class M4t>
772   opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
773       const M4t &M4) {
774     apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
775     apply(M4, this);
776     done();
777   }
778   // Six options...
779   template<class M0t, class M1t, class M2t, class M3t,
780            class M4t, class M5t>
781   opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
782       const M4t &M4, const M5t &M5) {
783     apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
784     apply(M4, this); apply(M5, this);
785     done();
786   }
787   // Seven options...
788   template<class M0t, class M1t, class M2t, class M3t,
789            class M4t, class M5t, class M6t>
790   opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
791       const M4t &M4, const M5t &M5, const M6t &M6) {
792     apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
793     apply(M4, this); apply(M5, this); apply(M6, this);
794     done();
795   }
796   // Eight options...
797   template<class M0t, class M1t, class M2t, class M3t,
798            class M4t, class M5t, class M6t, class M7t>
799   opt(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
800       const M4t &M4, const M5t &M5, const M6t &M6, const M7t &M7) {
801     apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
802     apply(M4, this); apply(M5, this); apply(M6, this); apply(M7, this);
803     done();
804   }
805 };
806
807 //===----------------------------------------------------------------------===//
808 // list_storage class
809
810 // Default storage class definition: external storage.  This implementation
811 // assumes the user will specify a variable to store the data into with the
812 // cl::location(x) modifier.
813 //
814 template<class DataType, class StorageClass>
815 class list_storage {
816   StorageClass *Location;   // Where to store the object...
817
818 public:
819   list_storage() : Location(0) {}
820
821   bool setLocation(Option &O, StorageClass &L) {
822     if (Location)
823       return O.error(": cl::location(x) specified more than once!");
824     Location = &L;
825     return false;
826   }
827
828   template<class T>
829   void addValue(const T &V) {
830     assert(Location != 0 && "cl::location(...) not specified for a command "
831            "line option with external storage!");
832     Location->push_back(V);
833   }
834 };
835
836
837 // Define how to hold a class type object, such as a string.  Since we can
838 // inherit from a class, we do so.  This makes us exactly compatible with the
839 // object in all cases that it is used.
840 //
841 template<class DataType>
842 struct list_storage<DataType, bool> : public std::vector<DataType> {
843
844   template<class T>
845   void addValue(const T &V) { push_back(V); }
846 };
847
848
849 //===----------------------------------------------------------------------===//
850 // list - A list of command line options.
851 //
852 template <class DataType, class Storage = bool,
853           class ParserClass = parser<DataType> >
854 class list : public Option, public list_storage<DataType, Storage> {
855   ParserClass Parser;
856
857   virtual enum NumOccurrences getNumOccurrencesFlagDefault() const { 
858     return ZeroOrMore;
859   }
860   virtual enum ValueExpected getValueExpectedFlagDefault() const {
861     return Parser.getValueExpectedFlagDefault();
862   }
863
864   virtual bool handleOccurrence(const char *ArgName, const std::string &Arg) {
865     typename ParserClass::parser_data_type Val;
866     if (Parser.parse(*this, ArgName, Arg, Val))
867       return true;  // Parse Error!
868     addValue(Val);
869     return false;
870   }
871
872   // Forward printing stuff to the parser...
873   virtual unsigned getOptionWidth() const {return Parser.getOptionWidth(*this);}
874   virtual void printOptionInfo(unsigned GlobalWidth) const {
875     Parser.printOptionInfo(*this, GlobalWidth);
876   }
877
878   void done() {
879     addArgument(ArgStr);
880     Parser.initialize(*this);
881   }
882 public:
883   ParserClass &getParser() { return Parser; }
884
885   // One option...
886   template<class M0t>
887   list(const M0t &M0) {
888     apply(M0, this);
889     done();
890   }
891   // Two options...
892   template<class M0t, class M1t>
893   list(const M0t &M0, const M1t &M1) {
894     apply(M0, this); apply(M1, this);
895     done();
896   }
897   // Three options...
898   template<class M0t, class M1t, class M2t>
899   list(const M0t &M0, const M1t &M1, const M2t &M2) {
900     apply(M0, this); apply(M1, this); apply(M2, this);
901     done();
902   }
903   // Four options...
904   template<class M0t, class M1t, class M2t, class M3t>
905   list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3) {
906     apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
907     done();
908   }
909   // Five options...
910   template<class M0t, class M1t, class M2t, class M3t, class M4t>
911   list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
912        const M4t &M4) {
913     apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
914     apply(M4, this);
915     done();
916   }
917   // Six options...
918   template<class M0t, class M1t, class M2t, class M3t,
919            class M4t, class M5t>
920   list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
921        const M4t &M4, const M5t &M5) {
922     apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
923     apply(M4, this); apply(M5, this);
924     done();
925   }
926   // Seven options...
927   template<class M0t, class M1t, class M2t, class M3t,
928            class M4t, class M5t, class M6t>
929   list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
930       const M4t &M4, const M5t &M5, const M6t &M6) {
931     apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
932     apply(M4, this); apply(M5, this); apply(M6, this);
933     done();
934   }
935   // Eight options...
936   template<class M0t, class M1t, class M2t, class M3t,
937            class M4t, class M5t, class M6t, class M7t>
938   list(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3,
939       const M4t &M4, const M5t &M5, const M6t &M6, const M7t &M7) {
940     apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
941     apply(M4, this); apply(M5, this); apply(M6, this); apply(M7, this);
942     done();
943   }
944 };
945
946
947
948 //===----------------------------------------------------------------------===//
949 // Aliased command line option (alias this name to a preexisting name)
950 //
951
952 class alias : public Option {
953   Option *AliasFor;
954   virtual bool handleOccurrence(const char *ArgName, const std::string &Arg) {
955     return AliasFor->handleOccurrence(AliasFor->ArgStr, Arg);
956   }
957   // Aliases default to be hidden...
958   virtual enum OptionHidden getOptionHiddenFlagDefault() const {return Hidden;}
959
960   // Handle printing stuff...
961   virtual unsigned getOptionWidth() const;
962   virtual void printOptionInfo(unsigned GlobalWidth) const;
963
964   void done() {
965     if (!hasArgStr())
966       error(": cl::alias must have argument name specified!");
967     if (AliasFor == 0)
968       error(": cl::alias must have an cl::aliasopt(option) specified!");
969     addArgument(ArgStr);
970   }
971 public:
972   void setAliasFor(Option &O) {
973     if (AliasFor)
974       error(": cl::alias must only have one cl::aliasopt(...) specified!");
975     AliasFor = &O;
976   }
977
978   // One option...
979   template<class M0t>
980   alias(const M0t &M0) : AliasFor(0) {
981     apply(M0, this);
982     done();
983   }
984   // Two options...
985   template<class M0t, class M1t>
986   alias(const M0t &M0, const M1t &M1) : AliasFor(0) {
987     apply(M0, this); apply(M1, this);
988     done();
989   }
990   // Three options...
991   template<class M0t, class M1t, class M2t>
992   alias(const M0t &M0, const M1t &M1, const M2t &M2) : AliasFor(0) {
993     apply(M0, this); apply(M1, this); apply(M2, this);
994     done();
995   }
996   // Four options...
997   template<class M0t, class M1t, class M2t, class M3t>
998   alias(const M0t &M0, const M1t &M1, const M2t &M2, const M3t &M3)
999     : AliasFor(0) {
1000     apply(M0, this); apply(M1, this); apply(M2, this); apply(M3, this);
1001     done();
1002   }
1003 };
1004
1005 // aliasfor - Modifier to set the option an alias aliases.
1006 struct aliasopt {
1007   Option &Opt;
1008   aliasopt(Option &O) : Opt(O) {}
1009   void apply(alias &A) const { A.setAliasFor(Opt); }
1010 };
1011
1012 } // End namespace cl
1013
1014 #endif