macros.h: Implement SIDE_PARAM_SELECT_ARG1
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 21 Sep 2023 04:30:40 +0000 (05:30 +0100)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 21 Sep 2023 04:41:37 +0000 (05:41 +0100)
Implement the SIDE_PARAM_SELECT_ARG1 macro which allows side macros to
support optional last argument. This is useful for attribute lists,
which are typically empty.

Suggested-by: Olivier Dion <odion@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/side/macros.h

index 796b708200a573a37aed0aab5562b1690f46467f..aea7b9ca5e71c12de16afb752213572515cffff3 100644 (file)
 
 #define SIDE_PARAM(...)        __VA_ARGS__
 
+/*
+ * SIDE_PARAM_SELECT_ARG1
+ *
+ * Select second argument. Use inside macros to implement optional last
+ * macro argument, such as:
+ *
+ * #define macro(_a, _b, _c, _optional...) \
+ *     SIDE_PARAM_SELECT_ARG1(_, ##_optional, do_default_macro())
+ *
+ * This macro is far from pretty, but attempts to create a cleaner layer
+ * on top fails for various reasons:
+ *
+ * - The libside API needs to use the default argument selection as an
+ *   argument to itself (recursively), e.g. for fields and for types, so
+ *   using the argument selection within an extra layer of macro fails
+ *   because the extra layer cannot expand recursively.
+ * - Attempts to make the extra layer of macro support recursion through
+ *   another layer of macros which expands all arguments failed because
+ *   the optional argument may contain commas, and is therefore expanded
+ *   into multiple arguments before argument selection, which fails to
+ *   select the optional argument content after its first comma.
+ */
+#define SIDE_PARAM_SELECT_ARG1(_arg0, _arg1, ...) _arg1
+
 /*
  * side_container_of - Get the address of an object containing a field.
  *
This page took 0.023668 seconds and 4 git commands to generate.