mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-02-04 22:20:27 +01:00
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:
parent
7860ef959a
commit
96cacc07e8
2 changed files with 40 additions and 39 deletions
|
|
@ -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__)
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue