Go to the documentation of this file.
18#ifndef __VSF_FOREACH_H__
19#define __VSF_FOREACH_H__
28#define __VSF_MDEFER(__X) __X __VSF_MEMPTY()
29#define __VSF_MOBSTRUCT(...) __VA_ARGS__ __VSF_MDEFER(__VSF_MEMPTY)()
30#define __VSF_MEXPAND_ONCE(...) __VA_ARGS__
31#define __VSF_MEAT(...)
33#define __VSF_MEXPAND(...) __VSF_MEXPAND1(__VSF_MEXPAND1(__VSF_MEXPAND1(__VSF_MEXPAND1(__VA_ARGS__))))
34#define __VSF_MEXPAND1(...) __VSF_MEXPAND2(__VSF_MEXPAND2(__VSF_MEXPAND2(__VSF_MEXPAND2(__VA_ARGS__))))
35#define __VSF_MEXPAND2(...) __VSF_MEXPAND3(__VSF_MEXPAND3(__VSF_MEXPAND3(__VSF_MEXPAND3(__VA_ARGS__))))
36#define __VSF_MEXPAND3(...) __VSF_MEXPAND4(__VSF_MEXPAND4(__VSF_MEXPAND4(__VSF_MEXPAND4(__VA_ARGS__))))
37#define __VSF_MEXPAND4(...) __VSF_MEXPAND5(__VSF_MEXPAND5(__VSF_MEXPAND5(__VSF_MEXPAND5(__VA_ARGS__))))
38#define __VSF_MEXPAND5(...) __VA_ARGS__
41#define ____VSF_MISEMPTY(__A, __B, __SIZE, ...) __SIZE
42#define __VSF_MISEMPTY(...) ____VSF_MISEMPTY(, ##__VA_ARGS__, 0, 1)
43#define VSF_MISEMPTY(__X, ...) __VSF_MISEMPTY(__X)
46#define __VSF_MFOREACH(__MACRO, __MACRO_LAST, __X, ...) \
47 VSF_MCAT2(__VSF_MFOREACH_, VSF_MISEMPTY(__VA_ARGS__))(__MACRO, __MACRO_LAST, __X, __VA_ARGS__)
48#define __VSF_MFOREACH_0(__MACRO, __MACRO_LAST, __X, ...) \
49 __MACRO(__X) __VSF_MOBSTRUCT(__VSF_MFOREACH_I)()(__MACRO, __MACRO_LAST, __VA_ARGS__)
50#define __VSF_MFOREACH_1(__MACRO, __MACRO_LAST, __X, ...) \
52#define __VSF_MFOREACH_I() __VSF_MFOREACH
53#define VSF_MFOREACH_EX(__MACRO, __MACRO_LAST, ...) \
54 __VSF_MEXPAND(__VSF_MFOREACH(__MACRO, __MACRO_LAST, __VA_ARGS__))
55#define VSF_MFOREACH(__MACRO, ...) VSF_MFOREACH_EX(__MACRO, __MACRO, __VA_ARGS__)
58#define __VSF_MFOREACH_ARG1(__MACRO, __MACRO_LAST, __ARG0, __X, ...) \
59 VSF_MCAT2(__VSF_MFOREACH_ARG1_, VSF_MISEMPTY(__VA_ARGS__))(__MACRO, __MACRO_LAST, __ARG0, __X, __VA_ARGS__)
60#define __VSF_MFOREACH_ARG1_0(__MACRO, __MACRO_LAST, __ARG0, __X, ...) \
61 __MACRO(__ARG0, __X) __VSF_MOBSTRUCT(__VSF_MFOREACH_ARG1_I)()(__MACRO, __MACRO_LAST, __ARG0, __VA_ARGS__)
62#define __VSF_MFOREACH_ARG1_1(__MACRO, __MACRO_LAST, __ARG0, __X, ...) \
63 __MACRO_LAST(__ARG0, __X)
64#define __VSF_MFOREACH_ARG1_I() __VSF_MFOREACH_ARG1
65#define VSF_MFOREACH_ARG1_EX(__MACRO, __MACRO_LAST, __ARG0, ...) \
66 __VSF_MEXPAND(__VSF_MFOREACH_ARG1(__MACRO, __MACRO_LAST, __ARG0, __VA_ARGS__))
67#define VSF_MFOREACH_ARG1(__MACRO, __ARG0, ...) VSF_MFOREACH_ARG1_EX(__MACRO, __MACRO, __ARG0, __VA_ARGS__)
70#define __VSF_MFOREACH_ARG2(__MACRO, __MACRO_LAST, __ARG0, __ARG1, __X, ...) \
71 VSF_MCAT2(__VSF_MFOREACH_ARG2_, VSF_MISEMPTY(__VA_ARGS__))(__MACRO, __MACRO_LAST, __ARG0, __ARG1, __X, __VA_ARGS__)
72#define __VSF_MFOREACH_ARG2_0(__MACRO, __MACRO_LAST, __ARG0, __ARG1, __X, ...) \
73 __MACRO(__ARG0, __ARG1, __X) __VSF_MOBSTRUCT(__VSF_MFOREACH_ARG2_I)()(__MACRO, __MACRO_LAST, __ARG0, __ARG1, __VA_ARGS__)
74#define __VSF_MFOREACH_ARG2_1(__MACRO, __MACRO_LAST, __ARG0, __ARG1, __X, ...) \
75 __MACRO_LAST(__ARG0, __ARG1, __X)
76#define __VSF_MFOREACH_ARG2_I() __VSF_MFOREACH_ARG2
77#define VSF_MFOREACH_ARG2_EX(__MACRO, __MACRO_LAST, __ARG0, __ARG1, ...) \
78 __VSF_MEXPAND(__VSF_MFOREACH_ARG2(__MACRO, __MACRO_LAST, __ARG0, __ARG1, __VA_ARGS__))
79#define VSF_MFOREACH_ARG2(__MACRO, __ARG0, __ARG1, ...) VSF_MFOREACH_ARG2_EX(__MACRO, __MACRO, __ARG0, __ARG1, __VA_ARGS__)
82#define __VSF_MFOREACH_ARG3(__MACRO, __MACRO_LAST, __ARG0, __ARG1, __ARG2, __X, ...)\
83 VSF_MCAT2(__VSF_MFOREACH_ARG3_, VSF_MISEMPTY(__VA_ARGS__))(__MACRO, __MACRO_LAST, __ARG0, __ARG1, __ARG2, __X, __VA_ARGS__)
84#define __VSF_MFOREACH_ARG3_0(__MACRO, __MACRO_LAST, __ARG0, __ARG1, __ARG2, __X, ...)\
85 __MACRO(__ARG0, __ARG1, __ARG2, __X) __VSF_MOBSTRUCT(__VSF_MFOREACH_ARG3_I)()(__MACRO, __MACRO_LAST, __ARG0, __ARG1, __ARG2, __VA_ARGS__)
86#define __VSF_MFOREACH_ARG3_1(__MACRO, __MACRO_LAST, __ARG0, __ARG1, __ARG2, __X, ...)\
87 __MACRO_LAST(__ARG0, __ARG1, __ARG2, __X)
88#define __VSF_MFOREACH_ARG3_I() __VSF_MFOREACH_ARG3
89#define VSF_MFOREACH_ARG3_EX(__MACRO, __MACRO_LAST, __ARG0, __ARG1, __ARG2, ...)\
90 __VSF_MEXPAND(__VSF_MFOREACH_ARG3(__MACRO, __MACRO_LAST, __ARG0, __ARG1, __ARG2, __VA_ARGS__))
91#define VSF_MFOREACH_ARG3(__MACRO, __ARG0, __ARG1, __ARG2, ...) VSF_MFOREACH_ARG3_EX(__MACRO, __MACRO, __ARG0, __ARG1, __ARG2, __VA_ARGS__)