X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fgetopt.h;h=94e8b1e4af35e598a6e1f99600f837aef916cfbb;hb=ae48dac6a368dbf68b1ec976254a5f896c5b737b;hp=3315108f05d34939d6d8d609fae973c915252296;hpb=0fa00d18f607f329d2b2a979e1d4339e233817fa;p=libs%2Fcore.git diff --git a/source/core/getopt.h b/source/core/getopt.h index 3315108..94e8b1e 100644 --- a/source/core/getopt.h +++ b/source/core/getopt.h @@ -10,7 +10,7 @@ Distributed under the LGPL #include #include #include -#include "error.h" +#include "except.h" namespace Msp { @@ -27,14 +27,16 @@ public: class OptBase { public: - OptBase &set_help(const std::string &h) { help=h; return *this; } + OptBase &set_help(const std::string &); + OptBase &set_help(const std::string &, const std::string &); char get_short() const { return shrt; } const std::string &get_long() const { return lng; } ArgType get_arg_type() const { return arg_type; } const std::string &get_help() const { return help; } + const std::string &get_metavar() const { return metavar; } unsigned get_seen_count() const { return seen_count; } - virtual void process()=0; - virtual void process(const std::string &)=0; + void process(); + void process(const std::string &); virtual ~OptBase() { } protected: char shrt; @@ -42,29 +44,13 @@ public: ArgType arg_type; unsigned seen_count; std::string help; + std::string metavar; - OptBase(char s, const std::string &l, ArgType a): shrt(s), lng(l), arg_type(a), seen_count(0) { } + OptBase(char, const std::string &, ArgType); + virtual void store()=0; + virtual void store(const std::string &)=0; }; - const std::vector &get_args() const { return args; } - - template - OptBase &add_option(char s, const std::string &l, T &d, ArgType a=NO_ARG) - { opts.push_back(new Option(s, l, d, a)); return *opts.back(); } - - template - OptBase &add_option(char s, const std::string &l, std::list &d, ArgType a=REQUIRED_ARG) - { opts.push_back(new ListOption >(s, l, d, a)); return *opts.back(); } - - template - OptBase &add_option(const std::string &l, T &d, ArgType a) - { return add_option(0, l, d, a); } - - std::string generate_usage(const std::string &) const; - std::string generate_help() const; - void operator()(unsigned, const char *const *); - - ~GetOpt(); private: template class Option: public OptBase @@ -72,19 +58,10 @@ private: public: Option(char s, const std::string &l, T &d, ArgType a): OptBase(s, l, a), data(d) { } - virtual void process() - { - if(arg_type==REQUIRED_ARG) - throw UsageError("--"+lng+" requires an argument"); - process_(); - ++seen_count; - } + virtual void store() { } - virtual void process(const std::string &a) + virtual void store(const std::string &a) { - if(arg_type==NO_ARG) - throw UsageError("--"+lng+" takes no argument"); - T tmp; std::istringstream ss(a); ss>>tmp; @@ -92,12 +69,9 @@ private: throw UsageError("Invalid argument for --"+lng); data=tmp; - ++seen_count; } private: T &data; - - void process_() { } }; template @@ -107,12 +81,9 @@ private: ListOption(char s, const std::string &l, T &d, ArgType a): OptBase(s, l, a), data(d) { if(arg_type!=REQUIRED_ARG) throw Exception("ListOption with arg_type!=REQUIRED makes no sense"); } - virtual void process() - { - throw UsageError("--"+lng+" requires an argument"); - } + virtual void store() { } - virtual void process(const std::string &a) + virtual void store(const std::string &a) { typename T::value_type tmp; std::istringstream ss(a); @@ -121,23 +92,50 @@ private: throw UsageError("Invalid argument for --"+lng); data.push_back(tmp); - ++seen_count; } private: T &data; }; - std::list opts; + std::list opts; std::vector args; +public: + ~GetOpt(); + + const std::vector &get_args() const { return args; } + + template + OptBase &add_option(char s, const std::string &l, T &d, ArgType a=NO_ARG) + { opts.push_back(new Option(s, l, d, a)); return *opts.back(); } + + template + OptBase &add_option(char s, const std::string &l, std::list &d, ArgType a=REQUIRED_ARG) + { opts.push_back(new ListOption >(s, l, d, a)); return *opts.back(); } + + template + OptBase &add_option(const std::string &l, T &d, ArgType a) + { return add_option(0, l, d, a); } + + std::string generate_usage(const std::string &) const; + std::string generate_help() const; + void operator()(unsigned, const char *const *); +private: + OptBase &get_option(char); OptBase &get_option(const std::string &); unsigned process_long(const char *const *); unsigned process_short(const char *const *); }; -template<> inline void GetOpt::Option::process_() { data=true; } -template<> inline void GetOpt::Option::process_() { ++data; } +template<> inline void GetOpt::Option::store() { data=true; } +template<> inline void GetOpt::Option::store() { ++data; } + +template<> inline void GetOpt::Option::store(const std::string &a) +{ data=a; } + +template<> inline void GetOpt::ListOption >::store(const std::string &a) +{ data.push_back(a); } } // namespace Msp