Source code for ifgen.enum.common

"""
A module for common enum-generation utilities.
"""

# third-party
from vcorelib.io import IndentedFileWriter

# internal
from ifgen.enum.map import enum_from_string_map, enum_to_string_map
from ifgen.generation.interface import GenerateTask


[docs] def enum_to_string( task: GenerateTask, writer: IndentedFileWriter, use_map: bool ) -> None: """ Implement an enumeration to string method without using the static map. """ writer.write(f'const char *result = "UNKNOWN {task.name}";') with writer.padding(): if not use_map: writer.write("switch (instance)") with writer.scope(indent=0): for enum in task.instance.get("enum", {}): writer.write(f"case {task.name}::{enum}:") with writer.indented(): writer.write(f'result = "{enum}";') writer.write("break;") else: map_inst = f"{task.name}_to_string" writer.write(f"if ({map_inst}.contains(instance))") with writer.scope(): writer.write(f"result = {map_inst}.at(instance);") writer.write("return result;")
[docs] def enum_to_string_function( task: GenerateTask, writer: IndentedFileWriter, use_map: bool, definition: bool = False, ) -> None: """Generate a method for converting enum instances to strings.""" if definition: with writer.javadoc(): writer.write(f"Converts {task.name} to a C string.") writer.empty() writer.write( task.command("param[in]", data="instance Value to convert.") ) writer.write( task.command( "return", " A C string representation of the value.", ) ) if not definition and use_map: enum_to_string_map(task, writer) writer.empty() line = "" if not use_map: line = "inline " line += f"const char *to_string({task.name} instance)" if definition and use_map: line += ";" writer.write(line) if definition and use_map: return with writer.scope(): enum_to_string(task, writer, use_map)
[docs] def enum_from_string( task: GenerateTask, writer: IndentedFileWriter, use_map: bool ) -> None: """ Implement an string to enumeration method without using the static map. """ if not use_map: writer.write("bool result = false;") with writer.padding(): first = True for enum in task.instance.get("enum", {}): line = f'if ((result = !strncmp(data, "{enum}", {len(enum)})))' if not first: line = "else " + line else: first = False writer.write(line) with writer.scope(): writer.write(f"output = {task.name}::{enum};") else: map_inst = f"{task.name}_from_string" writer.write(f"bool result = {map_inst}.contains(data);") with writer.padding(): writer.write("if (result)") with writer.scope(): writer.write(f"output = {map_inst}.at(data);") writer.write("return result;")
[docs] def string_to_enum_function( task: GenerateTask, writer: IndentedFileWriter, use_map: bool, definition: bool = False, ) -> None: """Generate a method for converting string instances to enums.""" if definition: with writer.javadoc(): writer.write(f"Converts a C string to {task.name}.") writer.empty() writer.write( task.command("param[in]", " data A C string to convert.") ) writer.write( task.command( "param[out]", "output The enumeration element to write.", ) ) writer.write( task.command( "return", " Whether or not the output was written.", ) ) if not definition and use_map: enum_from_string_map(task, writer) writer.empty() line = "" if not use_map: line = "inline " line += f"bool from_string(const char *data, {task.name} &output)" if definition and use_map: line += ";" writer.write(line) if definition and use_map: return with writer.scope(): enum_from_string(task, writer, use_map)