Source code for ifgen.struct.methods.common
"""
Utilities shared between struct methods.
"""
# built-in
from contextlib import ExitStack
# third-party
from vcorelib.io import IndentedFileWriter
# internal
from ifgen.generation.interface import GenerateTask
[docs]
def swap_fields(
task: GenerateTask, writer: IndentedFileWriter, elem_prefix: str = ""
) -> None:
"""Generate code for swapping struct fields."""
for field in task.instance["fields"]:
kind = field["type"]
if field["padding"] or task.env.size(kind) == 1 or field["const"]:
continue
name = field["name"]
with ExitStack() as stack:
is_array = "array_length" in field
if is_array:
array_cmp = task.cpp_namespace(
f"{name}_length"
if task.instance["packed"]
or bool(task.instance.get("instances"))
else f"{name}.size()"
)
writer.write(f"for (std::size_t i = 0; i < {array_cmp}; i++)")
stack.enter_context(writer.scope())
elem = elem_prefix + name
if is_array:
elem += "[i]"
if task.env.is_struct(kind):
writer.write(f"{elem}.endian<endianness>();")
elif task.env.is_enum(kind):
writer.write(f"{elem} = handle_endian<endianness>({elem});")
else:
writer.write(f"{elem} = handle_endian<endianness>({elem});")