aboutsummaryrefslogtreecommitdiffstats
path: root/src/foreach.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/foreach.h')
-rw-r--r--src/foreach.h37
1 files changed, 29 insertions, 8 deletions
diff --git a/src/foreach.h b/src/foreach.h
index e684b93..9b20953 100644
--- a/src/foreach.h
+++ b/src/foreach.h
@@ -1,11 +1,35 @@
1#ifndef NARG 1#ifndef NARG
2#define NARG(...) NARG_(__VA_ARGS__, RSEQ_N)
3#define NARG_(...) NARG_N(__VA_ARGS__)
4#define RSEQ_N 8, 7, 6, 5, 4, 3, 2, 1, 0
5#define NARG_N(_1, _2, _3, _4, _5, _6, _7, _8, N, ...) N 2#define NARG_N(_1, _2, _3, _4, _5, _6, _7, _8, N, ...) N
3#define RSEQ_N 8, 7, 6, 5, 4, 3, 2, 1, 0
4#if _MSC_VER && !__INTEL_COMPILER
5#define EXPAND(...) __VA_ARGS__
6#define NARG_(...) EXPAND(EXPAND(NARG_N) (__VA_ARGS__))
7#else
8#define NARG_(...) NARG_N(__VA_ARGS__)
9#endif
10#define NARG(...) NARG_(__VA_ARGS__, RSEQ_N)
6#endif 11#endif
7 12
8#ifndef foreach 13#ifndef foreach
14
15#define CONCAT2(x, y) x##y
16#define CONCAT1(x, y) CONCAT2(x,y)
17#define CONCATENATE(x, y) CONCAT1(x, y)
18
19#if _MSC_VER && !__INTEL_COMPILER
20#undef EXPAND
21#define EXPAND(...) __VA_ARGS__
22#define FOREACH_0(func) } while (0)
23#define FOREACH_1(func, first) func(first); FOREACH_0(func)
24#define FOREACH_2(func, first,...) func(first); EXPAND(EXPAND(FOREACH_1)(func, __VA_ARGS__))
25#define FOREACH_3(func, first,...) func(first); EXPAND(EXPAND(FOREACH_2)(func, __VA_ARGS__))
26#define FOREACH_4(func, first,...) func(first); EXPAND(EXPAND(FOREACH_3)(func, __VA_ARGS__))
27#define FOREACH_5(func, first,...) func(first); EXPAND(EXPAND(FOREACH_4)(func, __VA_ARGS__))
28#define FOREACH_6(func, first,...) func(first); EXPAND(EXPAND(FOREACH_5)(func, __VA_ARGS__))
29#define FOREACH_7(func, first,...) func(first); EXPAND(EXPAND(FOREACH_6)(func, __VA_ARGS__))
30#define FOREACH_8(func, first,...) func(first); EXPAND(EXPAND(FOREACH_7)(func, __VA_ARGS__))
31#define foreach(func, ...) do { EXPAND(CONCATENATE(FOREACH_, NARG(__VA_ARGS__))(func, __VA_ARGS__))
32#else
9#define FOREACH_0(func) } while (0) 33#define FOREACH_0(func) } while (0)
10#define FOREACH_1(func, first) func(first); FOREACH_0(func) 34#define FOREACH_1(func, first) func(first); FOREACH_0(func)
11#define FOREACH_2(func, first,...) func(first); FOREACH_1(func, __VA_ARGS__) 35#define FOREACH_2(func, first,...) func(first); FOREACH_1(func, __VA_ARGS__)
@@ -15,10 +39,7 @@
15#define FOREACH_6(func, first,...) func(first); FOREACH_5(func, __VA_ARGS__) 39#define FOREACH_6(func, first,...) func(first); FOREACH_5(func, __VA_ARGS__)
16#define FOREACH_7(func, first,...) func(first); FOREACH_6(func, __VA_ARGS__) 40#define FOREACH_7(func, first,...) func(first); FOREACH_6(func, __VA_ARGS__)
17#define FOREACH_8(func, first,...) func(first); FOREACH_7(func, __VA_ARGS__) 41#define FOREACH_8(func, first,...) func(first); FOREACH_7(func, __VA_ARGS__)
18 42#define foreach(func, ...) do { CONCATENATE(FOREACH_, NARG(__VA_ARGS__))(func, __VA_ARGS__)
19#define CONCAT1(x, y) x##y 43#endif
20#define CONCATENATE(x, y) CONCAT1(x, y)
21
22#define foreach(func, ...) do { CONCATENATE(FOREACH_,NARG(__VA_ARGS__))(func, __VA_ARGS__)
23#endif 44#endif
24 45