from pathlib import Path from dataclasses import dataclass, field from codegen.constants import WAPP_SRC_ROOT from codegen.lib.codegen.utils import load_func_body_from_file from codegen.lib.codegen.datatypes import ( CDataType, CStruct, CFunc, CHeader, CSource, CArg, CType, CPointer, CPointerType, CQualifier, CInclude, get_datatype_string, ) @dataclass class DblListData: out_dir: Path common_includes: list[CInclude] = field(default_factory=list) hdr_includes: list[CInclude] = field(default_factory=list) src_includes: list[CInclude] = field(default_factory=list) common_decl_types: list[CStruct] = field(default_factory=list) hdr_decl_types: list[CStruct] = field(default_factory=list) src_decl_types: list[CStruct] = field(default_factory=list) def gen_dbl_list(): def __format_func_body(filename: Path, type_string: str): return load_func_body_from_file(filename).format( T=type_string, Tupper=type_string.upper(), Tlower=type_string.lower(), ) datatypes: dict[CDataType, DblListData] = { "Str8": DblListData( common_includes=[ CInclude(header="../../../common/aliases/aliases.h", local=True), ], src_includes=[ CInclude(header="./str8.h", local=True), ], hdr_decl_types=[ CStruct(name="str8", cargs=[], typedef_name="Str8"), ], out_dir=WAPP_SRC_ROOT / "core/strings/str8/", ), } snippets_dir = Path(__file__).parent / "snippets" for _type, dbl_list_data in datatypes.items(): type_string = get_datatype_string(_type) node = CStruct( name=f"{type_string}Node", cargs=[ CArg(name="string", _type=type_string, pointer=CPointer(_type=CPointerType.SINGLE)), CArg(name="prev", _type=f"{type_string}Node", pointer=CPointer(_type=CPointerType.SINGLE)), CArg(name="next", _type=f"{type_string}Node", pointer=CPointer(_type=CPointerType.SINGLE)), ], ) dl_list = CStruct( name=f"{type_string}List", cargs=[ CArg(name="first", _type=node, pointer=CPointer(_type=CPointerType.SINGLE)), CArg(name="last", _type=node, pointer=CPointer(_type=CPointerType.SINGLE)), CArg(name="total_size", _type=CType.U64), CArg(name="node_count", _type=CType.U64), ], ) get_func = CFunc( name=f"wapp_{type_string.lower()}_list_get", ret_type=node, args=[ CArg(name="list", _type=dl_list, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST), CArg(name="index", _type=CType.U64), ], body=__format_func_body(snippets_dir / "list_get", type_string), pointer=CPointer(CPointerType.SINGLE), ) push_front_func = CFunc( name=f"wapp_{type_string.lower()}_list_push_front", ret_type=CType.VOID, args=[ CArg(name="list", _type=dl_list, pointer=CPointer(CPointerType.SINGLE)), CArg(name="node", _type=node, pointer=CPointer(CPointerType.SINGLE)), ], body=__format_func_body(snippets_dir / "list_push_front", type_string), ) push_back_func = CFunc( name=f"wapp_{type_string.lower()}_list_push_back", ret_type=CType.VOID, args=[ CArg(name="list", _type=dl_list, pointer=CPointer(CPointerType.SINGLE)), CArg(name="node", _type=node, pointer=CPointer(CPointerType.SINGLE)), ], body=__format_func_body(snippets_dir / "list_push_back", type_string), ) insert_func = CFunc( name=f"wapp_{type_string.lower()}_list_insert", ret_type=CType.VOID, args=[ CArg(name="list", _type=dl_list, pointer=CPointer(CPointerType.SINGLE)), CArg(name="node", _type=node, pointer=CPointer(CPointerType.SINGLE)), CArg(name="index", _type=CType.U64), ], body=__format_func_body(snippets_dir / "list_insert", type_string), ) pop_front_func = CFunc( name=f"wapp_{type_string.lower()}_list_pop_front", ret_type=node, args=[ CArg(name="list", _type=dl_list, pointer=CPointer(CPointerType.SINGLE)), ], body=__format_func_body(snippets_dir / "list_pop_front", type_string), pointer=CPointer(CPointerType.SINGLE), ) pop_back_func = CFunc( name=f"wapp_{type_string.lower()}_list_pop_back", ret_type=node, args=[ CArg(name="list", _type=dl_list, pointer=CPointer(CPointerType.SINGLE)), ], body=__format_func_body(snippets_dir / "list_pop_back", type_string), pointer=CPointer(CPointerType.SINGLE), ) remove_func = CFunc( name=f"wapp_{type_string.lower()}_list_remove", ret_type=node, args=[ CArg(name="list", _type=dl_list, pointer=CPointer(CPointerType.SINGLE)), CArg(name="index", _type=CType.U64), ], body=__format_func_body(snippets_dir / "list_remove", type_string), pointer=CPointer(CPointerType.SINGLE), ) empty_func = CFunc( name=f"wapp_{type_string.lower()}_list_empty", ret_type=CType.VOID, args=[ CArg(name="list", _type=dl_list, pointer=CPointer(CPointerType.SINGLE)), ], body=__format_func_body(snippets_dir / "list_empty", type_string), ) node_to_list_func = CFunc( name=f"{type_string.lower()}_node_to_list", ret_type=dl_list, args=[ CArg(name="node", _type=node, pointer=CPointer(CPointerType.SINGLE)), ], body=__format_func_body(snippets_dir / "node_to_list", type_string), qualifiers=[CQualifier.INTERNAL], ) header = CHeader( name=f"{type_string.lower()}_list", decl_types=dbl_list_data.common_decl_types + dbl_list_data.hdr_decl_types, includes=[], types=[node, dl_list], funcs=[ get_func, push_front_func, push_back_func, insert_func, pop_front_func, pop_back_func, remove_func, empty_func, ] ) source = CSource( name=header.name, decl_types=dbl_list_data.common_decl_types + dbl_list_data.src_decl_types, includes=[CInclude(header, local=True, same_dir=True), CInclude(header="stddef.h")], internal_funcs=[node_to_list_func], funcs=header.funcs ) if len(dbl_list_data.common_includes) > 0: header.includes.extend(dbl_list_data.common_includes) source.includes.extend(dbl_list_data.common_includes) if len(dbl_list_data.hdr_includes) > 0: header.includes.extend(dbl_list_data.hdr_includes) if len(dbl_list_data.src_includes) > 0: source.includes.extend(dbl_list_data.src_includes) header.save(dbl_list_data.out_dir) source.save(dbl_list_data.out_dir)