29 #ifndef CXXTOOLS_ARG_H
30 #define CXXTOOLS_ARG_H
43 static void removeArg(
int& argc,
char* argv[],
int pos,
int n)
45 for ( ; pos < argc - n; ++pos)
46 argv[pos] = argv[pos + n];
72 bool extract(
const char* str,
int& argc,
char* argv[],
int i,
int n)
74 std::istringstream s(str);
113 operator T()
const {
return m_value; }
132 bool extract(
const char* str,
int& argc,
char* argv[],
int i,
int n)
136 removeArg(argc, argv, i, n);
145 operator const char*()
const {
return m_value; }
164 bool extract(
const char* str,
int& argc,
char* argv[],
int i,
int n)
174 const std::string&
getValue()
const {
return m_value; }
177 operator const std::string&()
const {
return m_value; }
208 template <
typename T>
217 explicit Arg(
const T& def = T())
235 Arg(
int& argc,
char* argv[],
char ch,
const T& def = T())
252 Arg(
int& argc,
char* argv[],
const char* str,
const T& def = T())
255 this->
m_isset =
set(argc, argv, str);
258 Arg(
int& argc,
char* argv[])
261 this->
m_isset =
set(argc, argv);
278 bool set(
int& argc,
char* argv[],
char ch)
284 for (
int i = 1; i < argc; ++i)
286 if (argv[i][0] ==
'-' && argv[i][1] == ch)
288 if (argv[i][2] ==
'\0' && i < argc - 1)
291 if (this->
extract(argv[i + 1], argc, argv, i, 2))
296 if (this->
extract(argv[i] + 2, argc, argv, i, 1))
316 bool set(
int& argc,
char* argv[],
const char* str)
322 unsigned n = strlen(str);
323 for (
int i = 1; i < argc; ++i)
325 if (strncmp(argv[i], str, n) == 0)
327 if (i < argc - 1 && argv[i][n] ==
'\0')
330 if (this->
extract(argv[i + 1], argc, argv, i, 2))
334 if (argv[i][n] ==
'=')
337 if (this->
extract(argv[i] + n + 1, argc, argv, i, 1))
349 bool set(
int& argc,
char* argv[])
356 this->
extract(argv[1], argc, argv, 1, 1);
432 Arg(
int& argc,
char* argv[],
char ch,
bool def =
false)
438 Arg(
int& argc,
char* argv[],
const char* str,
bool def =
false)
441 m_isset =
set(argc, argv, str);
444 bool set(
int& argc,
char* argv[],
char ch)
450 for (
int i = 1; i < argc; ++i)
452 if (argv[i][0] ==
'-' && argv[i][1] !=
'-')
455 if (argv[i][1] == ch && argv[i][2] ==
'\0')
463 else if (argv[i][1] == ch && argv[i][2] ==
'-' && argv[i][3] ==
'\0')
474 for (
char* p = argv[i] + 1; *p !=
'\0'; ++p)
483 }
while (*p++ !=
'\0');
509 bool set(
int& argc,
char* argv[],
const char* str)
515 for (
int i = 1; i < argc; ++i)
517 if (strcmp(argv[i], str) == 0)
542 operator bool()
const {
return m_value; }
548 template <
typename T>
549 std::ostream& operator<< (std::ostream& out, const ArgBaseT<T>
arg)
551 return out <<
arg.getValue();
556 #endif // CXXTOOLS_ARG_H