Remove array codegen code
This commit is contained in:
@@ -2,29 +2,22 @@ import json
|
|||||||
from typing import Dict
|
from typing import Dict
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from codegen.datatypes import CDataType, CStruct
|
from codegen.datatypes import CDataType, CStruct
|
||||||
from codegen.constants import WAPP_REPO_ROOT, DBL_LIST_DATA, ARRAY_DATA
|
from codegen.constants import WAPP_REPO_ROOT, DBL_LIST_DATA
|
||||||
from codegen.dbl_list.make_dbl_list import DblListData, make_dbl_list
|
from codegen.dbl_list.make_dbl_list import DblListData, make_dbl_list
|
||||||
from codegen.array.make_array import ArrayData, make_array
|
|
||||||
|
|
||||||
|
|
||||||
def main(types_file: Path | None):
|
def main(types_file: Path | None):
|
||||||
dbl_list_datatypes: Dict[CDataType, DblListData] = {}
|
dbl_list_datatypes: Dict[CDataType, DblListData] = {}
|
||||||
array_datatypes: Dict[CDataType, ArrayData] = {}
|
|
||||||
|
|
||||||
if types_file is not None and types_file.is_file() and "json" in types_file.suffix.lower():
|
if types_file is not None and types_file.is_file() and "json" in types_file.suffix.lower():
|
||||||
with types_file.open("r") as infile:
|
with types_file.open("r") as infile:
|
||||||
datatypes = json.load(infile)
|
datatypes = json.load(infile)
|
||||||
dbl_list_data = datatypes.get(DBL_LIST_DATA)
|
dbl_list_data = datatypes.get(DBL_LIST_DATA)
|
||||||
array_data = datatypes.get(ARRAY_DATA)
|
|
||||||
|
|
||||||
if dbl_list_data is not None and isinstance(dbl_list_data, dict):
|
if dbl_list_data is not None and isinstance(dbl_list_data, dict):
|
||||||
dbl_list_datatypes = {k: DblListData.from_dict(v) for k, v in dbl_list_data.items()}
|
dbl_list_datatypes = {k: DblListData.from_dict(v) for k, v in dbl_list_data.items()}
|
||||||
|
|
||||||
if array_data is not None and isinstance(array_data, dict):
|
|
||||||
array_datatypes = {k: ArrayData.from_dict(v) for k, v in array_data.items()}
|
|
||||||
|
|
||||||
make_dbl_list(dbl_list_datatypes)
|
make_dbl_list(dbl_list_datatypes)
|
||||||
make_array(array_datatypes)
|
|
||||||
|
|
||||||
# Save example types file
|
# Save example types file
|
||||||
custom_struct = CStruct(name="custom_type", cargs=[], typedef_name="CustomType")
|
custom_struct = CStruct(name="custom_type", cargs=[], typedef_name="CustomType")
|
||||||
@@ -36,12 +29,6 @@ def main(types_file: Path | None):
|
|||||||
hdr_decl_types=[custom_struct],
|
hdr_decl_types=[custom_struct],
|
||||||
).to_dict()
|
).to_dict()
|
||||||
},
|
},
|
||||||
ARRAY_DATA: {
|
|
||||||
"CustomType": ArrayData(
|
|
||||||
array_typename="CustomTypeArray",
|
|
||||||
hdr_decl_types=[custom_struct],
|
|
||||||
).to_dict()
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
example_file = WAPP_REPO_ROOT / "codegen_custom_data_example.json"
|
example_file = WAPP_REPO_ROOT / "codegen_custom_data_example.json"
|
||||||
|
|||||||
@@ -1,448 +0,0 @@
|
|||||||
from pathlib import Path
|
|
||||||
from dataclasses import dataclass, field
|
|
||||||
from typing import List, Dict, Any, Type
|
|
||||||
from codegen.constants import WAPP_SRC_ROOT
|
|
||||||
from codegen.utils import load_func_body_from_file, convert_to_relative
|
|
||||||
from codegen.datatypes import (
|
|
||||||
CDataType,
|
|
||||||
CMacro,
|
|
||||||
CStruct,
|
|
||||||
CFunc,
|
|
||||||
CHeader,
|
|
||||||
CSource,
|
|
||||||
CArg,
|
|
||||||
CType,
|
|
||||||
CPointer,
|
|
||||||
CPointerType,
|
|
||||||
CQualifier,
|
|
||||||
CInclude,
|
|
||||||
SerialisableDataclass,
|
|
||||||
get_datatype_string,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class ArrayData(SerialisableDataclass):
|
|
||||||
array_typename: str
|
|
||||||
hdr_decl_types: List[CStruct] = field(default_factory=list)
|
|
||||||
src_decl_types: List[CStruct] = field(default_factory=list)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def from_dict(cls: Type["ArrayData"], d: Dict[str, Any]) -> "ArrayData":
|
|
||||||
data = ArrayData(**d)
|
|
||||||
data.hdr_decl_types = [CStruct.from_dict(v) for v in data.hdr_decl_types if isinstance(v, dict)]
|
|
||||||
data.src_decl_types = [CStruct.from_dict(v) for v in data.src_decl_types if isinstance(v, dict)]
|
|
||||||
return data
|
|
||||||
|
|
||||||
|
|
||||||
def make_array(user_datatypes: Dict[CDataType, ArrayData] = {}):
|
|
||||||
def __format_func_body(
|
|
||||||
filename: Path,
|
|
||||||
type_string: str,
|
|
||||||
type_string_upper: str,
|
|
||||||
type_string_lower: str,
|
|
||||||
array_typename: str
|
|
||||||
):
|
|
||||||
return load_func_body_from_file(filename).format(
|
|
||||||
T=type_string,
|
|
||||||
ArrayType=array_typename,
|
|
||||||
Tupper=type_string_upper,
|
|
||||||
Tlower=type_string_lower,
|
|
||||||
)
|
|
||||||
|
|
||||||
out_dir = WAPP_SRC_ROOT / "primitives" / "array"
|
|
||||||
out_dir.mkdir(parents=True, exist_ok=True)
|
|
||||||
|
|
||||||
common_includes: List[CInclude] = [
|
|
||||||
CInclude(
|
|
||||||
header=str(convert_to_relative(WAPP_SRC_ROOT / "primitives" / "mem_allocator" / "mem_allocator.h", out_dir)).replace("\\", "/"),
|
|
||||||
local=True,
|
|
||||||
),
|
|
||||||
CInclude(
|
|
||||||
header=str(convert_to_relative(WAPP_SRC_ROOT / "common" / "misc" / "misc_utils.h", out_dir)).replace("\\", "/"),
|
|
||||||
local=True,
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
||||||
common_decl_types: List[CStruct] = []
|
|
||||||
|
|
||||||
datatypes: dict[CDataType, ArrayData] = {
|
|
||||||
CType.VOID: ArrayData(array_typename="GenericArray"),
|
|
||||||
"void *": ArrayData(array_typename="VoidPArray"),
|
|
||||||
"Str8": ArrayData(
|
|
||||||
array_typename="Str8Array",
|
|
||||||
hdr_decl_types=[
|
|
||||||
CStruct(name="str8", cargs=[], typedef_name="Str8"),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
}
|
|
||||||
|
|
||||||
for _type in CType:
|
|
||||||
if _type == CType.VOID:
|
|
||||||
continue
|
|
||||||
|
|
||||||
type_title = _type.value.title()
|
|
||||||
datatypes[_type] = ArrayData(
|
|
||||||
array_typename=f"{type_title}Array",
|
|
||||||
)
|
|
||||||
|
|
||||||
datatypes.update(user_datatypes)
|
|
||||||
|
|
||||||
snippets_dir = Path(__file__).parent / "snippets"
|
|
||||||
|
|
||||||
header = CHeader(
|
|
||||||
name="array",
|
|
||||||
decl_types=[*common_decl_types],
|
|
||||||
includes=[],
|
|
||||||
types=[],
|
|
||||||
funcs=[]
|
|
||||||
)
|
|
||||||
|
|
||||||
source = CSource(
|
|
||||||
name=header.name,
|
|
||||||
decl_types=[*common_decl_types],
|
|
||||||
includes=[
|
|
||||||
CInclude(header, local=True, same_dir=True),
|
|
||||||
CInclude(
|
|
||||||
header=str(convert_to_relative(WAPP_SRC_ROOT / "common" / "assert" / "assert.h", out_dir)).replace("\\", "/"),
|
|
||||||
local=True
|
|
||||||
),
|
|
||||||
CInclude(header="stddef.h"),
|
|
||||||
],
|
|
||||||
internal_funcs=[],
|
|
||||||
funcs=header.funcs
|
|
||||||
)
|
|
||||||
|
|
||||||
if len(common_includes) > 0:
|
|
||||||
header.includes.extend(common_includes)
|
|
||||||
source.includes.extend(common_includes)
|
|
||||||
|
|
||||||
|
|
||||||
generic_funcs = []
|
|
||||||
|
|
||||||
for _type, array_data in datatypes.items():
|
|
||||||
type_string = get_datatype_string(_type)
|
|
||||||
clean_type_string = type_string.replace(" ", "").replace("*", "_ptr")
|
|
||||||
type_string_upper = clean_type_string.upper()
|
|
||||||
type_string_lower = clean_type_string.lower()
|
|
||||||
|
|
||||||
array = CStruct(
|
|
||||||
name=array_data.array_typename,
|
|
||||||
cargs=[
|
|
||||||
CArg(name="items", _type=type_string, pointer=CPointer(_type=CPointerType.SINGLE)),
|
|
||||||
CArg(name="count", _type=CType.U64),
|
|
||||||
CArg(name="capacity", _type=CType.U64),
|
|
||||||
CArg(name="item_size", _type=CType.U64),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
if isinstance(_type, CType) and _type == CType.VOID:
|
|
||||||
alloc_capacity_func = CFunc(
|
|
||||||
name=f"_array_alloc_capacity",
|
|
||||||
ret_type=array,
|
|
||||||
args=[
|
|
||||||
CArg(name="allocator", _type="Allocator", pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
|
||||||
CArg(name="capacity", _type=CType.U64),
|
|
||||||
CArg(name="item_size", _type=CType.U64),
|
|
||||||
],
|
|
||||||
body=__format_func_body(
|
|
||||||
filename=snippets_dir / "alloc_capacity",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
pointer=CPointer(CPointerType.SINGLE),
|
|
||||||
)
|
|
||||||
generic_funcs.append(alloc_capacity_func)
|
|
||||||
else:
|
|
||||||
stack_array_cmacro = CMacro(
|
|
||||||
name=f"wapp_{type_string_lower}_array(...)",
|
|
||||||
value=__format_func_body(
|
|
||||||
filename=snippets_dir / "stack_array",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
stack_array_cppmacro = CMacro(
|
|
||||||
name=f"wapp_{type_string_lower}_array(...)",
|
|
||||||
value=__format_func_body(
|
|
||||||
filename=snippets_dir / "stack_array_cpp",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
stack_capacity_array_cmacro = CMacro(
|
|
||||||
name=f"wapp_{type_string_lower}_array_with_capacity(CAPACITY)",
|
|
||||||
value=__format_func_body(
|
|
||||||
filename=snippets_dir / "stack_capacity_array",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
stack_capacity_array_cppmacro = CMacro(
|
|
||||||
name=f"wapp_{type_string_lower}_array_with_capacity(CAPACITY)",
|
|
||||||
value=__format_func_body(
|
|
||||||
filename=snippets_dir / "stack_capacity_array_cpp",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
alloc_capacity_array_macro = CMacro(
|
|
||||||
name=f"wapp_{type_string_lower}_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY)",
|
|
||||||
value=__format_func_body(
|
|
||||||
filename=snippets_dir / "alloc_capacity_macro",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
array_pop_cmacro = CMacro(
|
|
||||||
name=f"wapp_{type_string_lower}_array_pop(ARRAY_PTR)",
|
|
||||||
value=__format_func_body(
|
|
||||||
filename=snippets_dir / "array_pop_macro",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
if "*" in type_string:
|
|
||||||
array_pop_cppmacro = CMacro(
|
|
||||||
name=f"wapp_{type_string_lower}_array_pop(ARRAY_PTR)",
|
|
||||||
value=__format_func_body(
|
|
||||||
filename=snippets_dir / "ptr_array_pop_macro_cpp",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
array_pop_cppmacro = CMacro(
|
|
||||||
name=f"wapp_{type_string_lower}_array_pop(ARRAY_PTR)",
|
|
||||||
value=__format_func_body(
|
|
||||||
filename=snippets_dir / "array_pop_macro_cpp",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
get_func = CFunc(
|
|
||||||
name=f"wapp_{type_string_lower}_array_get",
|
|
||||||
ret_type=type_string,
|
|
||||||
args=[
|
|
||||||
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
|
||||||
CArg(name="index", _type=CType.U64),
|
|
||||||
],
|
|
||||||
body=__format_func_body(
|
|
||||||
filename=snippets_dir / "array_get",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
pointer=CPointer(CPointerType.SINGLE),
|
|
||||||
)
|
|
||||||
|
|
||||||
set_func = CFunc(
|
|
||||||
name=f"wapp_{type_string_lower}_array_set",
|
|
||||||
ret_type=CType.VOID,
|
|
||||||
args=[
|
|
||||||
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
|
||||||
CArg(name="index", _type=CType.U64),
|
|
||||||
CArg(name="item", _type=type_string, pointer=CPointer(CPointerType.SINGLE)),
|
|
||||||
],
|
|
||||||
body=__format_func_body(
|
|
||||||
filename=snippets_dir / "array_set",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
append_capped_func = CFunc(
|
|
||||||
name=f"wapp_{type_string_lower}_array_append_capped",
|
|
||||||
ret_type=CType.VOID,
|
|
||||||
args=[
|
|
||||||
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
|
||||||
CArg(name="item", _type=type_string, pointer=CPointer(CPointerType.SINGLE)),
|
|
||||||
],
|
|
||||||
body=__format_func_body(
|
|
||||||
filename=snippets_dir / "append_capped",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
extend_capped_func = CFunc(
|
|
||||||
name=f"wapp_{type_string_lower}_array_extend_capped",
|
|
||||||
ret_type=CType.VOID,
|
|
||||||
args=[
|
|
||||||
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
|
||||||
CArg(name="other", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
|
||||||
],
|
|
||||||
body=__format_func_body(
|
|
||||||
filename=snippets_dir / "extend_capped",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
clear_func = CFunc(
|
|
||||||
name=f"wapp_{type_string_lower}_array_clear",
|
|
||||||
ret_type=CType.VOID,
|
|
||||||
args=[
|
|
||||||
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
|
||||||
],
|
|
||||||
body=__format_func_body(
|
|
||||||
filename=snippets_dir / "clear",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
copy_capped_func = CFunc(
|
|
||||||
name=f"wapp_{type_string_lower}_array_copy_capped",
|
|
||||||
ret_type=CType.VOID,
|
|
||||||
args=[
|
|
||||||
CArg(name="src", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
|
||||||
CArg(name="dst", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
|
||||||
],
|
|
||||||
body=__format_func_body(
|
|
||||||
filename=snippets_dir / "copy_capped",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
append_alloc_func = CFunc(
|
|
||||||
name=f"wapp_{type_string_lower}_array_append_alloc",
|
|
||||||
ret_type=array,
|
|
||||||
args=[
|
|
||||||
CArg(name="allocator", _type="Allocator", pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
|
||||||
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
|
||||||
CArg(name="item", _type=type_string, pointer=CPointer(CPointerType.SINGLE)),
|
|
||||||
],
|
|
||||||
body=__format_func_body(
|
|
||||||
filename=snippets_dir / "append_alloc",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
pointer=CPointer(CPointerType.SINGLE),
|
|
||||||
)
|
|
||||||
|
|
||||||
extend_alloc_func = CFunc(
|
|
||||||
name=f"wapp_{type_string_lower}_array_extend_alloc",
|
|
||||||
ret_type=array,
|
|
||||||
args=[
|
|
||||||
CArg(name="allocator", _type="Allocator", pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
|
||||||
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
|
||||||
CArg(name="other", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
|
||||||
],
|
|
||||||
body=__format_func_body(
|
|
||||||
filename=snippets_dir / "extend_alloc",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
pointer=CPointer(CPointerType.SINGLE),
|
|
||||||
)
|
|
||||||
|
|
||||||
copy_alloc_func = CFunc(
|
|
||||||
name=f"wapp_{type_string_lower}_array_copy_alloc",
|
|
||||||
ret_type=array,
|
|
||||||
args=[
|
|
||||||
CArg(name="allocator", _type="Allocator", pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
|
||||||
CArg(name="src", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
|
||||||
CArg(name="dst", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
|
||||||
],
|
|
||||||
body=__format_func_body(
|
|
||||||
filename=snippets_dir / "copy_alloc",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
pointer=CPointer(CPointerType.SINGLE),
|
|
||||||
)
|
|
||||||
|
|
||||||
pop_func = CFunc(
|
|
||||||
name=f"_{type_string_lower}_array_pop",
|
|
||||||
ret_type=type_string,
|
|
||||||
args=[
|
|
||||||
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
|
||||||
],
|
|
||||||
body=__format_func_body(
|
|
||||||
filename=snippets_dir / "array_pop",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
pointer=CPointer(CPointerType.SINGLE),
|
|
||||||
)
|
|
||||||
|
|
||||||
header.macros.extend([
|
|
||||||
alloc_capacity_array_macro,
|
|
||||||
])
|
|
||||||
header.c_macros.extend([
|
|
||||||
stack_array_cmacro,
|
|
||||||
stack_capacity_array_cmacro,
|
|
||||||
array_pop_cmacro,
|
|
||||||
])
|
|
||||||
header.cpp_macros.extend([
|
|
||||||
stack_array_cppmacro,
|
|
||||||
stack_capacity_array_cppmacro,
|
|
||||||
array_pop_cppmacro,
|
|
||||||
])
|
|
||||||
header.funcs.extend([
|
|
||||||
get_func,
|
|
||||||
set_func,
|
|
||||||
append_capped_func,
|
|
||||||
extend_capped_func,
|
|
||||||
clear_func,
|
|
||||||
copy_capped_func,
|
|
||||||
append_alloc_func,
|
|
||||||
extend_alloc_func,
|
|
||||||
copy_alloc_func,
|
|
||||||
pop_func,
|
|
||||||
])
|
|
||||||
|
|
||||||
header.decl_types.extend(array_data.hdr_decl_types)
|
|
||||||
header.types.extend([array])
|
|
||||||
|
|
||||||
source.decl_types.extend(array_data.src_decl_types)
|
|
||||||
source.funcs = header.funcs
|
|
||||||
|
|
||||||
|
|
||||||
header.funcs.extend(generic_funcs)
|
|
||||||
header.save(out_dir)
|
|
||||||
source.save(out_dir)
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
wapp_debug_assert(allocator != NULL, "`allocator` should not be NULL");
|
|
||||||
|
|
||||||
u64 allocation_size = sizeof({ArrayType}) + item_size * capacity;
|
|
||||||
{ArrayType} *array = wapp_mem_allocator_alloc(allocator, allocation_size);
|
|
||||||
if (!array) {{
|
|
||||||
goto RETURN_GENERIC_ARRAY_ALLOC;
|
|
||||||
}}
|
|
||||||
|
|
||||||
array->items = ({T} *)((u8 *)array + sizeof({ArrayType}));
|
|
||||||
array->count = 0;
|
|
||||||
array->capacity = capacity;
|
|
||||||
array->item_size = item_size;
|
|
||||||
|
|
||||||
RETURN_GENERIC_ARRAY_ALLOC:
|
|
||||||
return array;
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
(({ArrayType} *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof({T})))
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
wapp_debug_assert(allocator != NULL && array != NULL, "`allocator` and `array` should not be NULL");
|
|
||||||
|
|
||||||
{ArrayType} *output = array;
|
|
||||||
|
|
||||||
if (array->count >= array->capacity) {{
|
|
||||||
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(array->capacity * 2);
|
|
||||||
output = ({ArrayType} *)_array_alloc_capacity(allocator, new_capacity, array->item_size);
|
|
||||||
if (!output) {{
|
|
||||||
output = array;
|
|
||||||
goto RETURN_{Tupper}_ARRAY_APPEND_ALLOC;
|
|
||||||
}}
|
|
||||||
wapp_{Tlower}_array_copy_capped(array, output);
|
|
||||||
}}
|
|
||||||
|
|
||||||
wapp_{Tlower}_array_append_capped(output, item);
|
|
||||||
|
|
||||||
RETURN_{Tupper}_ARRAY_APPEND_ALLOC:
|
|
||||||
return output;
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
wapp_debug_assert(array != NULL, "`array` should not be NULL");
|
|
||||||
wapp_runtime_assert(array->count < array->capacity, "`array` is full");
|
|
||||||
|
|
||||||
u64 index = (array->count)++;
|
|
||||||
wapp_{Tlower}_array_set(array, index, item);
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
wapp_debug_assert(array != NULL, "`array` should not be NULL");
|
|
||||||
wapp_runtime_assert(index < array->count, "`index` is out of bounds");
|
|
||||||
|
|
||||||
u8 *ptr = (u8 *)(array->items) + (array->item_size * index);
|
|
||||||
return ({T} *)ptr;
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
u64 index = array->count - 1;
|
|
||||||
{T} *out = wapp_{Tlower}_array_get(array, index);
|
|
||||||
--(array->count);
|
|
||||||
return out;
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
(ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
|
||||||
*_{Tlower}_array_pop(ARRAY_PTR) : \
|
|
||||||
({T}){{0}} \
|
|
||||||
)
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
(ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
|
||||||
*_{Tlower}_array_pop(ARRAY_PTR) : \
|
|
||||||
{T}{{}} \
|
|
||||||
)
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
{T} *ptr = wapp_{Tlower}_array_get(array, index);
|
|
||||||
|
|
||||||
memcpy((void *)ptr, (void *)item, array->item_size);
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
wapp_debug_assert(array != NULL, "`array` should not be NULL");
|
|
||||||
array->count = 0;
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
wapp_debug_assert(allocator != NULL && src != NULL && dst != NULL, "`allocator`, `src` and `dst` should not be NULL");
|
|
||||||
|
|
||||||
{ArrayType} *output = dst;
|
|
||||||
|
|
||||||
if (src->count >= dst->capacity) {{
|
|
||||||
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(dst->capacity * 2);
|
|
||||||
output = ({ArrayType} *)_array_alloc_capacity(allocator, new_capacity, src->item_size);
|
|
||||||
if (!output) {{
|
|
||||||
output = dst;
|
|
||||||
goto RETURN_{Tupper}_ARRAY_COPY_ALLOC;
|
|
||||||
}}
|
|
||||||
}}
|
|
||||||
|
|
||||||
wapp_{Tlower}_array_clear(output);
|
|
||||||
wapp_{Tlower}_array_copy_capped(src, output);
|
|
||||||
|
|
||||||
RETURN_{Tupper}_ARRAY_COPY_ALLOC:
|
|
||||||
return output;
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
wapp_debug_assert(src != NULL && dst != NULL, "`src` and `dst` should not be NULL");
|
|
||||||
|
|
||||||
wapp_{Tlower}_array_clear(dst);
|
|
||||||
|
|
||||||
{T} *item;
|
|
||||||
|
|
||||||
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
|
||||||
// MSVC Spectre mitigation warnings
|
|
||||||
u64 to_copy = src->count < dst->capacity ? src->count : dst->capacity;
|
|
||||||
u64 item_index = 0;
|
|
||||||
b8 running = true;
|
|
||||||
while (running) {{
|
|
||||||
item = wapp_{Tlower}_array_get(src, item_index);
|
|
||||||
++item_index;
|
|
||||||
running = item_index < to_copy;
|
|
||||||
|
|
||||||
if (!item) {{
|
|
||||||
continue;
|
|
||||||
}}
|
|
||||||
|
|
||||||
wapp_{Tlower}_array_append_capped(dst, item);
|
|
||||||
}}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
wapp_debug_assert(allocator != NULL && array != NULL && other != NULL, "`allocator`, `array` and `other` should not be NULL");
|
|
||||||
|
|
||||||
{ArrayType} *output = array;
|
|
||||||
|
|
||||||
u64 remaining_capacity = array->capacity - array->count;
|
|
||||||
if (other->count >= remaining_capacity) {{
|
|
||||||
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(array->capacity * 2);
|
|
||||||
output = ({ArrayType} *)_array_alloc_capacity(allocator, new_capacity, array->item_size);
|
|
||||||
if (!output) {{
|
|
||||||
output = array;
|
|
||||||
goto RETURN_{Tupper}_ARRAY_EXTEND_ALLOC;
|
|
||||||
}}
|
|
||||||
wapp_{Tlower}_array_copy_capped(array, output);
|
|
||||||
}}
|
|
||||||
|
|
||||||
wapp_{Tlower}_array_extend_capped(output, other);
|
|
||||||
|
|
||||||
RETURN_{Tupper}_ARRAY_EXTEND_ALLOC:
|
|
||||||
return output;
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
wapp_debug_assert(array != NULL && other != NULL, "`array` and `other` should not be NULL");
|
|
||||||
|
|
||||||
u64 remaining_capacity = array->capacity - array->count;
|
|
||||||
wapp_runtime_assert(other->count < remaining_capacity, "`array` does not have enough capacity");
|
|
||||||
|
|
||||||
{T} *item;
|
|
||||||
|
|
||||||
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
|
||||||
// MSVC Spectre mitigation warnings
|
|
||||||
u64 items_to_add = other->count;
|
|
||||||
u64 item_index = 0;
|
|
||||||
b8 running = true;
|
|
||||||
while (running) {{
|
|
||||||
item = wapp_{Tlower}_array_get(other, item_index);
|
|
||||||
++item_index;
|
|
||||||
running = item_index < items_to_add;
|
|
||||||
|
|
||||||
if (!item) {{
|
|
||||||
continue;
|
|
||||||
}}
|
|
||||||
|
|
||||||
wapp_{Tlower}_array_append_capped(array, item);
|
|
||||||
}}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
(ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
|
||||||
*_{Tlower}_array_pop(ARRAY_PTR) : \
|
|
||||||
({T})(0) \
|
|
||||||
)
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
(({ArrayType}){{ \
|
|
||||||
.items = ({T}[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count({T}, __VA_ARGS__) * 2)]){{__VA_ARGS__}}, \
|
|
||||||
.count = wapp_misc_utils_va_args_count({T}, __VA_ARGS__), \
|
|
||||||
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count({T}, __VA_ARGS__) * 2), \
|
|
||||||
.item_size = sizeof({T}) \
|
|
||||||
}})
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
([&]() {{ \
|
|
||||||
wapp_persist {T} buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count({T}, __VA_ARGS__) * 2)] = {{__VA_ARGS__}}; \
|
|
||||||
return {ArrayType}{{ \
|
|
||||||
buf, \
|
|
||||||
wapp_misc_utils_va_args_count({T}, __VA_ARGS__), \
|
|
||||||
wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count({T}, __VA_ARGS__) * 2), \
|
|
||||||
sizeof({T}) \
|
|
||||||
}}; \
|
|
||||||
}}())
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
(({ArrayType}){{.items = ({T}[CAPACITY]){{0}}, .count = 0, .capacity = CAPACITY, .item_size = sizeof({T})}})
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
([&]() {{ \
|
|
||||||
wapp_persist {T} buf[CAPACITY] = {{}}; \
|
|
||||||
return {ArrayType}{{buf, 0, CAPACITY, sizeof({T})}}; \
|
|
||||||
}}())
|
|
||||||
@@ -7,4 +7,3 @@ WAPP_SRC_ROOT = WAPP_REPO_ROOT / "src"
|
|||||||
|
|
||||||
# Dictionary Keys
|
# Dictionary Keys
|
||||||
DBL_LIST_DATA = "dbl_list_data"
|
DBL_LIST_DATA = "dbl_list_data"
|
||||||
ARRAY_DATA = "array_data"
|
|
||||||
|
|||||||
@@ -12,18 +12,5 @@
|
|||||||
],
|
],
|
||||||
"src_decl_types": []
|
"src_decl_types": []
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"array_data": {
|
|
||||||
"CustomType": {
|
|
||||||
"array_typename": "CustomTypeArray",
|
|
||||||
"hdr_decl_types": [
|
|
||||||
{
|
|
||||||
"name": "custom_type",
|
|
||||||
"cargs": [],
|
|
||||||
"typedef_name": "CustomType"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"src_decl_types": []
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user