[PATCH v8 14/15] include/array_length.h: add array_foreach[_const] macros

H. Peter Anvin hpa@zytor.com
Tue Jun 10 19:02:25 GMT 2025


Add simple-to-use iterator macros for arrays.  They are used instead
of explicit for statements, like:

      /* Test all common speeds */
      array_foreach_const (ts, test_speeds)
	test (fd, *ts);

In this case, ts will be a const pointer to each of the elements of
test_speeds in turn.

Named array_foreach*() to allow for other kinds of equivalent iterator
macros in the future.

Signed-off-by: "H. Peter Anvin" (Intel) <hpa@zytor.com>
---
 include/array_length.h | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/include/array_length.h b/include/array_length.h
index 2305e211b210..53e436b53387 100644
--- a/include/array_length.h
+++ b/include/array_length.h
@@ -33,4 +33,18 @@
    VAR must evaluate to an array, not a pointer.  */
 #define array_end(var) (&(var)[array_length (var)])
 
+/* array_foreach (PTR, ARRAY) iterates over all the elements in an
+   array, assigning the locally defined pointer variable PTR to each
+   element in turn.
+
+   array_foreach_const (PTR, ARRAY) does the same, but PTR is declared
+   const even if the array is not. */
+#define array_foreach(ptr, array)                                      \
+  for (__typeof ((array)[0]) *ptr = (array) ;			       \
+       ptr < array_end(array) ; ptr++)
+
+#define array_foreach_const(ptr, array)                                \
+  for (const __typeof ((array)[0]) *ptr = (array) ;		       \
+       ptr < array_end(array) ; ptr++)
+
 #endif /* _ARRAY_LENGTH_H */
-- 
2.49.0



More information about the Libc-alpha mailing list