Changeset 2402:da8eb8f4ea41 in lemon-0.x for lemon
- Timestamp:
- 03/12/07 14:26:56 (17 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@3233
- Location:
- lemon
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/arg_parser.cc
r2391 r2402 29 29 ArgParser::ArgParser(int argc, char **argv) :_argc(argc), _argv(argv), 30 30 _command_name(argv[0]) { 31 option("-help","Print a short help message",_showHelp,this);31 refOption("-help","Print a short help message",_showHelp,this); 32 32 synonym("help","-help"); 33 33 synonym("h","-help"); … … 35 35 } 36 36 37 ArgParser &ArgParser::option(const std::string &name, 37 ArgParser::~ArgParser() 38 { 39 for(Opts::iterator i=_opts.begin();i!=_opts.end();++i) 40 if(i->second.self_delete) 41 switch(i->second.type) { 42 case BOOL: 43 delete i->second.bool_p; 44 break; 45 case STRING: 46 delete i->second.string_p; 47 break; 48 case DOUBLE: 49 delete i->second.double_p; 50 break; 51 case INTEGER: 52 delete i->second.int_p; 53 break; 54 case UNKNOWN: 55 break; 56 case FUNC: 57 break; 58 } 59 } 60 61 62 ArgParser &ArgParser::intOption(const std::string &name, 63 const std::string &help, 64 int value, bool obl) 65 { 66 ParData p; 67 p.int_p=new int(value); 68 p.self_delete=true; 69 p.help=help; 70 p.type=INTEGER; 71 p.mandatory=obl; 72 p.self_delete=true; 73 _opts[name]=p; 74 return *this; 75 } 76 77 ArgParser &ArgParser::doubleOption(const std::string &name, 78 const std::string &help, 79 double value, bool obl) 80 { 81 ParData p; 82 p.double_p=new double(value); 83 p.self_delete=true; 84 p.help=help; 85 p.type=DOUBLE; 86 p.mandatory=obl; 87 _opts[name]=p; 88 return *this; 89 } 90 91 ArgParser &ArgParser::boolOption(const std::string &name, 92 const std::string &help, 93 bool value, bool obl) 94 { 95 ParData p; 96 p.bool_p=new bool(value); 97 p.self_delete=true; 98 p.help=help; 99 p.type=BOOL; 100 p.mandatory=obl; 101 _opts[name]=p; 102 103 value = false; 104 105 return *this; 106 } 107 108 ArgParser &ArgParser::stringOption(const std::string &name, 109 const std::string &help, 110 std::string value, bool obl) 111 { 112 ParData p; 113 p.string_p=new std::string(value); 114 p.self_delete=true; 115 p.help=help; 116 p.type=STRING; 117 p.mandatory=obl; 118 _opts[name]=p; 119 return *this; 120 } 121 122 ArgParser &ArgParser::refOption(const std::string &name, 38 123 const std::string &help, 39 124 int &value, bool obl) … … 41 126 ParData p; 42 127 p.int_p=&value; 128 p.self_delete=false; 43 129 p.help=help; 44 130 p.type=INTEGER; … … 48 134 } 49 135 50 ArgParser &ArgParser:: option(const std::string &name,136 ArgParser &ArgParser::refOption(const std::string &name, 51 137 const std::string &help, 52 138 double &value, bool obl) … … 54 140 ParData p; 55 141 p.double_p=&value; 142 p.self_delete=false; 56 143 p.help=help; 57 144 p.type=DOUBLE; … … 61 148 } 62 149 63 ArgParser &ArgParser:: option(const std::string &name,150 ArgParser &ArgParser::refOption(const std::string &name, 64 151 const std::string &help, 65 152 bool &value, bool obl) … … 67 154 ParData p; 68 155 p.bool_p=&value; 156 p.self_delete=false; 69 157 p.help=help; 70 158 p.type=BOOL; … … 77 165 } 78 166 79 ArgParser &ArgParser:: option(const std::string &name,167 ArgParser &ArgParser::refOption(const std::string &name, 80 168 const std::string &help, 81 169 std::string &value, bool obl) … … 83 171 ParData p; 84 172 p.string_p=&value; 173 p.self_delete=false; 85 174 p.help=help; 86 175 p.type=STRING; … … 90 179 } 91 180 92 ArgParser &ArgParser:: option(const std::string &name,181 ArgParser &ArgParser::refOption(const std::string &name, 93 182 const std::string &help, 94 183 void (*func)(void *),void *data) … … 97 186 p.func_p.p=func; 98 187 p.func_p.data=data; 188 p.self_delete=false; 99 189 p.help=help; 100 190 p.type=FUNC; … … 103 193 return *this; 104 194 } 195 105 196 ArgParser &ArgParser::optionGroup(const std::string &group, 106 197 const std::string &opt) … … 378 469 return *this; 379 470 } 380 471 381 472 } -
lemon/arg_parser.h
r2391 r2402 71 71 bool has_syn; 72 72 bool syn; 73 73 bool self_delete; 74 74 ParData() : mandatory(false), type(UNKNOWN), set(false), ingroup(false), 75 has_syn(false), syn(false) {}75 has_syn(false), syn(false), self_delete(false) {} 76 76 }; 77 77 … … 109 109 ArgParser(int argc, char **argv); 110 110 111 ~ArgParser(); 112 111 113 ///Add a new integer type option 112 114 … … 115 117 ///\retval value The value of the argument will be written to this variable. 116 118 ///\param obl Indicate if the option is mandatory. 117 ArgParser &option(const std::string &name, 119 ArgParser &intOption(const std::string &name, 120 const std::string &help, 121 int value=0, bool obl=false); 122 123 ///Add a new floating type option 124 125 ///\param name The name of the option. The leading '-' must be omitted. 126 ///\param help A help string. 127 ///\retval value The value of the argument will be written to this variable. 128 ///\param obl Indicate if the option is mandatory. 129 ArgParser &doubleOption(const std::string &name, 130 const std::string &help, 131 double value=0, bool obl=false); 132 133 ///Add a new bool type option 134 135 ///\param name The name of the option. The leading '-' must be omitted. 136 ///\param help A help string. 137 ///\retval value The value of the argument will be written to this variable. 138 ///\param obl Indicate if the option is mandatory. 139 ////\note A mandatory bool obtion is of very little use.) 140 ArgParser &boolOption(const std::string &name, 141 const std::string &help, 142 bool value=false, bool obl=false); 143 144 ///Add a new string type option 145 146 ///\param name The name of the option. The leading '-' must be omitted. 147 ///\param help A help string. 148 ///\retval value The value of the argument will be written to this variable. 149 ///\param obl Indicate if the option is mandatory. 150 ArgParser &stringOption(const std::string &name, 151 const std::string &help, 152 std::string value="", bool obl=false); 153 154 155 156 157 ///Add a new integer type option 158 159 ///\param name The name of the option. The leading '-' must be omitted. 160 ///\param help A help string. 161 ///\retval value The value of the argument will be written to this variable. 162 ///\param obl Indicate if the option is mandatory. 163 ArgParser &refOption(const std::string &name, 118 164 const std::string &help, 119 165 int &value, bool obl=false); … … 125 171 ///\retval value The value of the argument will be written to this variable. 126 172 ///\param obl Indicate if the option is mandatory. 127 ArgParser & option(const std::string &name,173 ArgParser &refOption(const std::string &name, 128 174 const std::string &help, 129 175 double &value, bool obl=false); … … 136 182 ///\param obl Indicate if the option is mandatory. 137 183 ////\note A mandatory bool obtion is of very little use.) 138 ArgParser & option(const std::string &name,184 ArgParser &refOption(const std::string &name, 139 185 const std::string &help, 140 186 bool &value, bool obl=false); … … 146 192 ///\retval value The value of the argument will be written to this variable. 147 193 ///\param obl Indicate if the option is mandatory. 148 ArgParser & option(const std::string &name,194 ArgParser &refOption(const std::string &name, 149 195 const std::string &help, 150 196 std::string &value, bool obl=false); … … 157 203 /// must be of type "void f(void *)" 158 204 ///\param data Data to be passed to \c func 159 ArgParser & option(const std::string &name,205 ArgParser &refOption(const std::string &name, 160 206 const std::string &help, 161 207 void (*func)(void *),void *data); … … 233 279 return i!=_opts.end()?i->second.set:false; 234 280 } 235 281 282 283 class RefType 284 { 285 ArgParser &_parser; 286 std::string _name; 287 public: 288 RefType(ArgParser &p,const std::string &n) :_parser(p),_name(n) {} 289 operator bool() 290 { 291 Opts::iterator i = _parser._opts.find(_name); 292 if(i==_parser._opts.end()) exit(3); ///\todo throw exception instead 293 else if(i->second.type!=ArgParser::BOOL) exit(3); 294 else return *(i->second.bool_p); 295 } 296 operator std::string() 297 { 298 Opts::iterator i = _parser._opts.find(_name); 299 if(i==_parser._opts.end()) exit(3); ///\todo throw exception instead 300 else if(i->second.type!=ArgParser::STRING) exit(3); 301 else return *(i->second.string_p); 302 } 303 operator double() 304 { 305 Opts::iterator i = _parser._opts.find(_name); 306 if(i==_parser._opts.end()) exit(3); ///\todo throw exception instead 307 else if(i->second.type!=ArgParser::DOUBLE) exit(3); 308 else return *(i->second.double_p); 309 } 310 operator int() 311 { 312 Opts::iterator i = _parser._opts.find(_name); 313 if(i==_parser._opts.end()) exit(3); ///\todo throw exception instead 314 else if(i->second.type!=ArgParser::INTEGER) exit(3); 315 else return *(i->second.int_p); 316 } 317 318 }; 319 320 RefType operator[](const std::string &n) 321 { 322 return RefType(*this, n); 323 } 324 325 236 326 }; 237 327 }
Note: See TracChangeset
for help on using the changeset viewer.