| /** |
| * @file popt_options.h |
| * option parsing |
| * |
| * This provides a simple facility for adding command-line |
| * options, and parsing them. |
| * |
| * You can add a number of options and then call parse_options() |
| * to process them, for example : |
| * |
| * \code |
| * bool allow_frob; |
| * string frob; |
| * static popt::option allow_frob_opt(allow_frob, "allow-frob", 'a', "allow frobs"); |
| * static popt::option frob_opt(frob, "frob", 'f', "what to frob", "name"); |
| * |
| * ... |
| * popt::parse_options(argc, argv, add_params); |
| * \endcode |
| * |
| * Note than if you try to implement an option for an unsupported type like : |
| * \code |
| * static unsigned int i; |
| * static popt::option i_opt(i, ....); |
| * \endcode |
| * you don't get a compile time error but a link time error. |
| * |
| * The call to parse_options() will fill in allow_frob and frob, if they |
| * are passed to the program (myfrobber --allow-frob --frob foo), and place |
| * any left over command line arguments in the add_params vector. Note |
| * that the template parameter denotes the type of the option argument. |
| * |
| * When the template parameter type is bool, option starting with "no-" prefix |
| * are implicitely considered as negated before writing the associated bool so |
| * this will work as expected: |
| * \code |
| * bool demangle; |
| * popt::option(demangle, "demangle", 'd', "demangle C++ symbols"), |
| * popt::option(demangle, "no-demangle", '\0', "don't demangle C++ symbols"), |
| * \endcode |
| * |
| * @remark Copyright 2002 OProfile authors |
| * @remark Read the file COPYING |
| * |
| * @author Philippe Elie |
| * @author John Levon |
| */ |
| |
| #ifndef POPT_OPTIONS_H |
| #define POPT_OPTIONS_H |
| |
| #include <string> |
| #include <vector> |
| |
| namespace popt { |
| |
| /** |
| * parse_options - parse command line options |
| * @param argc like the parameter of main() |
| * @param argv like the parameter of main() |
| * @param additional_params additional options are stored here |
| * |
| * Parse the given command line with the previous |
| * options created. Multiple additional arguments |
| * that are not recognised will be added to the additional_params |
| * vector. |
| */ |
| void parse_options(int argc, char const ** argv, |
| std::vector<std::string> & additional_params); |
| |
| class option_base; |
| |
| /** |
| * option - base class for a command line option |
| * |
| * Every command line option added before calling parse_options() |
| * is of this type. |
| */ |
| class option { |
| public: |
| /** |
| * Templatized constructor for an option. This adds the option |
| * to the option list on construction. This is specialized for |
| * each recognised option value type below. |
| */ |
| template <class T> option(T &, char const * option_name, |
| char short_name, char const * help_str, |
| char const * arg_help_str); |
| |
| /** |
| * boolean operations don't get the same set of parameters as other |
| * option, as there is no argument to give help for. |
| * Due to a bug in gcc 2.95 we can't use a default parameter |
| * in the templatized ctor above because 2.95 is unable to match |
| * the right ctor. So on we add a non-templatized ctor with an exact |
| * match for boolean option. |
| */ |
| option(bool &, char const * option_name, |
| char short_name, char const * help_str); |
| |
| ~option(); |
| |
| private: |
| option_base * the_option; |
| }; |
| |
| |
| /** |
| * The supported option type, boolean option are matched by a non templatized |
| * ctor above. |
| */ |
| template <> option::option(int &, char const * option_name, char short_name, |
| char const * help_str, char const * arg_help_str); |
| template <> option::option(std::string &, char const * option_name, |
| char short_name, char const * help_str, |
| char const * arg_help_str); |
| template <> option::option(std::vector<std::string> &, |
| char const * option_name, char short_name, |
| char const * help_str, char const * arg_help_str); |
| |
| } // namespace popt |
| |
| #endif // POPT_OPTIONS_H |