Skip to content

Commit

Permalink
util: add helpers to overload SAFE macro.
Browse files Browse the repository at this point in the history
Having both LONG and SHORT versions of the SAFE macros with different
names is not very convenient. Add helpers that facilitate overloading
such macros using a single name.

In order to work around a known issue in MSVC [1], an indirection layer
has to be introduced.

[1]
https://developercommunity.visualstudio.com/t/-va-args-seems-to-be-trated-as-a-single-parameter/460154

Acked-by: Dumitru Ceara <[email protected]>
Acked-by: Eelco Chaudron <[email protected]>
Signed-off-by: Adrian Moreno <[email protected]>
Signed-off-by: Ilya Maximets <[email protected]>
  • Loading branch information
amorenoz authored and igsilya committed Mar 30, 2022
1 parent 8826897 commit 5a29409
Showing 1 changed file with 21 additions and 0 deletions.
21 changes: 21 additions & 0 deletions include/openvswitch/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,27 @@ OVS_NO_RETURN void ovs_assert_failure(const char *, const char *, const char *);
#define UPDATE_MULTIVAR_SAFE_LONG(VAR, NEXT_VAR) \
UPDATE_MULTIVAR(VAR, ITER_VAR(NEXT_VAR))

/* Helpers to allow overloading the *_SAFE iterator macros and select either
* the LONG or the SHORT version depending on the number of arguments.
*/
#define GET_SAFE_MACRO2(_1, _2, NAME, ...) NAME
#define GET_SAFE_MACRO3(_1, _2, _3, NAME, ...) NAME
#define GET_SAFE_MACRO4(_1, _2, _3, _4, NAME, ...) NAME
#define GET_SAFE_MACRO5(_1, _2, _3, _4, _5, NAME, ...) NAME
#define GET_SAFE_MACRO6(_1, _2, _3, _4, _5, _6, NAME, ...) NAME
#define GET_SAFE_MACRO(MAX_ARGS) GET_SAFE_MACRO ## MAX_ARGS

/* MSVC treats __VA_ARGS__ as a simple token in argument lists. Introduce
* a level of indirection to work around that. */
#define EXPAND_MACRO(name, args) name args

/* Overload the LONG and the SHORT version of the macros. MAX_ARGS is the
* maximum number of arguments (i.e: the number of arguments of the LONG
* version). */
#define OVERLOAD_SAFE_MACRO(LONG, SHORT, MAX_ARGS, ...) \
EXPAND_MACRO(GET_SAFE_MACRO(MAX_ARGS), \
(__VA_ARGS__, LONG, SHORT))(__VA_ARGS__)

/* Returns the number of elements in ARRAY. */
#define ARRAY_SIZE(ARRAY) __ARRAY_SIZE(ARRAY)

Expand Down

0 comments on commit 5a29409

Please sign in to comment.