# HG changeset patch
# User Alpar Juttner <alpar@cs.elte.hu>
# Date 1215983125 -3600
# Node ID 60eecd3fe37a549ea3670375f74bda21d0b25790
# Parent 81cfc04531e8fcf0a6e72f22ff2871fcb827c416
Some cleanup in ArgParser API (ticket #116)
diff --git a/lemon/arg_parser.cc b/lemon/arg_parser.cc
a
|
b
|
|
239 | 239 | return *this; |
240 | 240 | } |
241 | 241 | |
242 | | void ArgParser::show(std::ostream &os,Opts::iterator i) |
| 242 | void ArgParser::show(std::ostream &os,Opts::const_iterator i) const |
243 | 243 | { |
244 | 244 | os << "-" << i->first; |
245 | 245 | if(i->second.has_syn) |
246 | | for(Opts::iterator j=_opts.begin();j!=_opts.end();++j) |
| 246 | for(Opts::const_iterator j=_opts.begin();j!=_opts.end();++j) |
247 | 247 | if(j->second.syn&&j->second.help==i->first) |
248 | 248 | os << "|-" << j->first; |
249 | 249 | switch(i->second.type) { |
… |
… |
|
261 | 261 | } |
262 | 262 | } |
263 | 263 | |
264 | | void ArgParser::show(std::ostream &os,Groups::iterator i) |
| 264 | void ArgParser::show(std::ostream &os,Groups::const_iterator i) const |
265 | 265 | { |
266 | | GroupData::Opts::iterator o=i->second.opts.begin(); |
| 266 | GroupData::Opts::const_iterator o=i->second.opts.begin(); |
267 | 267 | while(o!=i->second.opts.end()) { |
268 | 268 | show(os,_opts.find(*o)); |
269 | 269 | ++o; |
… |
… |
|
271 | 271 | } |
272 | 272 | } |
273 | 273 | |
274 | | void ArgParser::showHelp(Opts::iterator i) |
| 274 | void ArgParser::showHelp(Opts::const_iterator i) const |
275 | 275 | { |
276 | 276 | if(i->second.help.size()==0||i->second.syn) return; |
277 | 277 | std::cerr << " "; |
… |
… |
|
279 | 279 | std::cerr << std::endl; |
280 | 280 | std::cerr << " " << i->second.help << std::endl; |
281 | 281 | } |
282 | | void ArgParser::showHelp(std::vector<ArgParser::OtherArg>::iterator i) |
| 282 | void ArgParser::showHelp(std::vector<ArgParser::OtherArg>::const_iterator i) |
| 283 | const |
283 | 284 | { |
284 | 285 | if(i->help.size()==0) return; |
285 | 286 | std::cerr << " " << i->name << std::endl |
286 | 287 | << " " << i->help << std::endl; |
287 | 288 | } |
288 | 289 | |
289 | | void ArgParser::shortHelp() |
| 290 | void ArgParser::shortHelp() const |
290 | 291 | { |
291 | 292 | const unsigned int LINE_LEN=77; |
292 | 293 | const std::string indent(" "); |
293 | 294 | std::cerr << "Usage:\n " << _command_name; |
294 | 295 | int pos=_command_name.size()+2; |
295 | | for(Groups::iterator g=_groups.begin();g!=_groups.end();++g) { |
| 296 | for(Groups::const_iterator g=_groups.begin();g!=_groups.end();++g) { |
296 | 297 | std::ostringstream cstr; |
297 | 298 | cstr << ' '; |
298 | 299 | if(!g->second.mandatory) cstr << '['; |
… |
… |
|
305 | 306 | std::cerr << cstr.str(); |
306 | 307 | pos+=cstr.str().size(); |
307 | 308 | } |
308 | | for(Opts::iterator i=_opts.begin();i!=_opts.end();++i) |
| 309 | for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i) |
309 | 310 | if(!i->second.ingroup&&!i->second.syn) { |
310 | 311 | std::ostringstream cstr; |
311 | 312 | cstr << ' '; |
… |
… |
|
319 | 320 | std::cerr << cstr.str(); |
320 | 321 | pos+=cstr.str().size(); |
321 | 322 | } |
322 | | for(std::vector<OtherArg>::iterator i=_others_help.begin(); |
| 323 | for(std::vector<OtherArg>::const_iterator i=_others_help.begin(); |
323 | 324 | i!=_others_help.end();++i) |
324 | 325 | { |
325 | 326 | std::ostringstream cstr; |
… |
… |
|
335 | 336 | std::cerr << std::endl; |
336 | 337 | } |
337 | 338 | |
338 | | void ArgParser::showHelp() |
| 339 | void ArgParser::showHelp() const |
339 | 340 | { |
340 | 341 | shortHelp(); |
341 | 342 | std::cerr << "Where:\n"; |
342 | | for(std::vector<OtherArg>::iterator i=_others_help.begin(); |
| 343 | for(std::vector<OtherArg>::const_iterator i=_others_help.begin(); |
343 | 344 | i!=_others_help.end();++i) showHelp(i); |
344 | | for(Opts::iterator i=_opts.begin();i!=_opts.end();++i) showHelp(i); |
| 345 | for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i) showHelp(i); |
345 | 346 | exit(1); |
346 | 347 | } |
347 | 348 | |
348 | 349 | |
349 | | void ArgParser::unknownOpt(std::string arg) |
| 350 | void ArgParser::unknownOpt(std::string arg) const |
350 | 351 | { |
351 | 352 | std::cerr << "\nUnknown option: " << arg << "\n"; |
352 | 353 | std::cerr << "\nType '" << _command_name << |
… |
… |
|
354 | 355 | exit(1); |
355 | 356 | } |
356 | 357 | |
357 | | void ArgParser::requiresValue(std::string arg, OptType t) |
| 358 | void ArgParser::requiresValue(std::string arg, OptType t) const |
358 | 359 | { |
359 | 360 | std::cerr << "Argument '" << arg << "' requires a"; |
360 | 361 | switch(t) { |
… |
… |
|
375 | 376 | } |
376 | 377 | |
377 | 378 | |
378 | | void ArgParser::checkMandatories() |
| 379 | void ArgParser::checkMandatories() const |
379 | 380 | { |
380 | 381 | bool ok=true; |
381 | | for(Opts::iterator i=_opts.begin();i!=_opts.end();++i) |
| 382 | for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i) |
382 | 383 | if(i->second.mandatory&&!i->second.set) |
383 | 384 | { |
384 | 385 | if(ok) |
… |
… |
|
387 | 388 | ok=false; |
388 | 389 | showHelp(i); |
389 | 390 | } |
390 | | for(Groups::iterator i=_groups.begin();i!=_groups.end();++i) |
| 391 | for(Groups::const_iterator i=_groups.begin();i!=_groups.end();++i) |
391 | 392 | if(i->second.mandatory||i->second.only_one) |
392 | 393 | { |
393 | 394 | int set=0; |
394 | | for(GroupData::Opts::iterator o=i->second.opts.begin(); |
| 395 | for(GroupData::Opts::const_iterator o=i->second.opts.begin(); |
395 | 396 | o!=i->second.opts.end();++o) |
396 | 397 | if(_opts.find(*o)->second.set) ++set; |
397 | 398 | if(i->second.mandatory&&!set) { |
398 | 399 | std::cerr << _command_name << |
399 | 400 | ": At least one of the following arguments is mandatory.\n"; |
400 | 401 | ok=false; |
401 | | for(GroupData::Opts::iterator o=i->second.opts.begin(); |
| 402 | for(GroupData::Opts::const_iterator o=i->second.opts.begin(); |
402 | 403 | o!=i->second.opts.end();++o) |
403 | 404 | showHelp(_opts.find(*o)); |
404 | 405 | } |
… |
… |
|
406 | 407 | std::cerr << _command_name << |
407 | 408 | ": At most one of the following arguments can be given.\n"; |
408 | 409 | ok=false; |
409 | | for(GroupData::Opts::iterator o=i->second.opts.begin(); |
| 410 | for(GroupData::Opts::const_iterator o=i->second.opts.begin(); |
410 | 411 | o!=i->second.opts.end();++o) |
411 | 412 | showHelp(_opts.find(*o)); |
412 | 413 | } |
diff --git a/lemon/arg_parser.h b/lemon/arg_parser.h
a
|
b
|
|
271 | 271 | |
272 | 272 | ///@} |
273 | 273 | |
274 | | void show(std::ostream &os,Opts::iterator i); |
275 | | void show(std::ostream &os,Groups::iterator i); |
276 | | void showHelp(Opts::iterator i); |
277 | | void showHelp(std::vector<OtherArg>::iterator i); |
278 | | void shortHelp(); |
279 | | void showHelp(); |
| 274 | private: |
| 275 | void show(std::ostream &os,Opts::const_iterator i) const; |
| 276 | void show(std::ostream &os,Groups::const_iterator i) const; |
| 277 | void showHelp(Opts::const_iterator i) const; |
| 278 | void showHelp(std::vector<OtherArg>::const_iterator i) const; |
280 | 279 | |
281 | | void unknownOpt(std::string arg); |
| 280 | void unknownOpt(std::string arg) const; |
282 | 281 | |
283 | | void requiresValue(std::string arg, OptType t); |
284 | | void checkMandatories(); |
| 282 | void requiresValue(std::string arg, OptType t) const; |
| 283 | void checkMandatories() const; |
| 284 | |
| 285 | void shortHelp() const; |
| 286 | void showHelp() const; |
| 287 | public: |
285 | 288 | |
286 | 289 | ///Start the parsing process |
287 | 290 | ArgParser &parse(); |
… |
… |
|
293 | 296 | } |
294 | 297 | |
295 | 298 | ///Give back the command name (the 0th argument) |
296 | | const std::string &commandName() { return _command_name; } |
| 299 | const std::string &commandName() const { return _command_name; } |
297 | 300 | |
298 | 301 | ///Check if an opion has been given to the command. |
299 | | bool given(std::string op) |
| 302 | bool given(std::string op) const |
300 | 303 | { |
301 | | Opts::iterator i = _opts.find(op); |
| 304 | Opts::const_iterator i = _opts.find(op); |
302 | 305 | return i!=_opts.end()?i->second.set:false; |
303 | 306 | } |
304 | 307 | |
… |
… |
|
311 | 314 | ///throws an exception (i.e. it performs runtime type checking). |
312 | 315 | class RefType |
313 | 316 | { |
314 | | ArgParser &_parser; |
| 317 | const ArgParser &_parser; |
315 | 318 | std::string _name; |
316 | 319 | public: |
317 | 320 | ///\e |
318 | | RefType(ArgParser &p,const std::string &n) :_parser(p),_name(n) {} |
| 321 | RefType(const ArgParser &p,const std::string &n) :_parser(p),_name(n) {} |
319 | 322 | ///\e |
320 | 323 | operator bool() |
321 | 324 | { |
322 | | Opts::iterator i = _parser._opts.find(_name); |
| 325 | Opts::const_iterator i = _parser._opts.find(_name); |
323 | 326 | LEMON_ASSERT(i!=_parser._opts.end(), |
324 | 327 | std::string()+"Unkown option: '"+_name+"'"); |
325 | 328 | LEMON_ASSERT(i->second.type==ArgParser::BOOL, |
… |
… |
|
329 | 332 | ///\e |
330 | 333 | operator std::string() |
331 | 334 | { |
332 | | Opts::iterator i = _parser._opts.find(_name); |
| 335 | Opts::const_iterator i = _parser._opts.find(_name); |
333 | 336 | LEMON_ASSERT(i!=_parser._opts.end(), |
334 | 337 | std::string()+"Unkown option: '"+_name+"'"); |
335 | 338 | LEMON_ASSERT(i->second.type==ArgParser::STRING, |
… |
… |
|
339 | 342 | ///\e |
340 | 343 | operator double() |
341 | 344 | { |
342 | | Opts::iterator i = _parser._opts.find(_name); |
| 345 | Opts::const_iterator i = _parser._opts.find(_name); |
343 | 346 | LEMON_ASSERT(i!=_parser._opts.end(), |
344 | 347 | std::string()+"Unkown option: '"+_name+"'"); |
345 | 348 | LEMON_ASSERT(i->second.type==ArgParser::DOUBLE || |
… |
… |
|
351 | 354 | ///\e |
352 | 355 | operator int() |
353 | 356 | { |
354 | | Opts::iterator i = _parser._opts.find(_name); |
| 357 | Opts::const_iterator i = _parser._opts.find(_name); |
355 | 358 | LEMON_ASSERT(i!=_parser._opts.end(), |
356 | 359 | std::string()+"Unkown option: '"+_name+"'"); |
357 | 360 | LEMON_ASSERT(i->second.type==ArgParser::INTEGER, |
… |
… |
|
365 | 368 | |
366 | 369 | ///Give back the value of an option. |
367 | 370 | ///\sa RefType |
368 | | RefType operator[](const std::string &n) |
| 371 | RefType operator[](const std::string &n) const |
369 | 372 | { |
370 | 373 | return RefType(*this, n); |
371 | 374 | } |
… |
… |
|
374 | 377 | |
375 | 378 | ///Give back a reference to a vector consisting of the program arguments |
376 | 379 | ///not starting with a '-' character. |
377 | | std::vector<std::string> &files() { return _file_args; } |
| 380 | const std::vector<std::string> &files() const { return _file_args; } |
378 | 381 | |
379 | 382 | }; |
380 | 383 | } |