On 2/21/2024 8:29 AM, Markus Armbruster wrote:
> Steve Sistare <steven.sistare@oracle.com> writes:
>
>> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
>> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>> ---
>> include/qapi/util.h | 13 +++++++++++++
>> 1 file changed, 13 insertions(+)
>>
>> diff --git a/include/qapi/util.h b/include/qapi/util.h
>> index 81a2b13..e1b8b1d 100644
>> --- a/include/qapi/util.h
>> +++ b/include/qapi/util.h
>> @@ -56,4 +56,17 @@ int parse_qapi_name(const char *name, bool complete);
>> (tail) = &(*(tail))->next; \
>> } while (0)
>>
>> +/*
>> + * For any GenericList @list, return its length.
>> + */
>> +#define QAPI_LIST_LENGTH(list) \
>> + ({ \
>> + int len = 0; \
>
> size_t
ok.
>> + typeof(list) elem; \
>
> Name this @tail, please.
ok.
>> + for (elem = list; elem != NULL; elem = elem->next) { \
>> + len++; \
>> + } \
>> + len; \
>> + })
>> +
>> #endif
>
> This is a macro instead of a function so users don't have to cast their
> FooList * to GenericList *.
>
> The only user outside tests is strv_from_strList(). I'd be tempted to
> open-code it there and call it a day. Or do you have more users in
> mind?
That's the only use. If I make it private, I would still define it as
a static subroutine in util/strList.c, because it simplifies strv_from_strList.
IMO providing a public list length function or macro is pretty basic, but
I am not wedded to it. Your call.
- Steve
> If we keep the macro, please align the backslashes like this:
>
> #define QAPI_LIST_LENGTH(list) \
> ({ \
> int len = 0; \
> typeof(list) elem; \
> for (elem = list; elem != NULL; elem = elem->next) { \
> len++; \
> } \
> len; \
> })
>