diff options
Diffstat (limited to 'src/foreach.h')
| -rw-r--r-- | src/foreach.h | 37 |
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 | ||
