File: args.h

package info (click to toggle)
workflow 0.11.11-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,756 kB
  • sloc: cpp: 33,895; ansic: 9,397; makefile: 9; sh: 6
file content (95 lines) | stat: -rw-r--r-- 1,899 bytes parent folder | download | duplicates (2)
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_