include/array_length.h: add array_foreach[_const] macros

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>
Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
This commit is contained in:
H. Peter Anvin 2025-06-11 18:35:44 -07:00 committed by Adhemerval Zanella
parent be413adedf
commit c66801f361
1 changed files with 14 additions and 0 deletions

View File

@ -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 */