[PATCH v9 13/14] include/array_length.h: add array_foreach[_const] macros

Adhemerval Zanella Netto adhemerval.zanella@linaro.org
Mon Jun 16 17:29:40 GMT 2025



On 11/06/25 22:35, H. Peter Anvin wrote:
> 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>

LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

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



More information about the Libc-alpha mailing list