Metalang99
1.13.3
Full-blown preprocessor metaprogramming
ident.h
Go to the documentation of this file.
1
16
#ifndef ML99_IDENT_H
17
#define ML99_IDENT_H
18
19
#include <metalang99/priv/bool.h>
20
#include <metalang99/priv/tuple.h>
21
#include <metalang99/priv/util.h>
22
23
#include <
metalang99/lang.h
>
24
57
#define ML99_detectIdent(prefix, ident) ML99_call(ML99_detectIdent, prefix, ident)
58
96
#define ML99_identEq(prefix, x, y) ML99_call(ML99_identEq, prefix, x, y)
97
118
#define ML99_charEq(x, y) ML99_call(ML99_charEq, x, y)
119
123
#define ML99_isLowercase(x) ML99_call(ML99_isLowercase, x)
124
128
#define ML99_isUppercase(x) ML99_call(ML99_isUppercase, x)
129
133
#define ML99_isDigit(x) ML99_call(ML99_isDigit, x)
134
138
#define ML99_isChar(x) ML99_call(ML99_isChar, x)
139
160
#define ML99_charLit(x) ML99_call(ML99_charLit, x)
161
180
#define ML99_LOWERCASE_CHARS(...) \
181
a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z
182
186
#define ML99_UPPERCASE_CHARS(...) \
187
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z
188
192
#define ML99_DIGITS(...) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
193
194
#define ML99_DETECT_IDENT(prefix, ident) ML99_PRIV_IS_TUPLE_FAST(ML99_PRIV_CAT(prefix, ident))
195
#define ML99_IDENT_EQ(prefix, x, y) ML99_DETECT_IDENT(ML99_PRIV_CAT3(prefix, x, _), y)
196
197
#define ML99_CHAR_EQ(x, y) \
198
ML99_PRIV_IF( \
199
ML99_DETECT_IDENT(ML99_UNDERSCORE_DETECTOR, x), \
200
ML99_DETECT_IDENT(ML99_UNDERSCORE_DETECTOR, y), \
201
ML99_PRIV_OR3( \
202
ML99_IDENT_EQ(ML99_LOWERCASE_DETECTOR, x, y), \
203
ML99_IDENT_EQ(ML99_UPPERCASE_DETECTOR, x, y), \
204
ML99_IDENT_EQ(ML99_DIGIT_DETECTOR, x, y)))
205
206
#define ML99_IS_LOWERCASE(x) ML99_IDENT_EQ(ML99_LOWERCASE_DETECTOR, x, x)
207
#define ML99_IS_UPPERCASE(x) ML99_IDENT_EQ(ML99_UPPERCASE_DETECTOR, x, x)
208
#define ML99_IS_DIGIT(x) ML99_IDENT_EQ(ML99_DIGIT_DETECTOR, x, x)
209
210
#define ML99_IS_CHAR(x) \
211
ML99_PRIV_OR4( \
212
ML99_IS_LOWERCASE(x), \
213
ML99_IS_UPPERCASE(x), \
214
ML99_IS_DIGIT(x), \
215
ML99_DETECT_IDENT(ML99_UNDERSCORE_DETECTOR, x))
216
217
#define ML99_CHAR_LIT(x) ML99_PRIV_CAT(ML99_PRIV_CHAR_LIT_, x)
218
219
#ifndef DOXYGEN_IGNORE
220
221
#define ML99_detectIdent_IMPL(prefix, ident) v(ML99_DETECT_IDENT(prefix, ident))
222
#define ML99_identEq_IMPL(prefix, x, y) v(ML99_IDENT_EQ(prefix, x, y))
223
#define ML99_charEq_IMPL(x, y) v(ML99_CHAR_EQ(x, y))
224
#define ML99_isLowercase_IMPL(x) v(ML99_IS_LOWERCASE(x))
225
#define ML99_isUppercase_IMPL(x) v(ML99_IS_UPPERCASE(x))
226
#define ML99_isDigit_IMPL(x) v(ML99_IS_DIGIT(x))
227
#define ML99_isChar_IMPL(x) v(ML99_IS_CHAR(x))
228
#define ML99_charLit_IMPL(x) v(ML99_CHAR_LIT(x))
229
230
#define ML99_UNDERSCORE_DETECTOR ML99_PRIV_UNDERSCORE_DETECTOR_
231
#define ML99_C_KEYWORD_DETECTOR ML99_PRIV_C_KEYWORD_DETECTOR_
232
#define ML99_LOWERCASE_DETECTOR ML99_PRIV_LOWER_DETECTOR_
233
#define ML99_UPPERCASE_DETECTOR ML99_PRIV_UPPER_DETECTOR_
234
#define ML99_DIGIT_DETECTOR ML99_PRIV_DIGIT_DETECTOR_
235
236
#define ML99_PRIV_C_KEYWORD_DETECTOR_auto_auto ()
237
#define ML99_PRIV_C_KEYWORD_DETECTOR_break_break ()
238
#define ML99_PRIV_C_KEYWORD_DETECTOR_case_case ()
239
#define ML99_PRIV_C_KEYWORD_DETECTOR_char_char ()
240
#define ML99_PRIV_C_KEYWORD_DETECTOR_const_const ()
241
#define ML99_PRIV_C_KEYWORD_DETECTOR_continue_continue ()
242
#define ML99_PRIV_C_KEYWORD_DETECTOR_default_default ()
243
#define ML99_PRIV_C_KEYWORD_DETECTOR_do_do ()
244
#define ML99_PRIV_C_KEYWORD_DETECTOR_double_double ()
245
#define ML99_PRIV_C_KEYWORD_DETECTOR_else_else ()
246
#define ML99_PRIV_C_KEYWORD_DETECTOR_enum_enum ()
247
#define ML99_PRIV_C_KEYWORD_DETECTOR_extern_extern ()
248
#define ML99_PRIV_C_KEYWORD_DETECTOR_float_float ()
249
#define ML99_PRIV_C_KEYWORD_DETECTOR_for_for ()
250
#define ML99_PRIV_C_KEYWORD_DETECTOR_goto_goto ()
251
#define ML99_PRIV_C_KEYWORD_DETECTOR_if_if ()
252
#define ML99_PRIV_C_KEYWORD_DETECTOR_inline_inline ()
253
#define ML99_PRIV_C_KEYWORD_DETECTOR_int_int ()
254
#define ML99_PRIV_C_KEYWORD_DETECTOR_long_long ()
255
#define ML99_PRIV_C_KEYWORD_DETECTOR_register_register ()
256
#define ML99_PRIV_C_KEYWORD_DETECTOR_restrict_restrict ()
257
#define ML99_PRIV_C_KEYWORD_DETECTOR_return_return ()
258
#define ML99_PRIV_C_KEYWORD_DETECTOR_short_short ()
259
#define ML99_PRIV_C_KEYWORD_DETECTOR_signed_signed ()
260
#define ML99_PRIV_C_KEYWORD_DETECTOR_sizeof_sizeof ()
261
#define ML99_PRIV_C_KEYWORD_DETECTOR_static_static ()
262
#define ML99_PRIV_C_KEYWORD_DETECTOR_struct_struct ()
263
#define ML99_PRIV_C_KEYWORD_DETECTOR_switch_switch ()
264
#define ML99_PRIV_C_KEYWORD_DETECTOR_typedef_typedef ()
265
#define ML99_PRIV_C_KEYWORD_DETECTOR_union_union ()
266
#define ML99_PRIV_C_KEYWORD_DETECTOR_unsigned_unsigned ()
267
#define ML99_PRIV_C_KEYWORD_DETECTOR_void_void ()
268
#define ML99_PRIV_C_KEYWORD_DETECTOR_volatile_volatile ()
269
#define ML99_PRIV_C_KEYWORD_DETECTOR_while_while ()
270
#define ML99_PRIV_C_KEYWORD_DETECTOR__Alignas__Alignas ()
271
#define ML99_PRIV_C_KEYWORD_DETECTOR__Alignof__Alignof ()
272
#define ML99_PRIV_C_KEYWORD_DETECTOR__Atomic__Atomic ()
273
#define ML99_PRIV_C_KEYWORD_DETECTOR__Bool__Bool ()
274
#define ML99_PRIV_C_KEYWORD_DETECTOR__Complex__Complex ()
275
#define ML99_PRIV_C_KEYWORD_DETECTOR__Generic__Generic ()
276
#define ML99_PRIV_C_KEYWORD_DETECTOR__Imaginary__Imaginary ()
277
#define ML99_PRIV_C_KEYWORD_DETECTOR__Noreturn__Noreturn ()
278
#define ML99_PRIV_C_KEYWORD_DETECTOR__Static_assert__Static_assert ()
279
#define ML99_PRIV_C_KEYWORD_DETECTOR__Thread_local__Thread_local ()
280
281
#define ML99_PRIV_UNDERSCORE_DETECTOR__ ()
282
283
#define ML99_PRIV_LOWER_DETECTOR_a_a ()
284
#define ML99_PRIV_LOWER_DETECTOR_b_b ()
285
#define ML99_PRIV_LOWER_DETECTOR_c_c ()
286
#define ML99_PRIV_LOWER_DETECTOR_d_d ()
287
#define ML99_PRIV_LOWER_DETECTOR_e_e ()
288
#define ML99_PRIV_LOWER_DETECTOR_f_f ()
289
#define ML99_PRIV_LOWER_DETECTOR_g_g ()
290
#define ML99_PRIV_LOWER_DETECTOR_h_h ()
291
#define ML99_PRIV_LOWER_DETECTOR_i_i ()
292
#define ML99_PRIV_LOWER_DETECTOR_j_j ()
293
#define ML99_PRIV_LOWER_DETECTOR_k_k ()
294
#define ML99_PRIV_LOWER_DETECTOR_l_l ()
295
#define ML99_PRIV_LOWER_DETECTOR_m_m ()
296
#define ML99_PRIV_LOWER_DETECTOR_n_n ()
297
#define ML99_PRIV_LOWER_DETECTOR_o_o ()
298
#define ML99_PRIV_LOWER_DETECTOR_p_p ()
299
#define ML99_PRIV_LOWER_DETECTOR_q_q ()
300
#define ML99_PRIV_LOWER_DETECTOR_r_r ()
301
#define ML99_PRIV_LOWER_DETECTOR_s_s ()
302
#define ML99_PRIV_LOWER_DETECTOR_t_t ()
303
#define ML99_PRIV_LOWER_DETECTOR_u_u ()
304
#define ML99_PRIV_LOWER_DETECTOR_v_v ()
305
#define ML99_PRIV_LOWER_DETECTOR_w_w ()
306
#define ML99_PRIV_LOWER_DETECTOR_x_x ()
307
#define ML99_PRIV_LOWER_DETECTOR_y_y ()
308
#define ML99_PRIV_LOWER_DETECTOR_z_z ()
309
310
#define ML99_PRIV_UPPER_DETECTOR_A_A ()
311
#define ML99_PRIV_UPPER_DETECTOR_B_B ()
312
#define ML99_PRIV_UPPER_DETECTOR_C_C ()
313
#define ML99_PRIV_UPPER_DETECTOR_D_D ()
314
#define ML99_PRIV_UPPER_DETECTOR_E_E ()
315
#define ML99_PRIV_UPPER_DETECTOR_F_F ()
316
#define ML99_PRIV_UPPER_DETECTOR_G_G ()
317
#define ML99_PRIV_UPPER_DETECTOR_H_H ()
318
#define ML99_PRIV_UPPER_DETECTOR_I_I ()
319
#define ML99_PRIV_UPPER_DETECTOR_J_J ()
320
#define ML99_PRIV_UPPER_DETECTOR_K_K ()
321
#define ML99_PRIV_UPPER_DETECTOR_L_L ()
322
#define ML99_PRIV_UPPER_DETECTOR_M_M ()
323
#define ML99_PRIV_UPPER_DETECTOR_N_N ()
324
#define ML99_PRIV_UPPER_DETECTOR_O_O ()
325
#define ML99_PRIV_UPPER_DETECTOR_P_P ()
326
#define ML99_PRIV_UPPER_DETECTOR_Q_Q ()
327
#define ML99_PRIV_UPPER_DETECTOR_R_R ()
328
#define ML99_PRIV_UPPER_DETECTOR_S_S ()
329
#define ML99_PRIV_UPPER_DETECTOR_T_T ()
330
#define ML99_PRIV_UPPER_DETECTOR_U_U ()
331
#define ML99_PRIV_UPPER_DETECTOR_V_V ()
332
#define ML99_PRIV_UPPER_DETECTOR_W_W ()
333
#define ML99_PRIV_UPPER_DETECTOR_X_X ()
334
#define ML99_PRIV_UPPER_DETECTOR_Y_Y ()
335
#define ML99_PRIV_UPPER_DETECTOR_Z_Z ()
336
337
#define ML99_PRIV_DIGIT_DETECTOR_0_0 ()
338
#define ML99_PRIV_DIGIT_DETECTOR_1_1 ()
339
#define ML99_PRIV_DIGIT_DETECTOR_2_2 ()
340
#define ML99_PRIV_DIGIT_DETECTOR_3_3 ()
341
#define ML99_PRIV_DIGIT_DETECTOR_4_4 ()
342
#define ML99_PRIV_DIGIT_DETECTOR_5_5 ()
343
#define ML99_PRIV_DIGIT_DETECTOR_6_6 ()
344
#define ML99_PRIV_DIGIT_DETECTOR_7_7 ()
345
#define ML99_PRIV_DIGIT_DETECTOR_8_8 ()
346
#define ML99_PRIV_DIGIT_DETECTOR_9_9 ()
347
348
#define ML99_PRIV_CHAR_LIT_a 'a'
349
#define ML99_PRIV_CHAR_LIT_b 'b'
350
#define ML99_PRIV_CHAR_LIT_c 'c'
351
#define ML99_PRIV_CHAR_LIT_d 'd'
352
#define ML99_PRIV_CHAR_LIT_e 'e'
353
#define ML99_PRIV_CHAR_LIT_f 'f'
354
#define ML99_PRIV_CHAR_LIT_g 'g'
355
#define ML99_PRIV_CHAR_LIT_h 'h'
356
#define ML99_PRIV_CHAR_LIT_i 'i'
357
#define ML99_PRIV_CHAR_LIT_j 'j'
358
#define ML99_PRIV_CHAR_LIT_k 'k'
359
#define ML99_PRIV_CHAR_LIT_l 'l'
360
#define ML99_PRIV_CHAR_LIT_m 'm'
361
#define ML99_PRIV_CHAR_LIT_n 'n'
362
#define ML99_PRIV_CHAR_LIT_o 'o'
363
#define ML99_PRIV_CHAR_LIT_p 'p'
364
#define ML99_PRIV_CHAR_LIT_q 'q'
365
#define ML99_PRIV_CHAR_LIT_r 'r'
366
#define ML99_PRIV_CHAR_LIT_s 's'
367
#define ML99_PRIV_CHAR_LIT_t 't'
368
#define ML99_PRIV_CHAR_LIT_u 'u'
369
#define ML99_PRIV_CHAR_LIT_v 'v'
370
#define ML99_PRIV_CHAR_LIT_w 'w'
371
#define ML99_PRIV_CHAR_LIT_x 'x'
372
#define ML99_PRIV_CHAR_LIT_y 'y'
373
#define ML99_PRIV_CHAR_LIT_z 'z'
374
375
#define ML99_PRIV_CHAR_LIT_A 'A'
376
#define ML99_PRIV_CHAR_LIT_B 'B'
377
#define ML99_PRIV_CHAR_LIT_C 'C'
378
#define ML99_PRIV_CHAR_LIT_D 'D'
379
#define ML99_PRIV_CHAR_LIT_E 'E'
380
#define ML99_PRIV_CHAR_LIT_F 'F'
381
#define ML99_PRIV_CHAR_LIT_G 'G'
382
#define ML99_PRIV_CHAR_LIT_H 'H'
383
#define ML99_PRIV_CHAR_LIT_I 'I'
384
#define ML99_PRIV_CHAR_LIT_J 'J'
385
#define ML99_PRIV_CHAR_LIT_K 'K'
386
#define ML99_PRIV_CHAR_LIT_L 'L'
387
#define ML99_PRIV_CHAR_LIT_M 'M'
388
#define ML99_PRIV_CHAR_LIT_N 'N'
389
#define ML99_PRIV_CHAR_LIT_O 'O'
390
#define ML99_PRIV_CHAR_LIT_P 'P'
391
#define ML99_PRIV_CHAR_LIT_Q 'Q'
392
#define ML99_PRIV_CHAR_LIT_R 'R'
393
#define ML99_PRIV_CHAR_LIT_S 'S'
394
#define ML99_PRIV_CHAR_LIT_T 'T'
395
#define ML99_PRIV_CHAR_LIT_U 'U'
396
#define ML99_PRIV_CHAR_LIT_V 'V'
397
#define ML99_PRIV_CHAR_LIT_W 'W'
398
#define ML99_PRIV_CHAR_LIT_X 'X'
399
#define ML99_PRIV_CHAR_LIT_Y 'Y'
400
#define ML99_PRIV_CHAR_LIT_Z 'Z'
401
402
#define ML99_PRIV_CHAR_LIT_0 '0'
403
#define ML99_PRIV_CHAR_LIT_1 '1'
404
#define ML99_PRIV_CHAR_LIT_2 '2'
405
#define ML99_PRIV_CHAR_LIT_3 '3'
406
#define ML99_PRIV_CHAR_LIT_4 '4'
407
#define ML99_PRIV_CHAR_LIT_5 '5'
408
#define ML99_PRIV_CHAR_LIT_6 '6'
409
#define ML99_PRIV_CHAR_LIT_7 '7'
410
#define ML99_PRIV_CHAR_LIT_8 '8'
411
#define ML99_PRIV_CHAR_LIT_9 '9'
412
413
#define ML99_PRIV_CHAR_LIT__ '_'
414
415
// Arity specifiers {
416
417
#define ML99_detectIdent_ARITY 2
418
#define ML99_identEq_ARITY 3
419
#define ML99_charEq_ARITY 2
420
#define ML99_isLowercase_ARITY 1
421
#define ML99_isUppercase_ARITY 1
422
#define ML99_isDigit_ARITY 1
423
#define ML99_isChar_ARITY 1
424
#define ML99_charLit_ARITY 1
425
// } (Arity specifiers)
426
427
#endif
// DOXYGEN_IGNORE
428
429
#endif
// ML99_IDENT_H
lang.h
The core metalanguage.
include
metalang99
ident.h
Generated by
1.9.4