Source code for ifgen.struct.methods.bit
"""
A module implementing interfaces for generating bit-field methods.
"""
# built-in
from typing import Any
# third-party
from vcorelib.io.file_writer import IndentedFileWriter
# internal
from ifgen.generation.interface import GenerateTask
[docs]
def handle_description(
writer: IndentedFileWriter, field: dict[str, Any]
) -> None:
"""Handle writing an instance's description."""
if field.get("description"):
writer.empty()
writer.write(field["description"])
[docs]
def set_bit_method(
task: GenerateTask,
name: str,
field: dict[str, Any],
writer: IndentedFileWriter,
method_slug: str,
inner: str = "",
) -> None:
"""Generate a 'set' method for a bit-field."""
method = task.cpp_namespace(
f"set_{method_slug}({inner}){task.method_suffix()}"
)
writer.empty()
with writer.javadoc():
writer.write(f"Set {name}'s {field['name']} bit.")
handle_description(writer, field)
writer.write("inline void " + method)
with writer.scope():
idx = field["index"]
stmt = "1u" if idx == 0 else f"1u << {idx}u"
writer.write(f"{name} |= {stmt};")
[docs]
def clear_bit_method(
task: GenerateTask,
name: str,
field: dict[str, Any],
writer: IndentedFileWriter,
method_slug: str,
inner: str = "",
) -> None:
"""Generate a 'clear' method for a bit-field."""
method = task.cpp_namespace(
f"clear_{method_slug}({inner}){task.method_suffix()}"
)
writer.empty()
with writer.javadoc():
writer.write(f"Clear {name}'s {field['name']} bit.")
handle_description(writer, field)
writer.write("inline void " + method)
with writer.scope():
idx = field["index"]
stmt = "~(1u)" if idx == 0 else f"~(1u << {idx}u)"
writer.write(f"{name} &= {stmt};")
[docs]
def bit_field_toggle_method(
task: GenerateTask,
name: str,
field: dict[str, Any],
writer: IndentedFileWriter,
method_slug: str,
inner: str = "",
) -> None:
"""Generate a 'toggle' method for a bit-field."""
set_bit_method(task, name, field, writer, method_slug, inner=inner)
clear_bit_method(task, name, field, writer, method_slug, inner=inner)
method = task.cpp_namespace(
f"toggle_{method_slug}({inner}){task.method_suffix()}"
)
writer.empty()
with writer.javadoc():
writer.write(f"Toggle {name}'s {field['name']} bit.")
handle_description(writer, field)
writer.write("inline void " + method)
with writer.scope():
idx = field["index"]
stmt = "1u" if idx == 0 else f"1u << {idx}u"
writer.write(f"{name} ^= {stmt};")