- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
#include <stdio.h>
typedef struct true_t {
char _;
} true_t;
true_t TRUE;
typedef struct false_t {
char _;
} false_t;
false_t FALSE;
int f_true() {
return 1;
}
int f_false() {
return 0;
}
#define bool_v(B) _Generic((B *) (0), true_t *: TRUE, false_t *: FALSE)
#define bool_v_to_int(B) _Generic(B, true_t: 1, false_t: 0)
#define v_to_bool(V) typeof(V)
#define is_string_v(X) _Generic((X), \
char *: 1, \
default: 0)
#define is_string_t(X) typeof(_Generic((X), \
char *: TRUE, \
default: FALSE))
#define has_signature_v(X, R, ...) \
_Generic((X), \
SignatureM(R, __VA_ARGS__): 1, \
default: 0)
#define has_signature_t(X, R, ...) \
typeof(_Generic((X), \
SignatureM(R, __VA_ARGS__): TRUE, \
default: FALSE))
#define to_string(x) _Generic((x), \
true_t: "true", \
false_t: "false", \
char*: x, \
const char*: x)
#define has_same_type_v(X, Y) \
_Generic(has_same_type_t(X, Y), \
true_t: 1, \
false_t: 0)
#define has_same_type_t(X, Y) typeof(_Generic((X), \
typeof(Y): TRUE, \
default: FALSE))
#define SignatureM(R, ...) R (*)(__VA_ARGS__)
#define is_same_t(X, Y) \
typeof(_Generic(((X *) (0)), \
Y *: TRUE, \
default: FALSE))
#define and_t(X, Y) \
typeof(_Generic(bool_v(X), \
true_t: _Generic(bool_v(Y), true_t: TRUE, false_t: FALSE), \
false_t: _Generic(bool_v(Y), true_t: FALSE, false_t: FALSE)))
#define or_t(X, Y) \
typeof(_Generic(bool_v(X), \
true_t: _Generic(bool_v(Y), true_t: TRUE, false_t: TRUE), \
false_t: _Generic(bool_v(Y), true_t: TRUE, false_t: FALSE)))
#define not_t(X) \
typeof(_Generic(bool_v(X), \
true_t: FALSE, \
false_t: TRUE))
#define result_t(X, ...) typeof((X) (__VA_ARGS__))
#define id_sig(T) SignatureM(T, void)
#define true_sig id_sig(true_t)
#define false_sig id_sig(false_t)
#define _0 false_sig
#define _1 true_sig
#define bool_sig_v(S) _Generic((S) (0), true_sig: TRUE, false_sig: FALSE)
#define bool_sig_int(S) _Generic((S) (0), true_sig: 1, false_sig: 0)
#define bool_sig_t(S) typeof(bool_sig_v(S))
#define sig_apply_res_t(X) typeof(((X) (0))())
#define is_same_sig_t(SA, SB) typeof(_Generic((SA) (0), SB: TRUE, default: FALSE))