00001
00002
00008 #if !defined(__ads_utility_ParseOptionsArguments_h__)
00009 #define __ads_utility_ParseOptionsArguments_h__
00010
00011 #include "../defs.h"
00012
00013 #include <set>
00014 #include <map>
00015 #include <list>
00016 #include <string>
00017 #include <sstream>
00018
00019 #include <cassert>
00020
00021 BEGIN_NAMESPACE_ADS
00022
00024 class ParseOptionsArguments {
00025
00026
00027
00028
00029 public:
00030
00032 typedef std::string String;
00033
00034
00035
00036
00037
00038 private:
00039
00041 typedef std::set<String> OptionsContainer;
00043 typedef std::map<String,String> OptionsWithValuesContainer;
00045 typedef std::list<String> ArgumentsContainer;
00046
00047
00048
00049
00050
00051 private:
00052
00053
00054 char _optionPrefix;
00055
00056 String _programName;
00057
00058 OptionsContainer _options;
00059
00060 OptionsWithValuesContainer _optionsWithValues;
00061
00062 ArgumentsContainer _arguments;
00063
00064
00065
00066
00067
00068 private:
00069
00070
00071 ParseOptionsArguments(const ParseOptionsArguments& other);
00072
00073
00074 ParseOptionsArguments&
00075 operator=(const ParseOptionsArguments& other);
00076
00077
00078 public:
00079
00080
00082
00083
00085 ParseOptionsArguments() :
00086
00087 _optionPrefix('-'),
00088
00089 _programName(),
00090
00091 _options(),
00092
00093 _optionsWithValues(),
00094
00095 _arguments()
00096 {}
00097
00099 ParseOptionsArguments(const int argc, char* argv[],
00100 const char optionPrefix = '-') :
00101
00102 _optionPrefix(optionPrefix),
00103
00104 _programName(),
00105
00106 _options(),
00107
00108 _optionsWithValues(),
00109
00110 _arguments() {
00111
00112 parse(argc, argv);
00113 }
00114
00116 ~ParseOptionsArguments()
00117 {}
00118
00120
00122
00123
00125 const String&
00126 getProgramName() const {
00127 return _programName;
00128 }
00129
00131 char
00132 getOptionPrefix() const {
00133 return _optionPrefix;
00134 }
00135
00137 int
00138 getNumberOfOptions() const {
00139 return int(_options.size() + _optionsWithValues.size());
00140 }
00141
00143 bool
00144 areOptionsEmpty() const {
00145 return getNumberOfOptions() == 0;
00146 }
00147
00149 int
00150 getNumberOfArguments() const {
00151 return int(_arguments.size());
00152 }
00153
00155 bool
00156 areArgumentsEmpty() const {
00157 return _arguments.empty();
00158 }
00159
00161
00163
00164
00166 void
00167 parse(int argc, char* argv[]);
00168
00170 void
00171 setOptionPrefix(const char optionPrefix) {
00172 _optionPrefix = optionPrefix;
00173 }
00174
00176 bool
00177 getOption(const String& key) {
00178 OptionsContainer::iterator i = _options.find(key);
00179 if (i == _options.end()) {
00180 return false;
00181 }
00182 _options.erase(i);
00183 return true;
00184 }
00185
00187
00190 bool
00191 getOption(const char key) {
00192 return getOption(String(1, key));
00193 }
00194
00196 template<typename T>
00197 bool
00198 getOption(const String& key, T* value);
00199
00201
00204 template<typename T>
00205 bool
00206 getOption(const char key, T* value) {
00207 return getOption(String(1,key), value);
00208 }
00209
00211 bool
00212 getOption(const String& key, String* value);
00213
00215
00218 String
00219 getArgument() {
00220 assert(! _arguments.empty());
00221 String argument = _arguments.front();
00222 _arguments.pop_front();
00223 return argument;
00224 }
00225
00227
00235 template<typename T>
00236 bool
00237 getArgument(T* x) {
00238 assert(! _arguments.empty());
00239
00240 std::istringstream in(_arguments.front());
00241
00242 _arguments.pop_front();
00243
00244 in >> *x;
00245
00246 if (in) {
00247 return true;
00248 }
00249 return false;
00250 }
00251
00253
00255
00256
00258 void
00259 printOptions(std::ostream& out) const;
00260
00262 void
00263 printArguments(std::ostream& out) const;
00264
00266 };
00267
00268 END_NAMESPACE_ADS
00269
00270 #define __ads_utility_ParseOptionsArguments_ipp__
00271 #include "ParseOptionsArguments.ipp"
00272 #undef __ads_utility_ParseOptionsArguments_ipp__
00273
00274 #endif