From: H. Peter Anvin Date: Thu, 12 Jun 2025 01:35:44 +0000 (-0700) Subject: include/array_length.h: add array_foreach[_const] macros X-Git-Tag: glibc-2.42~119 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c66801f36135a7b031ca37e25a35e98255b20def;p=thirdparty%2Fglibc.git 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) Reviewed-by: Adhemerval Zanella --- diff --git a/include/array_length.h b/include/array_length.h index 2305e211b2..2a4f09fd37 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 */