summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorAdrian Moreno <amorenoz@redhat.com>2022-03-23 12:56:12 +0100
committerIlya Maximets <i.maximets@ovn.org>2022-03-30 16:59:02 +0200
commit5a2940978e0411267761d483e0777296fb0ebf7f (patch)
tree5a39c39345b867e9110830f70d450135497ae18c /include
parent882689711fdbd1796ad354b657be2001bbbc68ee (diff)
downloadopenvswitch-5a2940978e0411267761d483e0777296fb0ebf7f.tar.gz
util: add helpers to overload SAFE macro.
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 <dceara@redhat.com> Acked-by: Eelco Chaudron <echaudro@redhat.com> Signed-off-by: Adrian Moreno <amorenoz@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
Diffstat (limited to 'include')
-rw-r--r--include/openvswitch/util.h21
1 files changed, 21 insertions, 0 deletions
diff --git a/include/openvswitch/util.h b/include/openvswitch/util.h
index d86e66e27..96f600160 100644
--- a/include/openvswitch/util.h
+++ b/include/openvswitch/util.h
@@ -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)