VSF Documented
vsf_foreach_macro.h
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2022 by VSF Team *
3 * *
4 * Licensed under the Apache License, Version 2.0 (the "License"); *
5 * you may not use this file except in compliance with the License. *
6 * You may obtain a copy of the License at *
7 * *
8 * http://www.apache.org/licenses/LICENSE-2.0 *
9 * *
10 * Unless required by applicable law or agreed to in writing, software *
11 * distributed under the License is distributed on an "AS IS" BASIS, *
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13 * See the License for the specific language governing permissions and *
14 * limitations under the License. *
15 * *
16 ****************************************************************************/
17
18#ifndef __VSF_FOREACH_H__
19#define __VSF_FOREACH_H__
20
21#include "vsf_macro_calc.h"
22
23#ifdef __cplusplus
24extern "C" {
25#endif
26
27#define __VSF_MEMPTY()
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(...)
32
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__
39
40
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)
44
45
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, ...) \
51 __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__)
56
57
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__)
68
69
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__)
80
81
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__)
92
93
94
95
96/* elegant but toooooo slow
97#define ____VSF_MCHECK(__X, __SIZE, ...) __SIZE
98#define __VSF_MCHECK(...) ____VSF_MCHECK(__VA_ARGS__, 0,)
99
100#define __VSF_MNOT(__X) __VSF_MCHECK(VSF_MCAT2_PRIMITIVE(__VSF_MNOT_, __X))
101#define __VSF_MNOT_0 __VSF_MDUMMY, 1,
102
103#define __VSF_MCOMPL(__X) VSF_MCAT2_PRIMITIVE(__VSF_MCOMPL_, __X)
104#define __VSF_MCOMPL_0 1
105#define __VSF_MCOMPL_1 0
106
107#define __VSF_MBOOL(__X) __VSF_MCOMPL(__VSF_MNOT(__X))
108
109#define ____VSF_MIF(__COND) VSF_MCAT2_PRIMITIVE(__VSF_IF_, __COND)
110#define __VSF_IF_0(__X, ...) __VA_ARGS__
111#define __VSF_IF_1(__X, ...) __X
112
113#define __VSF_MIF(__COND) ____VSF_MIF(__VSF_MBOOL(__COND))
114#define __VSF_MWHEN(__COND) __VSF_MIF(__COND)(__VSF_MEXPAND_ONCE, __VSF_MEAT)
115
116#define __VSF_MREPEAT(__COUNT, __MACRO, ...) \
117 __VSF_MWHEN(__COUNT) ( \
118 __VSF_MOBSTRUCT(__VSF_MREPEAT_I)() ( \
119 VSF_MDEC(__COUNT), __MACRO, __VA_ARGS__ \
120 ) \
121 __VSF_MOBSTRUCT(__MACRO)(VSF_MDEC(__COUNT), __VA_ARGS__) \
122 )
123#define __VSF_MREPEAT_I() __VSF_MREPEAT
124#define VSF_MREPEAT(__COUNT, __MACRO, ...) \
125 __VSF_MEXPAND(__VSF_MREPEAT(__COUNT, __MACRO, __VA_ARGS__))
126#define VSF_MREPEAT_LIMIT VSF_MDEC_LIMIT
127*/
128
129#ifdef __cplusplus
130}
131#endif
132
133#endif