From: Michal Wajdeczko <michal.wajdeczko@intel.com>
To: intel-xe@lists.freedesktop.org
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
Lucas De Marchi <lucas.demarchi@intel.com>
Subject: [PATCH 1/2] args.h: add more helpers for manipulating macro arguments
Date: Thu, 2 May 2024 00:32:20 +0200 [thread overview]
Message-ID: <20240501223221.2395-2-michal.wajdeczko@intel.com> (raw)
In-Reply-To: <20240501223221.2395-1-michal.wajdeczko@intel.com>
Some advanced macros used to generate code may use helper macros
to manipulate the argument lists. Define generic helpers that can
replace existing local definitions and allow reuse by new code.
Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
---
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
---
include/linux/args.h | 103 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 103 insertions(+)
diff --git a/include/linux/args.h b/include/linux/args.h
index 8ff60a54eb7d..141803f0f41c 100644
--- a/include/linux/args.h
+++ b/include/linux/args.h
@@ -25,4 +25,107 @@
#define __CONCAT(a, b) a ## b
#define CONCATENATE(a, b) __CONCAT(a, b)
+/**
+ * CALL_ARGS - Invoke a macro, but allow parameters to be expanded beforehand.
+ * @f: name of the macro to invoke
+ * @args: arguments for the macro
+ *
+ * This macro allows calling macros which names might generated or we want to
+ * make sure it's arguments will be correctly expanded.
+ *
+ * Example:
+ *
+ * #define foo X,Y,Z,Q
+ * #define bar COUNT_ARGS(foo)
+ * #define buz CALL_ARGS(COUNT_ARGS, foo)
+ *
+ * With above definitions bar expands to 1 while buz expands to 4.
+ */
+#define CALL_ARGS(f, args...) __CALL_ARGS(f, args)
+#define __CALL_ARGS(f, args...) f(args)
+
+/**
+ * DROP_FIRST - Returns all arguments except the first one.
+ * @args: arguments
+ *
+ * This helper macro allows manipulation the argument list before passing it
+ * to the next level macro.
+ *
+ * Example:
+ *
+ * #define foo X,Y,Z,Q
+ * #define bar CALL_ARGS(COUNT_ARGS, DROP_FIRST(foo))
+ *
+ * With above definitions bar expands to 3.
+ */
+#define DROP_FIRST(args...) __DROP_FIRST(args)
+#define __DROP_FIRST(a, b...) b
+
+/**
+ * PICK_FIRST - Returns the first argument.
+ * @args: arguments
+ *
+ * This helper macro allows manipulation the argument list before passing it
+ * to the next level macro.
+ *
+ * Example:
+ *
+ * #define foo X,Y,Z,Q
+ * #define bar PICK_FIRST(foo)
+ *
+ * With above definitions bar expands to X.
+ */
+#define PICK_FIRST(args...) __PICK_FIRST(args)
+#define __PICK_FIRST(a, b...) a
+
+/**
+ * PICK_LAST - Returns the last argument.
+ * @args: arguments
+ *
+ * This helper macro allows manipulation the argument list before passing it
+ * to the next level macro.
+ *
+ * Like COUNT_ARGS() this macro works up to 12 arguments.
+ *
+ * Example:
+ *
+ * #define foo X,Y,Z,Q
+ * #define bar PICK_LAST(foo)
+ *
+ * With above definitions bar expands to Q.
+ */
+#define PICK_LAST(args...) __PICK_ARG(COUNT_ARGS(args), args)
+#define __PICK_ARG(n, args...) CALL_ARGS(CONCATENATE(PICK_ARG, n), args)
+#define PICK_ARG1(args...) PICK_FIRST(args)
+#define PICK_ARG2(args...) PICK_ARG1(DROP_FIRST(args))
+#define PICK_ARG3(args...) PICK_ARG2(DROP_FIRST(args))
+#define PICK_ARG4(args...) PICK_ARG3(DROP_FIRST(args))
+#define PICK_ARG5(args...) PICK_ARG4(DROP_FIRST(args))
+#define PICK_ARG6(args...) PICK_ARG5(DROP_FIRST(args))
+#define PICK_ARG7(args...) PICK_ARG6(DROP_FIRST(args))
+#define PICK_ARG8(args...) PICK_ARG7(DROP_FIRST(args))
+#define PICK_ARG9(args...) PICK_ARG8(DROP_FIRST(args))
+#define PICK_ARG10(args...) PICK_ARG9(DROP_FIRST(args))
+#define PICK_ARG11(args...) PICK_ARG10(DROP_FIRST(args))
+#define PICK_ARG12(args...) PICK_ARG11(DROP_FIRST(args))
+
+/**
+ * ARGS_SEP_COMMA - Definition of a comma character.
+ *
+ * This definition can be used in cases where any intermediate macro expects
+ * fixed number of arguments, but we want to pass more arguments which can
+ * be properly evaluated only by the next level macro.
+ *
+ * Example:
+ *
+ * #define foo(f) f(X) f(Y) f(Z) f(Q)
+ * #define bar DROP_FIRST(foo(ARGS_SEP_COMMA __stringify))
+ * #define buz CALL_ARGS(COUNT_ARGS, DROP_FIRST(foo(ARGS_SEP_COMMA)))
+ *
+ * With above definitions bar expands to
+ * "X", "Y", "Z", "Q"
+ * and buz expands to 4.
+ */
+#define ARGS_SEP_COMMA ,
+
#endif /* _LINUX_ARGS_H */
--
2.43.0
next prev parent reply other threads:[~2024-05-01 22:32 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-01 22:32 [PATCH 0/2] Define generic helpers for manipulating macro arguments Michal Wajdeczko
2024-05-01 22:32 ` Michal Wajdeczko [this message]
2024-05-02 7:27 ` [PATCH 1/2] args.h: add more " Andy Shevchenko
2024-05-02 9:49 ` Michal Wajdeczko
2024-05-02 10:17 ` Andy Shevchenko
2024-05-01 22:32 ` [PATCH 2/2] drm/xe/rtp: Prefer helper macros from args.h Michal Wajdeczko
2024-05-01 22:38 ` ✓ CI.Patch_applied: success for Define generic helpers for manipulating macro arguments Patchwork
2024-05-01 22:38 ` ✗ CI.checkpatch: warning " Patchwork
2024-05-01 22:39 ` ✓ CI.KUnit: success " Patchwork
2024-05-01 22:51 ` ✓ CI.Build: " Patchwork
2024-05-01 22:53 ` ✓ CI.Hooks: " Patchwork
2024-05-01 22:54 ` ✗ CI.checksparse: warning " Patchwork
2024-05-01 23:17 ` ✓ CI.BAT: success " Patchwork
2024-05-02 0:21 ` ✓ CI.FULL: " Patchwork
2024-05-02 7:24 ` [PATCH 0/2] " Andy Shevchenko
2024-05-02 9:24 ` Michal Wajdeczko
2024-05-02 17:38 ` Lucas De Marchi
2024-05-02 19:50 ` Michal Wajdeczko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240501223221.2395-2-michal.wajdeczko@intel.com \
--to=michal.wajdeczko@intel.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=intel-xe@lists.freedesktop.org \
--cc=lucas.demarchi@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox