1 2 3 4 5 6 7 8 9 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
| #include <stdio.h>
#include <stdbool.h>
#define _IF_VALUE__SECOND(_a, _b, ...) _b
#define _IF_VALUE__SECOND_2(_a, _b, ...) _IF_VALUE__SECOND(_a, _b, __VA_ARGS__)
#define _IF_VALUE__CHECK__IF_VALUE__IS_EMPTY() ~, _IF_VALUE__IS_EMPTY
#define _IF_VALUE__CHECK(_first, ...) _IF_VALUE__SECOND_2(_IF_VALUE__CHECK_ ## _first (), _IF_VALUE__NOT_EMPTY, ~)
#define _IF_VALUE__CHECK_2(_first, ...) _IF_VALUE__CHECK(_first, __VA_ARGS__)
#define _IF_VALUE__IS_EMPTY(...) _IF_VALUE__IS_EMPTY_1
#define _IF_VALUE__IS_EMPTY_1(...) __VA_ARGS__
#define _IF_VALUE__NOT_EMPTY(...) __VA_ARGS__ _IF_VALUE__NOT_EMPTY_1
#define _IF_VALUE__NOT_EMPTY_1(...)
#define IF_VALUE(_maybe_empty) _IF_VALUE__CHECK_2(_IF_VALUE__CHECK _maybe_empty (_IF_VALUE__IS_EMPTY, ~), ~)
# define IN_SECOND(p2) p1, p2
# define SECOND_(p1, p2, ...) p2
# define SECOND(p1, p2, ...) SECOND_(p1, p2, __VA_ARGS__)
# define IF_SOME(maybe_empty, p2, p3) SECOND(IN_SECOND maybe_empty (p3), p2)
#define NB_ARGS_(_0, _1_, _2_, _3_, _4_, _5_, _6_, _7_, _8_, _9_, _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, count, ...) count
#define IF_EMPTY(...) NB_ARGS_(0 __VA_OPT__(,) __VA_ARGS__, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)
int main()
{
bool a = IF_SOME(, 1, 0);
bool d = IF_VALUE()(1)(0);
bool g = IF_EMPTY();
/*
_IF_VALUE__CHECK_2(_IF_VALUE__CHECK (_IF_VALUE__IS_EMPTY, ~), ~)(1)(0)
_IF_VALUE__CHECK_2(_IF_VALUE__SECOND_2(_IF_VALUE__CHECK_ ## _IF_VALUE__IS_EMPTY (), _IF_VALUE__NOT_EMPTY, ~), ~)(1)(0)
_IF_VALUE__CHECK_2(_IF_VALUE__SECOND_2(~, _IF_VALUE__IS_EMPTY, _IF_VALUE__NOT_EMPTY, ~), ~)(1)(0)
_IF_VALUE__CHECK_2(_IF_VALUE__SECOND(~, _IF_VALUE__IS_EMPTY, _IF_VALUE__NOT_EMPTY, ~), ~)(1)(0)
_IF_VALUE__CHECK_2(_IF_VALUE__IS_EMPTY, ~)(1)(0)
_IF_VALUE__CHECK(_IF_VALUE__IS_EMPTY, ~)(1)(0)
_IF_VALUE__SECOND_2(_IF_VALUE__CHECK_ ## _IF_VALUE__IS_EMPTY (), _IF_VALUE__NOT_EMPTY, ~)(1)(0)
_IF_VALUE__SECOND_2(~, _IF_VALUE__IS_EMPTY, _IF_VALUE__NOT_EMPTY, ~)(1)(0)
_IF_VALUE__SECOND(~, _IF_VALUE__IS_EMPTY, _IF_VALUE__NOT_EMPTY, ~)(1)(0)
_IF_VALUE__IS_EMPTY(1)(0)
_IF_VALUE__IS_EMPTY_1(0)
0
*/
bool b = IF_SOME(2, 1, 0);
bool e = IF_VALUE(2)(1)(0);
bool h = IF_EMPTY(2);
/*
_IF_VALUE__CHECK_2(_IF_VALUE__CHECK 1 (_IF_VALUE__IS_EMPTY, ~), ~)(1)(0)
_IF_VALUE__CHECK(_IF_VALUE__CHECK 1 (_IF_VALUE__IS_EMPTY, ~), ~)(1)(0)
_IF_VALUE__SECOND_2(_IF_VALUE__CHECK_ ## _IF_VALUE__CHECK 1 (_IF_VALUE__IS_EMPTY, ~)(), _IF_VALUE__NOT_EMPTY, ~)(1)(0)
_IF_VALUE__SECOND_2(_IF_VALUE__CHECK__IF_VALUE__CHECK 1 (_IF_VALUE__IS_EMPTY, ~)(), _IF_VALUE__NOT_EMPTY, ~)(1)(0)
_IF_VALUE__SECOND(_IF_VALUE__CHECK__IF_VALUE__CHECK 1 (_IF_VALUE__IS_EMPTY, ~)(), _IF_VALUE__NOT_EMPTY, ~)(1)(0)
_IF_VALUE__NOT_EMPTY(1)(0)
1 _IF_VALUE__NOT_EMPTY_1(0)
1
*/
bool c = IF_SOME(a(2,3), 1, 0);
bool f = IF_VALUE((2,3))(1)(0);
bool i = IF_EMPTY(a,{((2,3)]););
printf("IF_SOME(, 1, 0) = %d et %s\nIF_VALUE()(1)(0) = %d et %s\nIF_EMPTY() = %d et %s\n\n", a, a ? "contient quelque chose" : "ne contient rien", d, d ? "a une valeur" : "n'a pas de valeur", g, g ? "est vide" : "n'est pas vide");
printf("IF_SOME(2, 1, 0) = %d et %s\nIF_VALUE(2)(1)(0) = %d et %s\nIF_EMPTY(2) = %d et %s\n\n", b, b ? "contient quelque chose" : "ne contient rien", e, e ? "a une valeur" : "n'a pas de valeur", h, h ? "est vide" : "n'est pas vide");
printf("IF_SOME(a(2,3), 1, 0) = %d et %s\nIF_VALUE((2,3))(1)(0) = %d et %s\nIF_EMPTY(a,{((2,3)]);) = %d et %s", c, c ? "contient quelque chose" : "ne contient rien", f, f ? "a une valeur" : "n'a pas de valeur", i, i ? "est vide" : "n'est pas vide");
return 0;
} |
Partager