Philippe Mathieu-Daudé <phi...@linaro.org> writes: > Can we meet half-way only generating the MAX definitions for > unconditional enums, keeping the conditional ones as is? > > -- >8 -- > diff --git a/scripts/qapi/types.py b/scripts/qapi/types.py > @@ -88,16 +88,18 @@ def gen_enum(name: str, > members: List[QAPISchemaEnumMember], > prefix: Optional[str] = None) -> str: > assert members > - # append automatically generated _MAX value > - enum_members = members + [QAPISchemaEnumMember('_MAX', None)] > - > ret = mcgen(''' > > typedef enum %(c_name)s { > ''', > c_name=c_name(name)) > > - for memb in enum_members: > + has_cond = any(memb.ifcond.is_present() for memb in members) > + if has_cond: > + # append automatically generated _MAX value > + members += [QAPISchemaEnumMember('_MAX', None)] > + > + for memb in members: > ret += memb.ifcond.gen_if() > ret += mcgen(''' > %(c_enum)s, > @@ -105,6 +107,13 @@ def gen_enum(name: str, > c_enum=c_enum_const(name, memb.name, prefix)) > ret += memb.ifcond.gen_endif() > > + if not has_cond: > + ret += mcgen(''' > +#define %(c_name)s %(c_length)s > +''', > + c_name=c_enum_const(name, '_MAX', prefix), > + c_length=len(members)) > + > ret += mcgen(''' > } %(c_name)s; > ''', > ---
I doubt the benefit "we need a silly case FOO__MAX only sometimes" is worth the special case. We could generate something like #if [last_member's condition] #define FOO__MAX (FOO_last_member + 1) #elif [second_to_last_member's condition] #define FOO__MAX (FOO_second_to_last_member + 1) ... #else #define FOO__MAX (FOO_last_unconditional_member + 1) #endif but whether that is worth the additional complexity seems doubtful, too.