1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
#ifndef _BENCHMARK_ARGS_H_
#define _BENCHMARK_ARGS_H_
#include <algorithm>
#include <numeric>
#include <string>
namespace details
{
inline bool extract(const char * p, size_t & t)
{
char * e;
long long ll = std::strtoll(p, &e, 0);
if (*e || ll < 0)
{
return false;
}
t = static_cast<size_t>(ll);
return true;
}
inline bool extract(const char * p, unsigned short & t)
{
char * e;
long long ll = std::strtoll(p, &e, 0);
if (*e
|| ll < static_cast<long long>(std::numeric_limits<unsigned short>::min())
|| ll > static_cast<long long>(std::numeric_limits<unsigned short>::max())
)
{
return false;
}
t = static_cast<unsigned short>(ll);
return true;
}
inline bool extract(const char * p, std::string & t)
{
t = p;
return true;
}
inline bool extract(const char * p, const char *& t)
{
t = p;
return true;
}
template <typename ARG>
inline int parse_one(bool & flag, char **& p, char ** end, ARG & arg)
{
if (flag && (flag = p < end) && (flag = extract(*p, arg)))
{
p++;
}
return 0;
}
template <typename ... ARGS>
inline size_t parse_all(char ** begin, char ** end, ARGS & ... args)
{
bool flag = true;
char ** p = begin;
static_cast<void>(std::initializer_list<int>{parse_one(flag, p, end, args) ...});
return p - begin;
}
template <typename ... ARGS>
inline size_t parse_args(int & argc, char ** argv, ARGS & ... args)
{
if (argc <= 1)
{
return 0;
}
size_t length = argc - 1;
char ** begin = argv + 1;
char ** end = begin + length;
size_t done = parse_all(begin, end, args ...);
std::rotate(begin, begin + done, end);
std::reverse(end - done, end);
argc -= done;
return done;
}
}
template <typename ... ARGS>
inline static size_t parse_args(int & argc, char ** argv, ARGS & ... args)
{
return details::parse_args(argc, argv, args ...);
}
#endif //_BENCHMARK_ARGS_H_
|