[Lemon-commits] alpar: r3238 - lemon/trunk/lemon
Lemon SVN
svn at lemon.cs.elte.hu
Tue Mar 13 13:33:40 CET 2007
Author: alpar
Date: Tue Mar 13 13:33:40 2007
New Revision: 3238
Modified:
lemon/trunk/lemon/arg_parser.cc
lemon/trunk/lemon/arg_parser.h
Log:
Better doc.
Modified: lemon/trunk/lemon/arg_parser.cc
==============================================================================
--- lemon/trunk/lemon/arg_parser.cc (original)
+++ lemon/trunk/lemon/arg_parser.cc Tue Mar 13 13:33:40 2007
@@ -28,7 +28,7 @@
ArgParser::ArgParser(int argc, char **argv) :_argc(argc), _argv(argv),
_command_name(argv[0]) {
- refOption("-help","Print a short help message",_showHelp,this);
+ funcOption("-help","Print a short help message",_showHelp,this);
synonym("help","-help");
synonym("h","-help");
@@ -121,10 +121,10 @@
ArgParser &ArgParser::refOption(const std::string &name,
const std::string &help,
- int &value, bool obl)
+ int &ref, bool obl)
{
ParData p;
- p.int_p=&value;
+ p.int_p=&ref;
p.self_delete=false;
p.help=help;
p.type=INTEGER;
@@ -135,10 +135,10 @@
ArgParser &ArgParser::refOption(const std::string &name,
const std::string &help,
- double &value, bool obl)
+ double &ref, bool obl)
{
ParData p;
- p.double_p=&value;
+ p.double_p=&ref;
p.self_delete=false;
p.help=help;
p.type=DOUBLE;
@@ -149,27 +149,27 @@
ArgParser &ArgParser::refOption(const std::string &name,
const std::string &help,
- bool &value, bool obl)
+ bool &ref, bool obl)
{
ParData p;
- p.bool_p=&value;
+ p.bool_p=&ref;
p.self_delete=false;
p.help=help;
p.type=BOOL;
p.mandatory=obl;
_opts[name]=p;
- value = false;
+ ref = false;
return *this;
}
ArgParser &ArgParser::refOption(const std::string &name,
const std::string &help,
- std::string &value, bool obl)
+ std::string &ref, bool obl)
{
ParData p;
- p.string_p=&value;
+ p.string_p=&ref;
p.self_delete=false;
p.help=help;
p.type=STRING;
@@ -178,7 +178,7 @@
return *this;
}
- ArgParser &ArgParser::refOption(const std::string &name,
+ ArgParser &ArgParser::funcOption(const std::string &name,
const std::string &help,
void (*func)(void *),void *data)
{
@@ -197,8 +197,8 @@
const std::string &opt)
{
Opts::iterator i = _opts.find(opt);
- if(i==_opts.end()) exit(3); ///\todo throw exception instead
- else if(i->second.ingroup) exit(3); ///\todo throw exception instead
+ if(i==_opts.end()) throw LogicError();
+ else if(i->second.ingroup) throw LogicError();
else {
GroupData &g=_groups[group];
g.opts.push_back(opt);
@@ -220,7 +220,7 @@
Opts::iterator o = _opts.find(opt);
Opts::iterator s = _opts.find(syn);
if(o==_opts.end()||s!=_opts.end())
- exit(3); ///\todo throw exception instead
+ throw LogicError();
else {
ParData p;
p.help=opt;
Modified: lemon/trunk/lemon/arg_parser.h
==============================================================================
--- lemon/trunk/lemon/arg_parser.h (original)
+++ lemon/trunk/lemon/arg_parser.h Tue Mar 13 13:33:40 2007
@@ -26,6 +26,7 @@
#include <iostream>
#include <sstream>
#include <algorithm>
+#include <lemon/error.h>
///\ingroup misc
///\file
@@ -151,60 +152,70 @@
const std::string &help,
std::string value="", bool obl=false);
+ ///Bind a function to an option.
+ ///\param name The name of the option. The leading '-' must be omitted.
+ ///\param help A help string.
+ ///\retval func The function to be called when the option is given. It
+ /// must be of type "void f(void *)"
+ ///\param data Data to be passed to \c func
+ ArgParser &funcOption(const std::string &name,
+ const std::string &help,
+ void (*func)(void *),void *data);
+ ///\name Options with an external strorage.
+ ///Using this functions, the value of the option will be directly written
+ ///into a variable once the option appears in the command line.
- ///Add a new integer type option
+ ///@{
+
+ ///Add a new integer type option with a storage reference
///\param name The name of the option. The leading '-' must be omitted.
///\param help A help string.
- ///\retval value The value of the argument will be written to this variable.
+ ///\retval ref The value of the argument will be written to this variable.
///\param obl Indicate if the option is mandatory.
ArgParser &refOption(const std::string &name,
const std::string &help,
- int &value, bool obl=false);
+ int &ref, bool obl=false);
- ///Add a new floating type option
+ ///Add a new floating type option with a storage reference
///\param name The name of the option. The leading '-' must be omitted.
///\param help A help string.
- ///\retval value The value of the argument will be written to this variable.
+ ///\retval ref The value of the argument will be written to this variable.
///\param obl Indicate if the option is mandatory.
ArgParser &refOption(const std::string &name,
const std::string &help,
- double &value, bool obl=false);
+ double &ref, bool obl=false);
- ///Add a new bool type option
+ ///Add a new bool type option with a storage reference
///\param name The name of the option. The leading '-' must be omitted.
///\param help A help string.
- ///\retval value The value of the argument will be written to this variable.
+ ///\retval ref The value of the argument will be written to this variable.
///\param obl Indicate if the option is mandatory.
////\note A mandatory bool obtion is of very little use.)
ArgParser &refOption(const std::string &name,
const std::string &help,
- bool &value, bool obl=false);
+ bool &ref, bool obl=false);
- ///Add a new string type option
+ ///Add a new string type option with a storage reference
///\param name The name of the option. The leading '-' must be omitted.
///\param help A help string.
- ///\retval value The value of the argument will be written to this variable.
+ ///\retval ref The value of the argument will be written to this variable.
///\param obl Indicate if the option is mandatory.
ArgParser &refOption(const std::string &name,
const std::string &help,
- std::string &value, bool obl=false);
+ std::string &ref, bool obl=false);
- ///Bind a function to an option.
+ ///@}
- ///\param name The name of the option. The leading '-' must be omitted.
- ///\param help A help string.
- ///\retval func The function to be called when the option is given. It
- /// must be of type "void f(void *)"
- ///\param data Data to be passed to \c func
- ArgParser &refOption(const std::string &name,
- const std::string &help,
- void (*func)(void *),void *data);
+ ///\name Option Groups and Synonyms
+ ///
+
+ ///@{
///Boundle some options into a group
@@ -221,6 +232,12 @@
///given at the same time
ArgParser &onlyOneGroup(const std::string &group);
+ ///Make a group mandatory
+
+ ///Using this function, at least one of the members of \c group
+ ///must be given.
+ ArgParser &mandatoryGroup(const std::string &group);
+
///Create synonym to an option
///With this function you can create a sysnonym called \c sys of the
@@ -228,12 +245,8 @@
ArgParser &synonym(const std::string &syn,
const std::string &opt);
- ///Make a group mandatory
+ ///@}
- ///Using this function, at least one of the members of \c group
- ///must be given.
- ArgParser &mandatoryGroup(const std::string &group);
-
///Give help string for non-parsed arguments.
///With this function you can give help string for non-parsed arguments.
@@ -263,7 +276,7 @@
void requiresValue(std::string arg, OptType t);
void checkMandatories();
- ///\e
+ ///Start the parsing process
ArgParser &parse();
/// Synonym for parse()
@@ -280,49 +293,67 @@
}
+ ///Magic type for operator[]
+
+ ///This is the type of the return value of ArgParser::operator[]().
+ ///It automatically converts to int, double, bool or std::string, if it
+ ///match the type of the option, otherwise it throws an exception.
+ ///(i.e. it performs runtime type checking).
class RefType
{
ArgParser &_parser;
std::string _name;
public:
+ ///\e
RefType(ArgParser &p,const std::string &n) :_parser(p),_name(n) {}
+ ///\e
operator bool()
{
Opts::iterator i = _parser._opts.find(_name);
- if(i==_parser._opts.end()) exit(3); ///\todo throw exception instead
- else if(i->second.type!=ArgParser::BOOL) exit(3);
+ if(i==_parser._opts.end()) throw LogicError();
+ else if(i->second.type!=ArgParser::BOOL)
+ throw LogicError();
else return *(i->second.bool_p);
}
+ ///\e
operator std::string()
{
Opts::iterator i = _parser._opts.find(_name);
- if(i==_parser._opts.end()) exit(3); ///\todo throw exception instead
- else if(i->second.type!=ArgParser::STRING) exit(3);
+ if(i==_parser._opts.end()) throw LogicError();
+ else if(i->second.type!=ArgParser::STRING)
+ throw LogicError();
else return *(i->second.string_p);
}
+ ///\e
operator double()
{
Opts::iterator i = _parser._opts.find(_name);
- if(i==_parser._opts.end()) exit(3); ///\todo throw exception instead
- else if(i->second.type!=ArgParser::DOUBLE) exit(3);
+ if(i==_parser._opts.end()) throw LogicError();
+ else if(i->second.type!=ArgParser::DOUBLE)
+ throw LogicError();
else return *(i->second.double_p);
}
+ ///\e
operator int()
{
Opts::iterator i = _parser._opts.find(_name);
- if(i==_parser._opts.end()) exit(3); ///\todo throw exception instead
- else if(i->second.type!=ArgParser::INTEGER) exit(3);
+ if(i==_parser._opts.end()) throw LogicError();
+ else if(i->second.type!=ArgParser::INTEGER)
+ throw LogicError();
else return *(i->second.int_p);
}
};
+ ///Give back the value of an option
+
+ ///Give back the value of an option
+ ///\sa RefType
RefType operator[](const std::string &n)
{
return RefType(*this, n);
- }
-
-
+ }
+
};
}
More information about the Lemon-commits
mailing list