clang-tags
C/C++ source code indexing tool based on libclang
 All Classes Functions Variables Typedefs Groups Pages
getopt.hxx
1 #ifndef HXX_GETOPT
2 #define HXX_GETOPT
3 
4 #include <vector>
5 #include <map>
6 #include <sstream>
7 #include <getopt.h>
8 
26 class Getopt
27 {
28 public:
29  typedef std::vector<std::string> OptionValues;
30  typedef std::map<std::string, OptionValues> OptionsMap;
31 
37  Getopt (int argc, char *const * argv, const char *documentation = "Usage: %c [options]");
38 
39 
47  void add (const char *longOpt, char shortOpt, int argument,
48  const char *description = "", const char *argDescription = "");
49 
50 
55  void get ();
56 
57 
60  inline std::string usage ();
61 
62 
67  inline std::string operator[] (std::string opt) const;
68 
72  inline int getCount (std::string opt) const;
73 
77  inline const OptionValues & getAll (std::string opt) const;
78 
79 
83  inline std::string shift ();
84 
87  inline int argc () const;
88 
91  inline char const *const * argv () const;
92 
95  inline std::string argv (int i) const;
96 
97 private:
98  void addOpt (const char *longOpt, char shortOpt, int argument,
99  const char *description, const char *argDescription);
100  void addUsage (const char *longOpt, char shortOpt, int argument,
101  const char *description, const char *argDescription);
102 
103 
104 private:
105  typedef struct option Option;
106  int argc_;
107  char *const * argv_;
108  std::string shortOpts_;
109  std::ostringstream usage_;
110  std::vector<Option> options_;
111  std::map<char,int> shortIndex_;
112  OptionsMap cl_;
113  static const OptionValues None_;
114 };
115 
116 inline std::string Getopt::usage ()
117 {
118  return usage_.str();
119 }
120 
121 inline std::string Getopt::operator[] (std::string opt) const
122 {
123  OptionsMap::const_iterator it = cl_.find(opt);
124  if (it == cl_.end()) {
125  return "";
126  }
127 
128  return it->second.back();
129 }
130 
131 inline int Getopt::getCount (std::string opt) const
132 {
133  OptionsMap::const_iterator it = cl_.find(opt);
134  if (it == cl_.end()) {
135  return 0;
136  }
137 
138  return it->second.size();
139 }
140 
141 inline const Getopt::OptionValues & Getopt::getAll (std::string opt) const
142 {
143  OptionsMap::const_iterator it = cl_.find(opt);
144  if (it == cl_.end()) {
145  return None_;
146  }
147 
148  return it->second;
149 }
150 
151 inline std::string Getopt::shift ()
152 {
153  if (optind == argc_) {
154  return "";
155  }
156 
157  std::string res = argv_[optind];
158  optind++;
159  return res;
160 }
161 
162 inline int Getopt::argc () const
163 {
164  return argc_-optind;
165 }
166 
167 inline char const *const * Getopt::argv () const
168 {
169  return argv_+optind;
170 }
171 
172 inline std::string Getopt::argv (int i) const
173 {
174  return argv_[optind+i];
175 }
176 
177 template <class T>
178 bool fromString(T& t, const std::string& s)
179 {
180  std::istringstream iss(s);
181  return !(iss >> t).fail();
182 }
183 
184 #endif // HXX_GETOPT