3 This file is part of libmspcore
4 Copyright © 2006-2007 Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
7 #ifndef MSP_CORE_GETOPT_H_
8 #define MSP_CORE_GETOPT_H_
30 OptBase &set_help(const std::string &);
31 OptBase &set_help(const std::string &, const std::string &);
32 char get_short() const { return shrt; }
33 const std::string &get_long() const { return lng; }
34 ArgType get_arg_type() const { return arg_type; }
35 const std::string &get_help() const { return help; }
36 const std::string &get_metavar() const { return metavar; }
37 unsigned get_seen_count() const { return seen_count; }
39 void process(const std::string &);
40 virtual ~OptBase() { }
49 OptBase(char, const std::string &, ArgType);
50 virtual void store()=0;
51 virtual void store(const std::string &)=0;
56 class Option: public OptBase
59 Option(char s, const std::string &l, T &d, ArgType a): OptBase(s, l, a), data(d) { }
61 virtual void store() { }
63 virtual void store(const std::string &a)
66 std::istringstream ss(a);
69 throw UsageError("Invalid argument for --"+lng);
78 class ListOption: public OptBase
81 ListOption(char s, const std::string &l, T &d, ArgType a): OptBase(s, l, a), data(d)
82 { if(arg_type!=REQUIRED_ARG) throw Exception("ListOption with arg_type!=REQUIRED makes no sense"); }
84 virtual void store() { }
86 virtual void store(const std::string &a)
88 typename T::value_type tmp;
89 std::istringstream ss(a);
92 throw UsageError("Invalid argument for --"+lng);
100 std::list<OptBase *> opts;
101 std::vector<std::string> args;
106 const std::vector<std::string> &get_args() const { return args; }
109 OptBase &add_option(char s, const std::string &l, T &d, ArgType a=NO_ARG)
110 { opts.push_back(new Option<T>(s, l, d, a)); return *opts.back(); }
113 OptBase &add_option(char s, const std::string &l, std::list<T> &d, ArgType a=REQUIRED_ARG)
114 { opts.push_back(new ListOption<std::list<T> >(s, l, d, a)); return *opts.back(); }
117 OptBase &add_option(const std::string &l, T &d, ArgType a)
118 { return add_option(0, l, d, a); }
120 std::string generate_usage(const std::string &) const;
121 std::string generate_help() const;
122 void operator()(unsigned, const char *const *);
125 OptBase &get_option(char);
126 OptBase &get_option(const std::string &);
127 unsigned process_long(const char *const *);
128 unsigned process_short(const char *const *);
131 template<> inline void GetOpt::Option<bool>::store() { data=true; }
132 template<> inline void GetOpt::Option<unsigned>::store() { ++data; }
134 template<> inline void GetOpt::Option<std::string>::store(const std::string &a)
137 template<> inline void GetOpt::ListOption<std::list<std::string> >::store(const std::string &a)
138 { data.push_back(a); }