From 2456b3dff9bdcd7ad3d4722dd2be9c2915446965 Mon Sep 17 00:00:00 2001 From: Sonullx Liu Date: Tue, 8 Sep 2020 15:33:41 +0800 Subject: [PATCH] feat: rewrite parse() --- benchmark/util/args.h | 39 ++++++++++++++------------------------- 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/benchmark/util/args.h b/benchmark/util/args.h index 1a8d5534..b831a904 100644 --- a/benchmark/util/args.h +++ b/benchmark/util/args.h @@ -46,49 +46,38 @@ namespace details return true; } - template - inline bool extract_impl(size_t todo, int & index, bool & r, char **& p, Arg & arg) + template + inline int parse_one(bool & flag, char **& p, char ** end, ARG & arg) { - if (!r || index >= todo) + if (flag && (flag = p < end) && (flag = extract(*p, arg))) { - return false; + p++; } - - r = extract(*p, arg); - - if (!r) - { - return false; - } - - index++; - p++; - - return true; + return 0; } template - inline int parse(size_t todo, char ** p, ARGS & ... args) + inline size_t parse_all(char ** begin, char ** end, ARGS & ... args) { - int index = 0; - bool r = true; - (void)std::initializer_list{(extract_impl(todo, index, r, p, args), 0)...}; - return index; + bool flag = true; + char ** p = begin; + static_cast(std::initializer_list{parse_one(flag, p, end, args) ...}); + return p - begin; } template - inline int parse_args(int & argc, char ** argv, ARGS & ... args) + inline size_t parse_args(int & argc, char ** argv, ARGS & ... args) { if (argc <= 1) { return 0; } - int length = argc - 1; + size_t length = argc - 1; char ** begin = argv + 1; char ** end = begin + length; - int done = parse(length, begin, args ...); + size_t done = parse_all(begin, end, args ...); std::rotate(begin, begin + done, end); std::reverse(end - done, end); @@ -98,7 +87,7 @@ namespace details } template -inline static int parse_args(int & argc, char ** argv, ARGS & ... args) +inline static size_t parse_args(int & argc, char ** argv, ARGS & ... args) { return details::parse_args(argc, argv, args ...); }