diff --git a/pyrobuf/parse_proto.py b/pyrobuf/parse_proto.py index 83bef25..e3b4201 100644 --- a/pyrobuf/parse_proto.py +++ b/pyrobuf/parse_proto.py @@ -604,7 +604,7 @@ def add_cython_info(self, message): field.setter = self.setter_map[field.type] # Determine number of bitmap fields needed to record which fields have been set - message.num_field_bitmaps = len(message.fields) // 64 + (1 if len(message.fields) % 64 > 0 else 0) + message.field_bitmap_indices = set(f.bitmap_idx for f in message.fields.values()) for submessage in message.messages.values(): self.add_cython_info(submessage) diff --git a/pyrobuf/protobuf/templates/proto_pxd.tmpl b/pyrobuf/protobuf/templates/proto_pxd.tmpl index 4712856..79e062e 100644 --- a/pyrobuf/protobuf/templates/proto_pxd.tmpl +++ b/pyrobuf/protobuf/templates/proto_pxd.tmpl @@ -33,9 +33,11 @@ cdef class {{ message.full_name }}: cdef {{ field.c_type }} _{{ field.name }} {%- endif %} cpdef _{{ field.name }}__reset(self) + {%- endfor %} -{% for i in range(message.num_field_bitmaps) %} + +{% for i in message.field_bitmap_indices %} cdef uint64_t __field_bitmap{{ i }} {%- endfor %}