I was wondering if theres an ELEM
comparison macro in general use, where:
(v == a || v == b)
Can be replaced with:
ELEM(v, a, b)
Of course this can be done with a macro,
#define ELEM(v, a, b) (((v) == (a)) || ((v) == (b)))
However Then you end up needing to define multiple macros with argument counts.
Using a simple python script I came up with this:
#define ELEM2(v, a, b) \
(((v) == (a)) || ((v) == (b)))
#define ELEM3(v, a, b, c) \
(ELEM2(v, a, b) || ((v) == (c)))
#define ELEM4(v, a, b, c, d) \
(ELEM3(v, a, b, c) || ((v) == (d)))
#define ELEM5(v, a, b, c, d, e) \
(ELEM4(v, a, b, c, d) || ((v) == (e)))
#define ELEM6(v, a, b, c, d, e, f) \
(ELEM5(v, a, b, c, d, e) || ((v) == (f)))
#define ELEM7(v, a, b, c, d, e, f, g) \
(ELEM6(v, a, b, c, d, e, f) || ((v) == (g)))
#define ELEM8(v, a, b, c, d, e, f, g, h) \
(ELEM7(v, a, b, c, d, e, f, g) || ((v) == (h)))
#define ELEM9(v, a, b, c, d, e, f, g, h, i) \
(ELEM8(v, a, b, c, d, e, f, g, h) || ((v) == (i)))
#define ELEM10(v, a, b, c, d, e, f, g, h, i, j) \
(ELEM9(v, a, b, c, d, e, f, g, h, i) || ((v) == (j)))
#define ELEM11(v, a, b, c, d, e, f, g, h, i, j, k) \
(ELEM10(v, a, b, c, d, e, f, g, h, i, j) || ((v) == (k)))
#define ELEM12(v, a, b, c, d, e, f, g, h, i, j, k, l) \
(ELEM11(v, a, b, c, d, e, f, g, h, i, j, k) || ((v) == (l)))
#define ELEM13(v, a, b, c, d, e, f, g, h, i, j, k, l, m) \
(ELEM12(v, a, b, c, d, e, f, g, h, i, j, k, l) || ((v) == (m)))
#define ELEM14(v, a, b, c, d, e, f, g, h, i, j, k, l, m, n) \
(ELEM13(v, a, b, c, d, e, f, g, h, i, j, k, l, m) || ((v) == (n)))
#define ELEM15(v, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) \
(ELEM14(v, a, b, c, d, e, f, g, h, i, j, k, l, m, n) || ((v) == (o)))
#define ELEM16(v, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) \
(ELEM15(v, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) || ((v) == (p)))
From this python3-script:
ELEM_TOTAL = 16
for i in range(2, ELEM_TOTAL + 1):
print("#define ELEM%d(" % i, end="")
print("v, ", end="")
args = [chr(ord('a') + j) for j in range(i)]
print(", ".join(args), end="")
print(") \\\n (", end="")
if i == 2:
print("((v) == (a)) || ((v) == (b))", end="")
else:
print("ELEM%d(v, %s) || ((v) == (%s))" % (i - 1, ", ".join(args[:-1]), args[-1]), end="")
print(")")
But I was wondering if there are any ELEM
macros in common use which accept a variable number of arguments and are at least portable enough to work with popular C compilers (GCC, Clang, Intel, MCVC).