45void readVector(
const std::string& s, std::vector<T>& v) {
48 std::vector<std::string> elements =
strSplit(s,
",;");
49 for (
const std::string& s : elements) {
50 T val = stringToType<T>(s);
56std::string writeVectorAsString(
const std::vector<T>& v) {
58 if (v.size()) os << v[0];
59 for (
size_t i = 1; i < v.size(); i++) os <<
"," << v[i];
64void parseArgument(
const std::string& input, CommandArgs::CommandArgument& ca) {
68 T* data =
static_cast<T*
>(ca.data);
74void parseVector(
const std::string& input, CommandArgs::CommandArgument& ca) {
77 bool convertStatus = aux.size() > 0;
79 std::vector<T>* data =
static_cast<std::vector<T>*
>(ca.data);
85std::string argument2String(
const CommandArgs::CommandArgument& ca) {
86 T* data =
static_cast<T*
>(ca.data);
87 stringstream auxStream;
89 return auxStream.str();
109 for (i = 1; i < argc; i++) {
110 string name = argv[i];
112 if (name[0] !=
'-') {
126 string::size_type dashPos = name.find_first_not_of(
'-');
127 if (dashPos != string::npos) name = name.substr(dashPos);
129 if (name ==
"help" || name ==
"h") {
134 std::vector<CommandArgument>::iterator it =
_args.begin();
135 for (; it !=
_args.end(); ++it) {
136 if (it->name == name) {
139 bool* data =
static_cast<bool*
>(it->data);
145 cerr <<
"Argument " << name <<
"needs value.\n";
147 if (exitOnError) exit(1);
157 if (it ==
_args.end()) {
158 cerr <<
"Error: Unknown Option '" << name
159 <<
"' (use -help to get list of options).\n";
160 if (exitOnError) exit(1);
167 cerr <<
"Error: program requires parameters" << endl;
169 if (exitOnError) exit(1);
172 for (
size_t j = 0; (i < argc && j <
_leftOvers.size()); i++, j++) {
173 string* s =
static_cast<string*
>(
_leftOvers[j].data);
189 const std::string& desc) {
194 ca.
data =
static_cast<void*
>(&p);
201 const std::string& desc) {
206 ca.
data =
static_cast<void*
>(&p);
213 const std::string& desc) {
218 ca.
data =
static_cast<void*
>(&p);
225 const std::string& desc) {
230 ca.
data =
static_cast<void*
>(&p);
237 const std::string& defValue,
const std::string& desc) {
242 ca.
data =
static_cast<void*
>(&p);
249 const std::vector<int>& defValue,
250 const std::string& desc) {
255 ca.
data =
static_cast<void*
>(&p);
262 const std::vector<double>& defValue,
263 const std::string& desc) {
268 ca.
data =
static_cast<void*
>(&p);
276 os <<
"Usage: " <<
_progName << (
_args.size() > 0 ?
" [options] " :
" ");
278 for (
size_t i = 0; i <
_leftOvers.size(); ++i) {
279 if (i > 0) os <<
" ";
286 if (i > 0) os <<
" ";
291 os <<
"General options:" << endl;
292 os <<
"-------------------------------------------" << endl;
293 os <<
"-help / -h Displays this help." << endl << endl;
294 if (
_args.size() > 0) {
295 os <<
"Program Options:" << endl;
296 os <<
"-------------------------------------------" << endl;
298 vector<pair<string, string> > tableStrings;
299 tableStrings.reserve(
_args.size());
300 size_t maxArgLen = 0;
301 for (
size_t i = 0; i <
_args.size(); ++i) {
304 if (!defaultValueStr.empty())
305 tableStrings.push_back(make_pair(
307 _args[i].description +
" (default: " + defaultValueStr +
")"));
309 tableStrings.push_back(
311 _args[i].description));
313 tableStrings.push_back(make_pair(
_args[i].name,
_args[i].description));
314 maxArgLen = (std::max)(maxArgLen, tableStrings.back().first.size());
316 sort(tableStrings.begin(), tableStrings.end(),
319 for (
size_t i = 0; i < tableStrings.size(); ++i) {
320 os <<
"-" << tableStrings[i].first;
321 for (
size_t l = tableStrings[i].first.size(); l < maxArgLen; ++l)
323 os << tableStrings[i].second << endl;
332 const std::string& defValue,
333 const std::string& desc,
bool optional) {
338 ca.
data =
static_cast<void*
>(&p);
361 return "<vector_int>";
363 return "<vector_double>";
371 parseArgument<float>(input, ca);
374 parseArgument<double>(input, ca);
377 parseArgument<int>(input, ca);
380 parseArgument<bool>(input, ca);
383 string* data =
static_cast<string*
>(ca.
data);
387 parseVector<int>(input, ca);
390 parseVector<double>(input, ca);
398 return argument2String<float>(ca);
400 return argument2String<double>(ca);
402 return argument2String<int>(ca);
404 return argument2String<bool>(ca);
406 string* data =
static_cast<string*
>(ca.
data);
410 std::vector<int>* data =
static_cast<std::vector<int>*
>(ca.
data);
411 return writeVectorAsString(*data);
414 std::vector<double>* data =
static_cast<std::vector<double>*
>(ca.
data);
415 return writeVectorAsString(*data);
422 std::vector<CommandArgument>::const_iterator it =
_args.begin();
423 for (; it !=
_args.end(); ++it) {
424 if (it->name ==
param) {
bool parseArgs(int argc, char **argv, bool exitOnError=true)
void paramLeftOver(const std::string &name, std::string &p, const std::string &defValue, const std::string &desc, bool optional=false)
std::vector< CommandArgument > _leftOversOptional
void printHelp(std::ostream &os)
void str2arg(const std::string &input, CommandArgument &ca) const
void param(const std::string &name, bool &p, bool defValue, const std::string &desc)
void setBanner(const std::string &banner)
const char * type2str(int t) const
std::string arg2str(const CommandArgument &ca) const
std::vector< CommandArgument > _args
bool parsedParam(const std::string ¶mFlag) const
std::vector< CommandArgument > _leftOvers
some general case utility functions
bool readVector(std::istream &is, Eigen::DenseBase< Derived > &b)
bool convertString(const std::string &s, T &x, bool failIfLeftoverChars=true)
std::vector< std::string > strSplit(const std::string &str, const std::string &delimiters)