diff --git a/options.h b/options.h new file mode 100644 index 0000000000000000000000000000000000000000..dd74db2e5573a7a225e071f9305e3527bbe279c1 --- /dev/null +++ b/options.h @@ -0,0 +1,85 @@ +// $Id$ +#if !defined(OPTIONS_H) +#define OPTIONS_H + +#include <string> +#include <vector> + +#define POSIX_SOURCE 1 + +class BaseOption { +public: + typedef enum { + no_argument = 0, requires_argument, optional_argument + } ArgFlag; + + BaseOption(const string& k, const string& ht, bool c, ArgFlag f): + key_(k), help_text_(ht), arg_flag_(f), + unset_(true), compulsory_(c) {} + + bool compulsory() { return compulsory_; } + bool required() { return arg_flag_ == requires_argument; } + bool optional() { return arg_flag_ == optional_argument; } + bool set() { return !unset_; } + bool unset() { return unset_; } + bool has_arg() { return arg_flag_ != no_argument; } + bool matches(const string& arg); + const string& key() const { return key_; } + const string& help_text() const { return help_text_; } + + virtual void value(const string& vs) = 0; + + virtual ~BaseOption() {} + +private: + string key_, help_text_; + ArgFlag arg_flag_; + +protected: + bool unset_, compulsory_; +}; + +void string_to_T(bool &b, const string& s); +void string_to_T(string& d, const string& s); +void string_to_T(int& i, const string& s); +void string_to_T(float& v, const string& s); + +template<class T> class Option: public BaseOption { +public: + Option(const string& k, const T& v, const string& ht, + bool c, ArgFlag f = no_argument): + BaseOption(k, ht, c, f), default_(v), value_(v) {} + + void value(const string& vs) { + string_to_T(value_, vs); unset_ = false; + } + const T& value() { return value_; } + const T& default_value() { return default_; } + virtual ~Option() {} + +private: + Option() {} + + T default_, value_; +}; + +class OptionParser { +public: + OptionParser(const string& p, const string& e): progname_(p), example_(e) {} + + void add(BaseOption& o) { options_.push_back(&o); } + void usage(); + BaseOption * operator[](const string& key); + bool check_compulsory_arguments(bool verbose=false); + unsigned int parse_command_line(unsigned int argc, char **argv); + + ~OptionParser() {} + +private: + unsigned int argc_; char **argv_; + string progname_, example_; + typedef vector<BaseOption *> Options; + Options options_; +}; + +#endif