This commit is contained in:
J. Nick Koston 2025-07-21 13:18:10 -10:00
parent 7b9acd39e1
commit 767ec53cfa
No known key found for this signature in database

View File

@ -929,32 +929,26 @@ class FixedArrayRepeatedType(TypeInfo):
@property @property
def encode_content(self) -> str: def encode_content(self) -> str:
# Special case for single-element arrays - no loop needed # Helper to generate encode statement for a single element
def encode_element(element: str) -> str:
if isinstance(self._ti, EnumType):
return f"buffer.{self._ti.encode_func}({self.number}, static_cast<uint32_t>({element}), true);"
else:
return f"buffer.{self._ti.encode_func}({self.number}, {element}, true);"
# Unroll small arrays for efficiency
if self.array_size == 1: if self.array_size == 1:
if isinstance(self._ti, EnumType): return encode_element(f"this->{self.field_name}[0]")
return f"buffer.{self._ti.encode_func}({self.number}, static_cast<uint32_t>(this->{self.field_name}[0]), true);" elif self.array_size == 2:
else: return (
return f"buffer.{self._ti.encode_func}({self.number}, this->{self.field_name}[0], true);" encode_element(f"this->{self.field_name}[0]")
+ "\n "
+ encode_element(f"this->{self.field_name}[1]")
)
# Special case for 2-element arrays - unroll the loop # Use loops for larger arrays
if self.array_size == 2:
if isinstance(self._ti, EnumType):
return (
f"buffer.{self._ti.encode_func}({self.number}, static_cast<uint32_t>(this->{self.field_name}[0]), true);\n"
f" buffer.{self._ti.encode_func}({self.number}, static_cast<uint32_t>(this->{self.field_name}[1]), true);"
)
else:
return (
f"buffer.{self._ti.encode_func}({self.number}, this->{self.field_name}[0], true);\n"
f" buffer.{self._ti.encode_func}({self.number}, this->{self.field_name}[1], true);"
)
# 3 or more elements need a loop
o = f"for (const auto &it : this->{self.field_name}) {{\n" o = f"for (const auto &it : this->{self.field_name}) {{\n"
if isinstance(self._ti, EnumType): o += f" {encode_element('it')}\n"
o += f" buffer.{self._ti.encode_func}({self.number}, static_cast<uint32_t>(it), true);\n"
else:
o += f" buffer.{self._ti.encode_func}({self.number}, it, true);\n"
o += "}" o += "}"
return o return o