/**
* @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