macros: use short-circuit evaluation in NM_IN_SET()

All current users of NM_IN_SET() would rather use short-circuit evalation
(or don't care). It seems that doing it by default seems favorable.

The only downside is, that this might have somewhat unexpected behavior
to a user who expects a regular function (which would evaluate always
all arguments).

Fixes: 7860ef959a
This commit is contained in:
Thomas Haller 2015-08-12 13:04:12 +02:00
parent 7860ef959a
commit 96cacc07e8
2 changed files with 40 additions and 39 deletions

View file

@ -159,13 +159,15 @@
#define _NM_IN_SET_EVAL_N2(op, x, n, ...) _NM_IN_SET_EVAL_##n(op, x, __VA_ARGS__)
#define _NM_IN_SET_EVAL_N(op, x, n, ...) _NM_IN_SET_EVAL_N2(op, x, n, __VA_ARGS__)
/* does not do short-circuit evaluation to get a more function-like behavior
* ("|" instead of "||"). Use NM_IN_SET_SC() if you want that */
#define NM_IN_SET(x, ...) _NM_IN_SET_EVAL_N(| , x, NM_NARG (__VA_ARGS__), __VA_ARGS__)
/* Beware that this does short-circuit evaluation (use "||" instead of "|")
* which has a possibly unexpected non-function-like behavior.
* Use NM_IN_SET_SE if you need all arguments to be evaluted. */
#define NM_IN_SET(x, ...) _NM_IN_SET_EVAL_N(||, x, NM_NARG (__VA_ARGS__), __VA_ARGS__)
/* "SC" stands for "short-cirtuit". It will only evaluate the arguments
* until a match is found. */
#define NM_IN_SET_SC(x, ...) _NM_IN_SET_EVAL_N(||, x, NM_NARG (__VA_ARGS__), __VA_ARGS__)
/* "SE" stands for "side-effect". Contrary to NM_IN_SET(), this does not do
* short-circuit evaluation, which can make a difference if the arguments have
* side-effects. */
#define NM_IN_SET_SE(x, ...) _NM_IN_SET_EVAL_N(|, x, NM_NARG (__VA_ARGS__), __VA_ARGS__)
/*****************************************************************************/

View file

@ -4745,52 +4745,51 @@ test_nm_in_set (void)
_ASSERT (1, NM_IN_SET (-1, G(-1)));
_ASSERT (2, !NM_IN_SET (-1, G( 1), G( 2)));
_ASSERT (2, NM_IN_SET (-1, G(-1), G( 2)));
_ASSERT (1, NM_IN_SET (-1, G(-1), N( 2)));
_ASSERT (2, NM_IN_SET (-1, G( 1), G(-1)));
_ASSERT (2, NM_IN_SET (-1, G(-1), G(-1)));
_ASSERT (1, NM_IN_SET (-1, G(-1), N(-1)));
_ASSERT (3, !NM_IN_SET (-1, G( 1), G( 2), G( 3)));
_ASSERT (3, NM_IN_SET (-1, G(-1), G( 2), G( 3)));
_ASSERT (3, NM_IN_SET (-1, G( 1), G(-1), G( 3)));
_ASSERT (1, NM_IN_SET (-1, G(-1), N( 2), N( 3)));
_ASSERT (2, NM_IN_SET (-1, G( 1), G(-1), N( 3)));
_ASSERT (3, NM_IN_SET (-1, G( 1), G( 2), G(-1)));
_ASSERT (3, NM_IN_SET (-1, G( 1), G(-1), G(-1)));
_ASSERT (3, NM_IN_SET (-1, G(-1), G( 2), G(-1)));
_ASSERT (3, NM_IN_SET (-1, G(-1), G(-1), G( 3)));
_ASSERT (3, NM_IN_SET (-1, G(-1), G(-1), G(-1)));
_ASSERT (2, NM_IN_SET (-1, G( 1), G(-1), N(-1)));
_ASSERT (1, NM_IN_SET (-1, G(-1), N( 2), N(-1)));
_ASSERT (1, NM_IN_SET (-1, G(-1), N(-1), N( 3)));
_ASSERT (1, NM_IN_SET (-1, G(-1), N(-1), N(-1)));
_ASSERT (4, !NM_IN_SET (-1, G( 1), G( 2), G( 3), G( 4)));
_ASSERT (4, NM_IN_SET (-1, G(-1), G( 2), G( 3), G( 4)));
_ASSERT (4, NM_IN_SET (-1, G( 1), G(-1), G( 3), G( 4)));
_ASSERT (4, NM_IN_SET (-1, G( 1), G( 2), G(-1), G( 4)));
_ASSERT (1, NM_IN_SET (-1, G(-1), N( 2), N( 3), N( 4)));
_ASSERT (2, NM_IN_SET (-1, G( 1), G(-1), N( 3), N( 4)));
_ASSERT (3, NM_IN_SET (-1, G( 1), G( 2), G(-1), N( 4)));
_ASSERT (4, NM_IN_SET (-1, G( 1), G( 2), G( 3), G(-1)));
_ASSERT (5, NM_IN_SET (-1, G( 1), G( 2), G( 3), G(-1), G( 5)));
_ASSERT (4, NM_IN_SET (-1, G( 1), G( 2), G( 3), G(-1), G( 5)));
_ASSERT (1, !NM_IN_SET_SC (-1, G( 1)));
_ASSERT (1, NM_IN_SET_SC (-1, G(-1)));
_ASSERT (1, !NM_IN_SET_SE (-1, G( 1)));
_ASSERT (1, NM_IN_SET_SE (-1, G(-1)));
_ASSERT (2, !NM_IN_SET_SC (-1, G( 1), G( 2)));
_ASSERT (1, NM_IN_SET_SC (-1, G(-1), N( 2)));
_ASSERT (2, NM_IN_SET_SC (-1, G( 1), G(-1)));
_ASSERT (1, NM_IN_SET_SC (-1, G(-1), N(-1)));
_ASSERT (2, !NM_IN_SET_SE (-1, G( 1), G( 2)));
_ASSERT (2, NM_IN_SET_SE (-1, G(-1), G( 2)));
_ASSERT (2, NM_IN_SET_SE (-1, G( 1), G(-1)));
_ASSERT (2, NM_IN_SET_SE (-1, G(-1), G(-1)));
_ASSERT (3, !NM_IN_SET_SC (-1, G( 1), G( 2), G( 3)));
_ASSERT (1, NM_IN_SET_SC (-1, G(-1), N( 2), N( 3)));
_ASSERT (2, NM_IN_SET_SC (-1, G( 1), G(-1), N( 3)));
_ASSERT (3, NM_IN_SET_SC (-1, G( 1), G( 2), G(-1)));
_ASSERT (2, NM_IN_SET_SC (-1, G( 1), G(-1), N(-1)));
_ASSERT (1, NM_IN_SET_SC (-1, G(-1), N( 2), N(-1)));
_ASSERT (1, NM_IN_SET_SC (-1, G(-1), N(-1), N( 3)));
_ASSERT (1, NM_IN_SET_SC (-1, G(-1), N(-1), N(-1)));
_ASSERT (3, !NM_IN_SET_SE (-1, G( 1), G( 2), G( 3)));
_ASSERT (3, NM_IN_SET_SE (-1, G(-1), G( 2), G( 3)));
_ASSERT (3, NM_IN_SET_SE (-1, G( 1), G(-1), G( 3)));
_ASSERT (3, NM_IN_SET_SE (-1, G( 1), G( 2), G(-1)));
_ASSERT (3, NM_IN_SET_SE (-1, G( 1), G(-1), G(-1)));
_ASSERT (3, NM_IN_SET_SE (-1, G(-1), G( 2), G(-1)));
_ASSERT (3, NM_IN_SET_SE (-1, G(-1), G(-1), G( 3)));
_ASSERT (3, NM_IN_SET_SE (-1, G(-1), G(-1), G(-1)));
_ASSERT (4, !NM_IN_SET_SC (-1, G( 1), G( 2), G( 3), G( 4)));
_ASSERT (1, NM_IN_SET_SC (-1, G(-1), N( 2), N( 3), N( 4)));
_ASSERT (2, NM_IN_SET_SC (-1, G( 1), G(-1), N( 3), N( 4)));
_ASSERT (3, NM_IN_SET_SC (-1, G( 1), G( 2), G(-1), N( 4)));
_ASSERT (4, NM_IN_SET_SC (-1, G( 1), G( 2), G( 3), G(-1)));
_ASSERT (4, NM_IN_SET_SC (-1, G( 1), G( 2), G( 3), G(-1), G( 5)));
_ASSERT (4, !NM_IN_SET_SE (-1, G( 1), G( 2), G( 3), G( 4)));
_ASSERT (4, NM_IN_SET_SE (-1, G(-1), G( 2), G( 3), G( 4)));
_ASSERT (4, NM_IN_SET_SE (-1, G( 1), G(-1), G( 3), G( 4)));
_ASSERT (4, NM_IN_SET_SE (-1, G( 1), G( 2), G(-1), G( 4)));
_ASSERT (4, NM_IN_SET_SE (-1, G( 1), G( 2), G( 3), G(-1)));
_ASSERT (5, NM_IN_SET_SE (-1, G( 1), G( 2), G( 3), G(-1), G( 5)));
#undef G
#undef N
#undef _ASSERT