|
99 | 99 | REVERSE_08, REVERSE_07, REVERSE_06, REVERSE_05, REVERSE_04, REVERSE_03, \ |
100 | 100 | REVERSE_02, REVERSE_01, REVERSE_00)(__VA_ARGS__) |
101 | 101 |
|
102 | | -#define REVERSE_ARG(...) REVERSE_ARG_(##__VA_ARGS__) |
| 102 | +#define REVERSE_ARG(...) REVERSE_ARG_(__VA_ARGS__) |
103 | 103 |
|
104 | 104 | /* Apply the macro to each argument */ |
105 | 105 |
|
|
149 | 149 | #define FOREACH_ARG(action, param, ...) \ |
150 | 150 | FOREACH_ARG_(action, GET_ARG_COUNT(__VA_ARGS__), param, ##__VA_ARGS__) |
151 | 151 |
|
| 152 | +/* Apply the macro to each argument, passing the position of the argument |
| 153 | + * as a two digit literal (00, 01, 02, ...) rather than as an expression. |
| 154 | + * Use it when the index has to be pasted into an identifier, for instance |
| 155 | + * to build a symbol name the linker can sort. The arguments are reversed |
| 156 | + * before the expansion, so the actions are emitted from the last argument |
| 157 | + * to the first while the indexes still follow the original order, which is |
| 158 | + * transparent for the declarations this form is meant to generate. |
| 159 | + */ |
| 160 | + |
| 161 | +#define FOREACH_IDX_0(action, param, ...) |
| 162 | +#define FOREACH_IDX_1(action, param, arg, ...) action(param, arg, 00) |
| 163 | +#define FOREACH_IDX_2(action, param, arg, ...) action(param, arg, 01) FOREACH_IDX_1(action, param, __VA_ARGS__) |
| 164 | +#define FOREACH_IDX_3(action, param, arg, ...) action(param, arg, 02) FOREACH_IDX_2(action, param, __VA_ARGS__) |
| 165 | +#define FOREACH_IDX_4(action, param, arg, ...) action(param, arg, 03) FOREACH_IDX_3(action, param, __VA_ARGS__) |
| 166 | +#define FOREACH_IDX_5(action, param, arg, ...) action(param, arg, 04) FOREACH_IDX_4(action, param, __VA_ARGS__) |
| 167 | +#define FOREACH_IDX_6(action, param, arg, ...) action(param, arg, 05) FOREACH_IDX_5(action, param, __VA_ARGS__) |
| 168 | +#define FOREACH_IDX_7(action, param, arg, ...) action(param, arg, 06) FOREACH_IDX_6(action, param, __VA_ARGS__) |
| 169 | +#define FOREACH_IDX_8(action, param, arg, ...) action(param, arg, 07) FOREACH_IDX_7(action, param, __VA_ARGS__) |
| 170 | +#define FOREACH_IDX_9(action, param, arg, ...) action(param, arg, 08) FOREACH_IDX_8(action, param, __VA_ARGS__) |
| 171 | +#define FOREACH_IDX_10(action, param, arg, ...) action(param, arg, 09) FOREACH_IDX_9(action, param, __VA_ARGS__) |
| 172 | +#define FOREACH_IDX_11(action, param, arg, ...) action(param, arg, 10) FOREACH_IDX_10(action, param, __VA_ARGS__) |
| 173 | +#define FOREACH_IDX_12(action, param, arg, ...) action(param, arg, 11) FOREACH_IDX_11(action, param, __VA_ARGS__) |
| 174 | +#define FOREACH_IDX_13(action, param, arg, ...) action(param, arg, 12) FOREACH_IDX_12(action, param, __VA_ARGS__) |
| 175 | +#define FOREACH_IDX_14(action, param, arg, ...) action(param, arg, 13) FOREACH_IDX_13(action, param, __VA_ARGS__) |
| 176 | +#define FOREACH_IDX_15(action, param, arg, ...) action(param, arg, 14) FOREACH_IDX_14(action, param, __VA_ARGS__) |
| 177 | +#define FOREACH_IDX_16(action, param, arg, ...) action(param, arg, 15) FOREACH_IDX_15(action, param, __VA_ARGS__) |
| 178 | +#define FOREACH_IDX_17(action, param, arg, ...) action(param, arg, 16) FOREACH_IDX_16(action, param, __VA_ARGS__) |
| 179 | +#define FOREACH_IDX_18(action, param, arg, ...) action(param, arg, 17) FOREACH_IDX_17(action, param, __VA_ARGS__) |
| 180 | +#define FOREACH_IDX_19(action, param, arg, ...) action(param, arg, 18) FOREACH_IDX_18(action, param, __VA_ARGS__) |
| 181 | +#define FOREACH_IDX_20(action, param, arg, ...) action(param, arg, 19) FOREACH_IDX_19(action, param, __VA_ARGS__) |
| 182 | +#define FOREACH_IDX_21(action, param, arg, ...) action(param, arg, 20) FOREACH_IDX_20(action, param, __VA_ARGS__) |
| 183 | +#define FOREACH_IDX_22(action, param, arg, ...) action(param, arg, 21) FOREACH_IDX_21(action, param, __VA_ARGS__) |
| 184 | +#define FOREACH_IDX_23(action, param, arg, ...) action(param, arg, 22) FOREACH_IDX_22(action, param, __VA_ARGS__) |
| 185 | +#define FOREACH_IDX_24(action, param, arg, ...) action(param, arg, 23) FOREACH_IDX_23(action, param, __VA_ARGS__) |
| 186 | +#define FOREACH_IDX_25(action, param, arg, ...) action(param, arg, 24) FOREACH_IDX_24(action, param, __VA_ARGS__) |
| 187 | +#define FOREACH_IDX_26(action, param, arg, ...) action(param, arg, 25) FOREACH_IDX_25(action, param, __VA_ARGS__) |
| 188 | +#define FOREACH_IDX_27(action, param, arg, ...) action(param, arg, 26) FOREACH_IDX_26(action, param, __VA_ARGS__) |
| 189 | +#define FOREACH_IDX_28(action, param, arg, ...) action(param, arg, 27) FOREACH_IDX_27(action, param, __VA_ARGS__) |
| 190 | +#define FOREACH_IDX_29(action, param, arg, ...) action(param, arg, 28) FOREACH_IDX_28(action, param, __VA_ARGS__) |
| 191 | +#define FOREACH_IDX_30(action, param, arg, ...) action(param, arg, 29) FOREACH_IDX_29(action, param, __VA_ARGS__) |
| 192 | +#define FOREACH_IDX_31(action, param, arg, ...) action(param, arg, 30) FOREACH_IDX_30(action, param, __VA_ARGS__) |
| 193 | +#define FOREACH_IDX_32(action, param, arg, ...) action(param, arg, 31) FOREACH_IDX_31(action, param, __VA_ARGS__) |
| 194 | + |
| 195 | +/* The reversed list has to be expanded before the arguments are counted, |
| 196 | + * hence the extra indirection: a macro counts the tokens it receives, not |
| 197 | + * what they expand to. |
| 198 | + */ |
| 199 | + |
| 200 | +#define FOREACH_IDX_ARG__(action, param, ...) \ |
| 201 | + CONCATENATE(FOREACH_IDX_, GET_ARG_COUNT(__VA_ARGS__)) \ |
| 202 | + (action, param, __VA_ARGS__) |
| 203 | + |
| 204 | +#define FOREACH_IDX_ARG_(...) FOREACH_IDX_ARG__(__VA_ARGS__) |
| 205 | + |
| 206 | +#define FOREACH_IDX_ARG(action, param, ...) \ |
| 207 | + FOREACH_IDX_ARG_(action, param, REVERSE_ARG(__VA_ARGS__)) |
| 208 | + |
152 | 209 | #endif /* __INCLUDE_NUTTX_MACRO_H */ |
0 commit comments