Metalang99 1.13.3
Full-blown preprocessor metaprogramming
Loading...
Searching...
No Matches
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
The core metalanguage.