|
206 | 206 | #define TERN(O,A,B) _TERN(_ENA_1(O),B,A) // OPTION ? 'A' : 'B'
|
207 | 207 | #define TERN0(O,A) _TERN(_ENA_1(O),0,A) // OPTION ? 'A' : '0'
|
208 | 208 | #define TERN1(O,A) _TERN(_ENA_1(O),1,A) // OPTION ? 'A' : '1'
|
209 |
| -#define TERN_(O,A) _TERN(_ENA_1(O),,A) // OPTION ? 'A' : '<nul>' |
210 | 209 | #define _TERN(E,V...) __TERN(_CAT(T_,E),V) // Prepend 'T_' to get 'T_0' or 'T_1'
|
211 | 210 | #define __TERN(T,V...) ___TERN(_CAT(_NO,T),V) // Prepend '_NO' to get '_NOT_0' or '_NOT_1'
|
212 | 211 | #define ___TERN(P,V...) THIRD(P,V) // If first argument has a comma, A. Else B.
|
213 | 212 | #define IF_DISABLED(O,A) TERN(O,,A)
|
214 | 213 |
|
| 214 | +// "Ternary" that emits or omits the given content |
| 215 | +#define EMIT(V...) V |
| 216 | +#define OMIT(...) |
| 217 | +#define TERN_(O,A) _TERN(_ENA_1(O),OMIT,EMIT)(A) // OPTION ? 'A' : '<nul>' |
| 218 | + |
215 | 219 | // Macros to conditionally emit array items and function arguments
|
216 | 220 | #define _OPTITEM(A...) A,
|
217 |
| -#define OPTITEM(O,A...) TERN_(O,DEFER4(_OPTITEM)(A)) |
| 221 | +#define OPTITEM(O,A...) TERN_(O,DEFER(_OPTITEM)(A)) |
218 | 222 | #define _OPTARG(A...) , A
|
219 |
| -#define OPTARG(O,A...) TERN_(O,DEFER4(_OPTARG)(A)) |
| 223 | +#define OPTARG(O,A...) TERN_(O,DEFER(_OPTARG)(A)) |
220 | 224 | #define _OPTCODE(A) A;
|
221 |
| -#define OPTCODE(O,A) TERN_(O,DEFER4(_OPTCODE)(A)) |
| 225 | +#define OPTCODE(O,A) TERN_(O,DEFER(_OPTCODE)(A)) |
222 | 226 |
|
223 | 227 | // Macros to avoid operations that aren't always optimized away (e.g., 'f + 0.0' and 'f * 1.0').
|
224 | 228 | // Compiler flags -fno-signed-zeros -ffinite-math-only also cover 'f * 1.0', 'f - f', etc.
|
|
0 commit comments