#include <string>
#include <vector>
#include <msp/strings/lexicalcast.h>
+#include "attributes.h"
+#include "noncopyable.h"
namespace Msp {
arguments and their associated help texts. An application may override this by
providing its own option with the same name.
*/
-class GetOpt
+class GetOpt: private NonCopyable
{
public:
enum ArgType
~GetOpt();
/** Returns any non-option arguments encountered during processing.
- Deprecated. */
- const std::vector<std::string> &get_args() const { return args_raw; }
+ Deprecated; use add_argument instead. */
+ DEPRECATED const std::vector<std::string> &get_args() const { return args_raw; }
/** Adds an option with both short and long forms. Processing depends on
the type of the destination variable and whether an argument is taken or
Option &add_option(char s, const std::string &l, T &d, ArgType a = NO_ARG)
{ return add_option(s, l, SimpleStore<T>(d), a); }
+ /** Adds an option with both short and long forms. The option may be
+ specified multiple times, and the argument from each occurrence is stored in
+ the list. The argument type must be REQUIRED_ARG. */
+ template<typename T>
+ Option &add_option(char s, const std::string &l, std::vector<T> &d, ArgType a = REQUIRED_ARG)
+ { return add_option(s, l, ListStore<std::vector<T> >(d), a); }
+
/** Adds an option with both short and long forms. The option may be
specified multiple times, and the argument from each occurrence is stored in
the list. The argument type must be REQUIRED_ARG. */
Argument &add_argument(const std::string &n, T &d, ArgType a = REQUIRED_ARG)
{ return add_argument(n, SimpleStore<T>(d), a); }
+ /** Adds a positional argument list. If the list is declared as required,
+ at least one element must be given; an optional list may be empty. Only one
+ list may be added, and optional fixed arguments can't be used with it. */
+ template<typename T>
+ Argument &add_argument(const std::string &n, std::vector<T> &d, ArgType a = REQUIRED_ARG)
+ { return add_argument(n, ListStore<std::vector<T> >(d), a); }
+
/** Adds a positional argument list. If the list is declared as required,
at least one element must be given; an optional list may be empty. Only one
list may be added, and optional fixed arguments can't be used with it. */
unsigned process_short(const char *const *);
public:
- /** Generates a single line that describes known options and arguments. */
- std::string generate_usage(const std::string &) const;
+ /** Generates a single line that describes known options and arguments. If
+ compact is true, the options list is replaced with a placeholder. This
+ provides cleaner output if full help text is printed. */
+ std::string generate_usage(const std::string &, bool compact = false) const;
/** Generates help for known options and arguments in tabular format, one
item per line. The returned string will have a linefeed at the end. */
template<> inline void GetOpt::SimpleStore<std::string>::store(const std::string &a)
{ data = a; }
+template<> inline void GetOpt::ListStore<std::vector<std::string> >::store(const std::string &a)
+{ data.push_back(a); }
+
template<> inline void GetOpt::ListStore<std::list<std::string> >::store(const std::string &a)
{ data.push_back(a); }