blob: 7f72aa66e9d7b8dea2be41f4ad8b637993164ea2 [file] [log] [blame]
Mike Dodd8cfa7022010-11-17 11:12:26 -08001/**
2 * @file popt_options.h
3 * option parsing
4 *
5 * This provides a simple facility for adding command-line
6 * options, and parsing them.
7 *
8 * You can add a number of options and then call parse_options()
9 * to process them, for example :
10 *
11 * \code
12 * bool allow_frob;
13 * string frob;
14 * static popt::option allow_frob_opt(allow_frob, "allow-frob", 'a', "allow frobs");
15 * static popt::option frob_opt(frob, "frob", 'f', "what to frob", "name");
16 *
17 * ...
18 * popt::parse_options(argc, argv, add_params);
19 * \endcode
20 *
21 * Note than if you try to implement an option for an unsupported type like :
22 * \code
23 * static unsigned int i;
24 * static popt::option i_opt(i, ....);
25 * \endcode
26 * you don't get a compile time error but a link time error.
27 *
28 * The call to parse_options() will fill in allow_frob and frob, if they
29 * are passed to the program (myfrobber --allow-frob --frob foo), and place
30 * any left over command line arguments in the add_params vector. Note
31 * that the template parameter denotes the type of the option argument.
32 *
33 * When the template parameter type is bool, option starting with "no-" prefix
34 * are implicitely considered as negated before writing the associated bool so
35 * this will work as expected:
36 * \code
37 * bool demangle;
38 * popt::option(demangle, "demangle", 'd', "demangle C++ symbols"),
39 * popt::option(demangle, "no-demangle", '\0', "don't demangle C++ symbols"),
40 * \endcode
41 *
42 * @remark Copyright 2002 OProfile authors
43 * @remark Read the file COPYING
44 *
45 * @author Philippe Elie
46 * @author John Levon
47 */
48
49#ifndef POPT_OPTIONS_H
50#define POPT_OPTIONS_H
51
52#include <string>
53#include <vector>
54
55namespace popt {
56
57/**
58 * parse_options - parse command line options
59 * @param argc like the parameter of main()
60 * @param argv like the parameter of main()
61 * @param additional_params additional options are stored here
62 *
63 * Parse the given command line with the previous
64 * options created. Multiple additional arguments
65 * that are not recognised will be added to the additional_params
66 * vector.
67 */
68void parse_options(int argc, char const ** argv,
69 std::vector<std::string> & additional_params);
70
71class option_base;
72
73/**
74 * option - base class for a command line option
75 *
76 * Every command line option added before calling parse_options()
77 * is of this type.
78 */
79class option {
80public:
81 /**
82 * Templatized constructor for an option. This adds the option
83 * to the option list on construction. This is specialized for
84 * each recognised option value type below.
85 */
86 template <class T> option(T &, char const * option_name,
87 char short_name, char const * help_str,
88 char const * arg_help_str);
89
90 /**
91 * boolean operations don't get the same set of parameters as other
92 * option, as there is no argument to give help for.
93 * Due to a bug in gcc 2.95 we can't use a default parameter
94 * in the templatized ctor above because 2.95 is unable to match
95 * the right ctor. So on we add a non-templatized ctor with an exact
96 * match for boolean option.
97 */
98 option(bool &, char const * option_name,
99 char short_name, char const * help_str);
100
101 ~option();
102
103private:
104 option_base * the_option;
105};
106
107
108/**
109 * The supported option type, boolean option are matched by a non templatized
110 * ctor above.
111 */
112template <> option::option(int &, char const * option_name, char short_name,
113 char const * help_str, char const * arg_help_str);
114template <> option::option(std::string &, char const * option_name,
115 char short_name, char const * help_str,
116 char const * arg_help_str);
117template <> option::option(std::vector<std::string> &,
118 char const * option_name, char short_name,
119 char const * help_str, char const * arg_help_str);
120
121} // namespace popt
122
123#endif // POPT_OPTIONS_H