Compare commits
55 Commits
Author | SHA1 | Date | |
---|---|---|---|
74164717d0 | |||
6c8434a530 | |||
cac66b9dbb | |||
175f627f93 | |||
be30189d15 | |||
3689c17d09 | |||
8e952d9bc8 | |||
def7576101 | |||
3fed536a74 | |||
aae39fe656 | |||
4e3945d1d0 | |||
98a802e3eb | |||
0d4aa7a9c2 | |||
a229f9be8c | |||
2156d2ff3a | |||
12f083edb0 | |||
f444911452 | |||
163283f77f | |||
6064ed346c | |||
77f3c40ebd | |||
d3f1686d58 | |||
a359331df7 | |||
14115f7e7e | |||
12bd3eb489 | |||
266d43e262 | |||
a568b30163 | |||
b1773746d8 | |||
a479a43f4c | |||
b476ceaeef | |||
4d69b97149 | |||
181c4b8614 | |||
0d541f6ee8 | |||
9e34b37d8d | |||
b884d0e6a6 | |||
494bbeb398 | |||
7605eb4e57 | |||
037b0fe698 | |||
b13274cd81 | |||
4f9f632362 | |||
6b039aeac0 | |||
2ab3bfc2e1 | |||
bf99bef291 | |||
50e23d8a13 | |||
3a49dba366 | |||
1cfc52b35e | |||
25395553d7 | |||
9a651665ba | |||
8dbdfa2094 | |||
add2ba541d | |||
63ed2633ea | |||
|
3c32b247c0 | ||
|
aa04fab6ea | ||
|
2017f6de79 | ||
|
63acdd1336 | ||
|
cfa8094260 |
.clangdMakefileREADME.mdbuild.ps1
codegen
__main__.py
array
make_array.py
constants.pydatatypes.pysnippets
dbl_list
make_dbl_list.py
utils.pysnippets
src
common
containers
core
primitives
prng/xorshift
testing/tester
uuid
wapp.cwapp.htests
2
.clangd
Normal file
2
.clangd
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
CompileFlags:
|
||||||
|
Add: -ferror-limit=0
|
13
Makefile
13
Makefile
@ -1,6 +1,6 @@
|
|||||||
CC = clang
|
CC = clang
|
||||||
BUILD_TYPE = debug
|
BUILD_TYPE = debug
|
||||||
CFLAGS = -Wall -Wextra -Werror -pedantic
|
CFLAGS = -Wall -Wextra -Werror -pedantic -std=gnu11 -Isrc
|
||||||
LIBFLAGS = -fPIC -shared
|
LIBFLAGS = -fPIC -shared
|
||||||
KERNEL = $(shell uname -s)
|
KERNEL = $(shell uname -s)
|
||||||
MACHINE = $(shell uname -m)
|
MACHINE = $(shell uname -m)
|
||||||
@ -24,9 +24,9 @@ ifeq ($(CC),gcc)
|
|||||||
export ASAN_OPTIONS=verify_asan_link_order=0
|
export ASAN_OPTIONS=verify_asan_link_order=0
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: all clean builddir build-test run-test build-lib full prng testing uuid core containers
|
.PHONY: all clean builddir build-test run-test codegen build-lib full prng testing uuid core primitives
|
||||||
|
|
||||||
all: clean builddir run-test full
|
all: clean builddir codegen run-test full
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@rm -rf $(BUILD_DIR)
|
@rm -rf $(BUILD_DIR)
|
||||||
@ -41,6 +41,9 @@ run-test: build-test
|
|||||||
@$(TEST_OUT)
|
@$(TEST_OUT)
|
||||||
@rm $(TEST_OUT)
|
@rm $(TEST_OUT)
|
||||||
|
|
||||||
|
codegen:
|
||||||
|
python3 -m codegen
|
||||||
|
|
||||||
build-lib:
|
build-lib:
|
||||||
$(CC) $(CFLAGS) $(LIBFLAGS) $(LIB_SRC) -o $(LIB_OUT)
|
$(CC) $(CFLAGS) $(LIBFLAGS) $(LIB_SRC) -o $(LIB_OUT)
|
||||||
|
|
||||||
@ -59,5 +62,5 @@ uuid: build-lib
|
|||||||
core: LIB_SRC = src/core/wapp_core.c
|
core: LIB_SRC = src/core/wapp_core.c
|
||||||
core: build-lib
|
core: build-lib
|
||||||
|
|
||||||
containers: LIB_SRC = src/core/wapp_containers.c
|
primitives: LIB_SRC = src/core/wapp_primitives.c
|
||||||
containers: build-lib
|
primitives: build-lib
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
# Wizard Apprentice Standard Library
|
# Wizard Apprentice Standard Library
|
||||||
|
|
||||||
A collection of useful C/C++ utilities for my projects
|
A collection of useful C utilities for my projects
|
||||||
|
@ -4,7 +4,7 @@ Param(
|
|||||||
|
|
||||||
$Compiler = "cl.exe"
|
$Compiler = "cl.exe"
|
||||||
|
|
||||||
$GeneralFlags = "/Wall /WX /wd4996"
|
$GeneralFlags = "/Wall /WX /wd4996 /wd4464 /wd5105 /std:c11"
|
||||||
$LibraryFlags = "/LD"
|
$LibraryFlags = "/LD"
|
||||||
|
|
||||||
$Kernel = (Get-ChildItem Env:OS).Value
|
$Kernel = (Get-ChildItem Env:OS).Value
|
||||||
@ -46,7 +46,7 @@ mkdir -p $OutDir > $null
|
|||||||
mkdir -p $TestsDir > $null
|
mkdir -p $TestsDir > $null
|
||||||
|
|
||||||
# Run code generation
|
# Run code generation
|
||||||
Invoke-Expression "python3 -m codegen"
|
Invoke-Expression "python -m codegen"
|
||||||
|
|
||||||
# Build and run tests
|
# Build and run tests
|
||||||
Invoke-Expression "$Compiler $GeneralFlags $IncludeDirs $TestIncludeDirs $SrcFiles $TestSrcFiles $TestOutputs" -ErrorAction Stop
|
Invoke-Expression "$Compiler $GeneralFlags $IncludeDirs $TestIncludeDirs $SrcFiles $TestSrcFiles $TestOutputs" -ErrorAction Stop
|
||||||
|
23
codegen/__main__.py
Normal file
23
codegen/__main__.py
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
from typing import Dict
|
||||||
|
from codegen.datatypes import CDataType
|
||||||
|
from codegen.dbl_list.make_dbl_list import DblListData, make_dbl_list
|
||||||
|
from codegen.array.make_array import ArrayData, make_array
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
gen_dbl_list()
|
||||||
|
gen_array()
|
||||||
|
|
||||||
|
|
||||||
|
def gen_dbl_list():
|
||||||
|
datatypes: Dict[CDataType, DblListData] = {}
|
||||||
|
make_dbl_list(datatypes)
|
||||||
|
|
||||||
|
|
||||||
|
def gen_array():
|
||||||
|
datatypes: Dict[CDataType, ArrayData] = {}
|
||||||
|
make_array(datatypes)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
393
codegen/array/make_array.py
Normal file
393
codegen/array/make_array.py
Normal file
@ -0,0 +1,393 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
from typing import List, Dict
|
||||||
|
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,
|
||||||
|
get_datatype_string,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class ArrayData:
|
||||||
|
array_typename: str
|
||||||
|
hdr_decl_types: List[CStruct] = field(default_factory=list)
|
||||||
|
src_decl_types: List[CStruct] = field(default_factory=list)
|
||||||
|
|
||||||
|
|
||||||
|
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="stdbool.h"),
|
||||||
|
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] = {
|
||||||
|
"Str8": ArrayData(
|
||||||
|
array_typename="Str8Array",
|
||||||
|
hdr_decl_types=[
|
||||||
|
CStruct(name="str8", cargs=[], typedef_name="Str8"),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
for _type in CType:
|
||||||
|
if _type == CType.VOID:
|
||||||
|
datatypes["void *"] = ArrayData(
|
||||||
|
array_typename="VoidPArray",
|
||||||
|
)
|
||||||
|
continue
|
||||||
|
elif _type == CType.BOOL:
|
||||||
|
datatypes[_type.value] = ArrayData(
|
||||||
|
array_typename="BoolArray",
|
||||||
|
)
|
||||||
|
continue
|
||||||
|
|
||||||
|
type_title = _type.value.title()
|
||||||
|
datatypes[_type.value] = 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="stddef.h"),
|
||||||
|
CInclude(header="assert.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, str) and _type == "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)
|
||||||
|
|
||||||
|
stack_array_macro = 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_capacity_array_macro = 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,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
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_macro = 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,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
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.decl_types.extend(array_data.hdr_decl_types)
|
||||||
|
header.macros.extend([
|
||||||
|
stack_array_macro,
|
||||||
|
stack_capacity_array_macro,
|
||||||
|
alloc_capacity_array_macro,
|
||||||
|
array_pop_macro,
|
||||||
|
])
|
||||||
|
header.types.extend([array])
|
||||||
|
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,
|
||||||
|
])
|
||||||
|
|
||||||
|
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)
|
15
codegen/array/snippets/alloc_capacity
Normal file
15
codegen/array/snippets/alloc_capacity
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
assert(allocator != 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
codegen/array/snippets/alloc_capacity_macro
Normal file
1
codegen/array/snippets/alloc_capacity_macro
Normal file
@ -0,0 +1 @@
|
|||||||
|
(({ArrayType} *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof({T})))
|
18
codegen/array/snippets/append_alloc
Normal file
18
codegen/array/snippets/append_alloc
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
assert(allocator != NULL && array != 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;
|
4
codegen/array/snippets/append_capped
Normal file
4
codegen/array/snippets/append_capped
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
assert(array != NULL && array->count < array->capacity);
|
||||||
|
|
||||||
|
u64 index = (array->count)++;
|
||||||
|
wapp_{Tlower}_array_set(array, index, item);
|
4
codegen/array/snippets/array_get
Normal file
4
codegen/array/snippets/array_get
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
assert(array != NULL && index < array->count);
|
||||||
|
|
||||||
|
u8 *ptr = (u8 *)(array->items) + (array->item_size * index);
|
||||||
|
return ({T} *)ptr;
|
4
codegen/array/snippets/array_pop
Normal file
4
codegen/array/snippets/array_pop
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
u64 index = array->count - 1;
|
||||||
|
{T} *out = wapp_{Tlower}_array_get(array, index);
|
||||||
|
--(array->count);
|
||||||
|
return out;
|
4
codegen/array/snippets/array_pop_macro
Normal file
4
codegen/array/snippets/array_pop_macro
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
(ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_{Tlower}_array_pop(ARRAY_PTR) : \
|
||||||
|
({T}){{0}} \
|
||||||
|
)
|
3
codegen/array/snippets/array_set
Normal file
3
codegen/array/snippets/array_set
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{T} *ptr = wapp_{Tlower}_array_get(array, index);
|
||||||
|
|
||||||
|
memcpy((void *)ptr, (void *)item, array->item_size);
|
2
codegen/array/snippets/clear
Normal file
2
codegen/array/snippets/clear
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
assert(array != NULL);
|
||||||
|
array->count = 0;
|
18
codegen/array/snippets/copy_alloc
Normal file
18
codegen/array/snippets/copy_alloc
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
assert(allocator != NULL && src != NULL && dst != 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;
|
22
codegen/array/snippets/copy_capped
Normal file
22
codegen/array/snippets/copy_capped
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
assert(src != NULL && dst != 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;
|
||||||
|
bool 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);
|
||||||
|
}}
|
19
codegen/array/snippets/extend_alloc
Normal file
19
codegen/array/snippets/extend_alloc
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
assert(allocator != NULL && array != NULL && other != 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;
|
23
codegen/array/snippets/extend_capped
Normal file
23
codegen/array/snippets/extend_capped
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
assert(array != NULL && other != NULL);
|
||||||
|
|
||||||
|
u64 remaining_capacity = array->capacity - array->count;
|
||||||
|
assert(other->count < remaining_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;
|
||||||
|
bool 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);
|
||||||
|
}}
|
6
codegen/array/snippets/stack_array
Normal file
6
codegen/array/snippets/stack_array
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
(({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
codegen/array/snippets/stack_capacity_array
Normal file
1
codegen/array/snippets/stack_capacity_array
Normal file
@ -0,0 +1 @@
|
|||||||
|
(({ArrayType}){{.items = ({T}[CAPACITY]){{0}}, .count = 0, .capacity = CAPACITY, .item_size = sizeof({T})}})
|
5
codegen/constants.py
Normal file
5
codegen/constants.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
PACKAGE_DIR = Path(__file__).parent.resolve()
|
||||||
|
WAPP_SRC_ROOT = PACKAGE_DIR.parent / "src"
|
350
codegen/datatypes.py
Normal file
350
codegen/datatypes.py
Normal file
@ -0,0 +1,350 @@
|
|||||||
|
from enum import Enum
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Optional, Union, List
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
from codegen.constants import WAPP_SRC_ROOT
|
||||||
|
from codegen.utils import convert_to_relative
|
||||||
|
|
||||||
|
|
||||||
|
class CType(Enum):
|
||||||
|
VOID = "void"
|
||||||
|
BOOL = "bool"
|
||||||
|
CHAR = "char"
|
||||||
|
C8 = "c8"
|
||||||
|
C16 = "c16"
|
||||||
|
C32 = "c32"
|
||||||
|
I8 = "i8"
|
||||||
|
I16 = "i16"
|
||||||
|
I32 = "i32"
|
||||||
|
I64 = "i64"
|
||||||
|
U8 = "u8"
|
||||||
|
U16 = "u16"
|
||||||
|
U32 = "u32"
|
||||||
|
U64 = "u64"
|
||||||
|
F32 = "f32"
|
||||||
|
F64 = "f64"
|
||||||
|
F128 = "f128"
|
||||||
|
IPTR = "iptr"
|
||||||
|
UPTR = "uptr"
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
return self.value
|
||||||
|
|
||||||
|
|
||||||
|
class CQualifier(Enum):
|
||||||
|
NONE = ""
|
||||||
|
CONST = "const "
|
||||||
|
EXTERNAL = "external "
|
||||||
|
INTERNAL = "internal "
|
||||||
|
PERSISTENT = "persistent "
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
return self.value
|
||||||
|
|
||||||
|
|
||||||
|
class CPointerType(Enum):
|
||||||
|
NONE = ""
|
||||||
|
SINGLE = "*"
|
||||||
|
DOUBLE = "**"
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
return self.value
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class CPointer:
|
||||||
|
_type: CPointerType = CPointerType.NONE
|
||||||
|
qualifier: CQualifier = CQualifier.NONE
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
return str(self._type) + str(self.qualifier)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class CEnumVal:
|
||||||
|
name: str
|
||||||
|
value: Optional[int] = None
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
return self.name + "" if self.value is None else f" = {self.value}"
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class CEnum:
|
||||||
|
name: str
|
||||||
|
values: List[CEnumVal]
|
||||||
|
typedef: bool = False
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
if self.typedef:
|
||||||
|
header = "typedef enum {\n"
|
||||||
|
footer = f"}} {self.name};\n"
|
||||||
|
else:
|
||||||
|
header = f"enum {self.name} {{\n"
|
||||||
|
footer = "};\n"
|
||||||
|
|
||||||
|
values = ""
|
||||||
|
for value in self.values:
|
||||||
|
values += f" {str(value)},\n"
|
||||||
|
|
||||||
|
return header + values + footer
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class CMacro:
|
||||||
|
name: str
|
||||||
|
value: str
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
return f"#define {self.name} {self.value}\n"
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class CStruct:
|
||||||
|
name: str
|
||||||
|
cargs: List["CArg"]
|
||||||
|
typedef_name: Optional[str] = None
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
return self.declare() + self.define()
|
||||||
|
|
||||||
|
def declare(self) -> str:
|
||||||
|
declaration = f"typedef struct {self.name} {self.typedef_name if self.typedef_name is not None else self.name};\n"
|
||||||
|
return declaration
|
||||||
|
|
||||||
|
def define(self):
|
||||||
|
definition = f"struct {self.name} {{\n"
|
||||||
|
args = ""
|
||||||
|
for arg in self.cargs:
|
||||||
|
args += f" {str(arg)};\n"
|
||||||
|
footer = "};\n"
|
||||||
|
|
||||||
|
return definition + args + footer;
|
||||||
|
|
||||||
|
|
||||||
|
CUserType = Union[CStruct, CEnum]
|
||||||
|
CDataType = Union[CType, CUserType, str]
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class CArg:
|
||||||
|
name: str
|
||||||
|
_type: CDataType
|
||||||
|
array: bool = False
|
||||||
|
pointer: CPointer = field(default_factory=CPointer)
|
||||||
|
qualifier: CQualifier = CQualifier.NONE
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
qualifier = str(self.qualifier)
|
||||||
|
_type = get_datatype_string(self._type) + " "
|
||||||
|
pointer = str(self.pointer)
|
||||||
|
array = "[]" if self.array else ""
|
||||||
|
|
||||||
|
return qualifier + _type + pointer + self.name + array
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class CFunc:
|
||||||
|
name: str
|
||||||
|
ret_type: CDataType
|
||||||
|
args: List[CArg]
|
||||||
|
body: str
|
||||||
|
pointer: CPointer = field(default_factory=CPointer)
|
||||||
|
qualifiers: List[CQualifier] = field(default_factory=list)
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
qualifiers = ""
|
||||||
|
for qualifier in self.qualifiers:
|
||||||
|
if qualifier == CQualifier.NONE:
|
||||||
|
continue
|
||||||
|
if len(qualifiers) > 0:
|
||||||
|
qualifiers += " "
|
||||||
|
qualifiers += f"{str(qualifier)}"
|
||||||
|
|
||||||
|
args = ""
|
||||||
|
for i, arg in enumerate(self.args):
|
||||||
|
args += f"{str(arg)}"
|
||||||
|
if i + 1 < len(self.args):
|
||||||
|
args += ", "
|
||||||
|
|
||||||
|
return qualifiers + get_datatype_string(self.ret_type) + " " + str(self.pointer) + self.name + f"({args})"
|
||||||
|
|
||||||
|
def declare(self) -> str:
|
||||||
|
return f"{str(self)};\n"
|
||||||
|
|
||||||
|
def define(self) -> str:
|
||||||
|
return f"{str(self)} {{\n{self.body}\n}}\n\n"
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class CInclude:
|
||||||
|
header: Union[str, "CHeader"]
|
||||||
|
local: bool = False
|
||||||
|
same_dir: bool = False
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
if isinstance(self.header, CHeader):
|
||||||
|
name = f"{self.header.name}.{self.header.extension}"
|
||||||
|
else:
|
||||||
|
name = self.header
|
||||||
|
|
||||||
|
if self.local:
|
||||||
|
open_symbol = '"'
|
||||||
|
close_symbol = '"'
|
||||||
|
|
||||||
|
if self.same_dir:
|
||||||
|
name = f"./{name}"
|
||||||
|
else:
|
||||||
|
open_symbol = '<'
|
||||||
|
close_symbol = '>'
|
||||||
|
|
||||||
|
return f"#include {open_symbol}{name}{close_symbol}\n"
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class CFile:
|
||||||
|
name: str
|
||||||
|
extension: str
|
||||||
|
includes: List[CInclude] = field(default_factory=list)
|
||||||
|
types: List[CUserType] = field(default_factory=list)
|
||||||
|
funcs: List[CFunc] = field(default_factory=list)
|
||||||
|
decl_types: List[CStruct] = field(default_factory=list)
|
||||||
|
macros: List[CMacro] = field(default_factory=list)
|
||||||
|
|
||||||
|
def save(self, output_dir: Path):
|
||||||
|
self.includes.extend(
|
||||||
|
[
|
||||||
|
CInclude(
|
||||||
|
header=str(convert_to_relative(WAPP_SRC_ROOT / "common" / "aliases" / "aliases.h", output_dir)).replace("\\", "/"),
|
||||||
|
local=True,
|
||||||
|
),
|
||||||
|
CInclude(
|
||||||
|
header=str(convert_to_relative(WAPP_SRC_ROOT / "common" / "platform" / "platform.h", output_dir)).replace("\\", "/"),
|
||||||
|
local=True,
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
output_file = output_dir / f"{self.name}.{self.extension}"
|
||||||
|
with open(output_file, "w+") as outfile:
|
||||||
|
outfile.write(str(self))
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
return """\
|
||||||
|
/**
|
||||||
|
* THIS FILE IS AUTOMATICALLY GENERATED. ANY MODIFICATIONS TO IT WILL BE OVERWRITTEN
|
||||||
|
*/
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class CHeader(CFile):
|
||||||
|
extension: str = "h"
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
name_upper = self.name.upper()
|
||||||
|
header_guard_name = f"{name_upper}_H"
|
||||||
|
header_guard_open = f"#ifndef {header_guard_name}\n#define {header_guard_name}\n\n"
|
||||||
|
header_guard_close = f"\n#endif // !{header_guard_name}\n"
|
||||||
|
|
||||||
|
includes = _get_includes_string(self.includes)
|
||||||
|
|
||||||
|
macros = ""
|
||||||
|
for macro in self.macros:
|
||||||
|
macros += str(macro)
|
||||||
|
if len(macros) > 0:
|
||||||
|
macros += "\n"
|
||||||
|
|
||||||
|
forward_declarations = ""
|
||||||
|
for _type in self.decl_types:
|
||||||
|
forward_declarations += _type.declare()
|
||||||
|
if len(forward_declarations) > 0:
|
||||||
|
forward_declarations += "\n"
|
||||||
|
|
||||||
|
types = ""
|
||||||
|
for _type in self.types:
|
||||||
|
types += str(_type) + "\n"
|
||||||
|
|
||||||
|
funcs = ""
|
||||||
|
for func in self.funcs:
|
||||||
|
funcs += func.declare()
|
||||||
|
|
||||||
|
return (
|
||||||
|
super().__str__() +
|
||||||
|
header_guard_open +
|
||||||
|
includes +
|
||||||
|
macros +
|
||||||
|
forward_declarations +
|
||||||
|
types +
|
||||||
|
funcs +
|
||||||
|
header_guard_close
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class CSource(CFile):
|
||||||
|
extension: str = "c"
|
||||||
|
internal_funcs: List[CFunc] = field(default_factory=list)
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
includes = _get_includes_string(self.includes)
|
||||||
|
|
||||||
|
macros = ""
|
||||||
|
for macro in self.macros:
|
||||||
|
macros += str(macro)
|
||||||
|
if len(macros) > 0:
|
||||||
|
macros += "\n"
|
||||||
|
|
||||||
|
forward_declarations = ""
|
||||||
|
for _type in self.decl_types:
|
||||||
|
forward_declarations += _type.declare()
|
||||||
|
if len(forward_declarations) > 0:
|
||||||
|
forward_declarations += "\n"
|
||||||
|
|
||||||
|
types = ""
|
||||||
|
for _type in self.types:
|
||||||
|
types += str(_type) + "\n"
|
||||||
|
|
||||||
|
internal_funcs_decl = ""
|
||||||
|
internal_funcs_def = ""
|
||||||
|
for func in self.internal_funcs:
|
||||||
|
internal_funcs_decl += func.declare()
|
||||||
|
internal_funcs_def += func.define()
|
||||||
|
|
||||||
|
if len(internal_funcs_decl) > 0:
|
||||||
|
internal_funcs_decl += "\n"
|
||||||
|
|
||||||
|
funcs = ""
|
||||||
|
for func in self.funcs:
|
||||||
|
funcs += func.define()
|
||||||
|
|
||||||
|
return (
|
||||||
|
super().__str__() +
|
||||||
|
includes +
|
||||||
|
macros +
|
||||||
|
forward_declarations +
|
||||||
|
types +
|
||||||
|
internal_funcs_decl +
|
||||||
|
funcs +
|
||||||
|
internal_funcs_def
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def get_datatype_string(_type: CDataType) -> str:
|
||||||
|
if isinstance(_type, CType):
|
||||||
|
return str(_type)
|
||||||
|
elif isinstance(_type, CStruct) or isinstance(_type, CEnum):
|
||||||
|
return _type.name
|
||||||
|
elif isinstance(_type, str):
|
||||||
|
return _type
|
||||||
|
|
||||||
|
|
||||||
|
def _get_includes_string(includes: List[CInclude]) -> str:
|
||||||
|
output = ""
|
||||||
|
for include in sorted(includes, key=lambda inc: inc.local, reverse=True):
|
||||||
|
output += str(include)
|
||||||
|
if len(output) > 0:
|
||||||
|
output += "\n"
|
||||||
|
|
||||||
|
return output
|
321
codegen/dbl_list/make_dbl_list.py
Normal file
321
codegen/dbl_list/make_dbl_list.py
Normal file
@ -0,0 +1,321 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
from typing import List, Dict
|
||||||
|
from codegen.constants import WAPP_SRC_ROOT
|
||||||
|
from codegen.utils import load_func_body_from_file
|
||||||
|
from codegen.datatypes import (
|
||||||
|
CDataType,
|
||||||
|
CMacro,
|
||||||
|
CStruct,
|
||||||
|
CFunc,
|
||||||
|
CHeader,
|
||||||
|
CSource,
|
||||||
|
CArg,
|
||||||
|
CType,
|
||||||
|
CPointer,
|
||||||
|
CPointerType,
|
||||||
|
CQualifier,
|
||||||
|
CInclude,
|
||||||
|
get_datatype_string,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class DblListData:
|
||||||
|
node_typename: str
|
||||||
|
list_typename: str
|
||||||
|
hdr_decl_types: List[CStruct] = field(default_factory=list)
|
||||||
|
src_decl_types: List[CStruct] = field(default_factory=list)
|
||||||
|
|
||||||
|
|
||||||
|
def make_dbl_list(user_datatypes: Dict[CDataType, DblListData] = {}):
|
||||||
|
def __format_func_body(
|
||||||
|
filename: Path,
|
||||||
|
type_string: str,
|
||||||
|
type_string_upper: str,
|
||||||
|
type_string_lower: str,
|
||||||
|
node_typename: str,
|
||||||
|
list_typename: str
|
||||||
|
):
|
||||||
|
return load_func_body_from_file(filename).format(
|
||||||
|
T=type_string,
|
||||||
|
NodeType=node_typename,
|
||||||
|
ListType=list_typename,
|
||||||
|
Tupper=type_string_upper,
|
||||||
|
Tlower=type_string_lower,
|
||||||
|
)
|
||||||
|
|
||||||
|
out_dir = WAPP_SRC_ROOT / "primitives" / "dbl_list"
|
||||||
|
out_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
common_includes: List[CInclude] = [
|
||||||
|
CInclude(header="stdbool.h")
|
||||||
|
]
|
||||||
|
|
||||||
|
common_decl_types: List[CStruct] = []
|
||||||
|
|
||||||
|
datatypes: dict[CDataType, DblListData] = {
|
||||||
|
"Str8": DblListData(
|
||||||
|
node_typename="Str8Node",
|
||||||
|
list_typename="Str8List",
|
||||||
|
hdr_decl_types=[
|
||||||
|
CStruct(name="str8", cargs=[], typedef_name="Str8"),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
for _type in CType:
|
||||||
|
if _type == CType.VOID:
|
||||||
|
datatypes["void *"] = DblListData(
|
||||||
|
node_typename="VoidPNode",
|
||||||
|
list_typename="VoidPList",
|
||||||
|
)
|
||||||
|
continue
|
||||||
|
|
||||||
|
type_title = _type.value.title()
|
||||||
|
datatypes[_type.value] = DblListData(
|
||||||
|
node_typename=f"{type_title}Node",
|
||||||
|
list_typename=f"{type_title}List",
|
||||||
|
)
|
||||||
|
|
||||||
|
datatypes.update(user_datatypes)
|
||||||
|
|
||||||
|
snippets_dir = Path(__file__).parent / "snippets"
|
||||||
|
|
||||||
|
header = CHeader(
|
||||||
|
name="dbl_list",
|
||||||
|
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="stddef.h"),
|
||||||
|
CInclude(header="assert.h"),
|
||||||
|
],
|
||||||
|
internal_funcs=[],
|
||||||
|
funcs=header.funcs
|
||||||
|
)
|
||||||
|
|
||||||
|
if len(common_includes) > 0:
|
||||||
|
header.includes.extend(common_includes)
|
||||||
|
source.includes.extend(common_includes)
|
||||||
|
|
||||||
|
for _type, dbl_list_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()
|
||||||
|
|
||||||
|
node = CStruct(
|
||||||
|
name=dbl_list_data.node_typename,
|
||||||
|
cargs=[
|
||||||
|
CArg(name="item", _type=type_string, pointer=CPointer(_type=CPointerType.SINGLE)),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
node.cargs.extend([
|
||||||
|
CArg(name="prev", _type=node, pointer=CPointer(_type=CPointerType.SINGLE)),
|
||||||
|
CArg(name="next", _type=node, pointer=CPointer(_type=CPointerType.SINGLE)),
|
||||||
|
])
|
||||||
|
|
||||||
|
dl_list = CStruct(
|
||||||
|
name=dbl_list_data.list_typename,
|
||||||
|
cargs=[
|
||||||
|
CArg(name="first", _type=node, pointer=CPointer(_type=CPointerType.SINGLE)),
|
||||||
|
CArg(name="last", _type=node, pointer=CPointer(_type=CPointerType.SINGLE)),
|
||||||
|
CArg(name="node_count", _type=CType.U64),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
node_macro = CMacro(
|
||||||
|
name=f"wapp_{type_string_lower}_list_node(ITEM_PTR)",
|
||||||
|
value=__format_func_body(
|
||||||
|
filename=snippets_dir / "list_node",
|
||||||
|
type_string=type_string,
|
||||||
|
type_string_upper=type_string_upper,
|
||||||
|
type_string_lower=type_string_lower,
|
||||||
|
node_typename=dbl_list_data.node_typename,
|
||||||
|
list_typename=dbl_list_data.list_typename
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
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(
|
||||||
|
filename=snippets_dir / "list_get",
|
||||||
|
type_string=type_string,
|
||||||
|
type_string_upper=type_string_upper,
|
||||||
|
type_string_lower=type_string_lower,
|
||||||
|
node_typename=dbl_list_data.node_typename,
|
||||||
|
list_typename=dbl_list_data.list_typename
|
||||||
|
),
|
||||||
|
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(
|
||||||
|
filename=snippets_dir / "list_push_front",
|
||||||
|
type_string=type_string,
|
||||||
|
type_string_upper=type_string_upper,
|
||||||
|
type_string_lower=type_string_lower,
|
||||||
|
node_typename=dbl_list_data.node_typename,
|
||||||
|
list_typename=dbl_list_data.list_typename
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
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(
|
||||||
|
filename=snippets_dir / "list_push_back",
|
||||||
|
type_string=type_string,
|
||||||
|
type_string_upper=type_string_upper,
|
||||||
|
type_string_lower=type_string_lower,
|
||||||
|
node_typename=dbl_list_data.node_typename,
|
||||||
|
list_typename=dbl_list_data.list_typename
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
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(
|
||||||
|
filename=snippets_dir / "list_insert",
|
||||||
|
type_string=type_string,
|
||||||
|
type_string_upper=type_string_upper,
|
||||||
|
type_string_lower=type_string_lower,
|
||||||
|
node_typename=dbl_list_data.node_typename,
|
||||||
|
list_typename=dbl_list_data.list_typename
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
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(
|
||||||
|
filename=snippets_dir / "list_pop_front",
|
||||||
|
type_string=type_string,
|
||||||
|
type_string_upper=type_string_upper,
|
||||||
|
type_string_lower=type_string_lower,
|
||||||
|
node_typename=dbl_list_data.node_typename,
|
||||||
|
list_typename=dbl_list_data.list_typename
|
||||||
|
),
|
||||||
|
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(
|
||||||
|
filename=snippets_dir / "list_pop_back",
|
||||||
|
type_string=type_string,
|
||||||
|
type_string_upper=type_string_upper,
|
||||||
|
type_string_lower=type_string_lower,
|
||||||
|
node_typename=dbl_list_data.node_typename,
|
||||||
|
list_typename=dbl_list_data.list_typename
|
||||||
|
),
|
||||||
|
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(
|
||||||
|
filename=snippets_dir / "list_remove",
|
||||||
|
type_string=type_string,
|
||||||
|
type_string_upper=type_string_upper,
|
||||||
|
type_string_lower=type_string_lower,
|
||||||
|
node_typename=dbl_list_data.node_typename,
|
||||||
|
list_typename=dbl_list_data.list_typename
|
||||||
|
),
|
||||||
|
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(
|
||||||
|
filename=snippets_dir / "list_empty",
|
||||||
|
type_string=type_string,
|
||||||
|
type_string_upper=type_string_upper,
|
||||||
|
type_string_lower=type_string_lower,
|
||||||
|
node_typename=dbl_list_data.node_typename,
|
||||||
|
list_typename=dbl_list_data.list_typename
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
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(
|
||||||
|
filename=snippets_dir / "node_to_list",
|
||||||
|
type_string=type_string,
|
||||||
|
type_string_upper=type_string_upper,
|
||||||
|
type_string_lower=type_string_lower,
|
||||||
|
node_typename=dbl_list_data.node_typename,
|
||||||
|
list_typename=dbl_list_data.list_typename
|
||||||
|
),
|
||||||
|
qualifiers=[CQualifier.INTERNAL],
|
||||||
|
)
|
||||||
|
|
||||||
|
header.decl_types.extend(dbl_list_data.hdr_decl_types)
|
||||||
|
header.macros.append(node_macro)
|
||||||
|
header.types.extend([node, dl_list])
|
||||||
|
header.funcs.extend([
|
||||||
|
get_func,
|
||||||
|
push_front_func,
|
||||||
|
push_back_func,
|
||||||
|
insert_func,
|
||||||
|
pop_front_func,
|
||||||
|
pop_back_func,
|
||||||
|
remove_func,
|
||||||
|
empty_func,
|
||||||
|
])
|
||||||
|
|
||||||
|
source.decl_types.extend(dbl_list_data.src_decl_types)
|
||||||
|
source.internal_funcs.append(node_to_list_func)
|
||||||
|
source.funcs = header.funcs
|
||||||
|
|
||||||
|
header.save(out_dir)
|
||||||
|
source.save(out_dir)
|
6
codegen/dbl_list/snippets/list_empty
Normal file
6
codegen/dbl_list/snippets/list_empty
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
assert(list != NULL);
|
||||||
|
|
||||||
|
u64 count = list->node_count;
|
||||||
|
for (u64 i = 0; i < count; ++i) {{
|
||||||
|
wapp_{Tlower}_list_pop_back(list);
|
||||||
|
}}
|
11
codegen/dbl_list/snippets/list_get
Normal file
11
codegen/dbl_list/snippets/list_get
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
assert(index < list->node_count);
|
||||||
|
|
||||||
|
{NodeType} *output = NULL;
|
||||||
|
{NodeType} *current = list->first;
|
||||||
|
for (u64 i = 1; i <= index; ++i) {{
|
||||||
|
current = current->next;
|
||||||
|
}}
|
||||||
|
|
||||||
|
output = current;
|
||||||
|
|
||||||
|
return output;
|
26
codegen/dbl_list/snippets/list_insert
Normal file
26
codegen/dbl_list/snippets/list_insert
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
assert(list != NULL && node != NULL && (node->item) != NULL);
|
||||||
|
|
||||||
|
if (index == 0) {{
|
||||||
|
wapp_{Tlower}_list_push_front(list, node);
|
||||||
|
return;
|
||||||
|
}} else if (index == list->node_count) {{
|
||||||
|
wapp_{Tlower}_list_push_back(list, node);
|
||||||
|
return;
|
||||||
|
}}
|
||||||
|
|
||||||
|
{NodeType} *dst_node = wapp_{Tlower}_list_get(list, index);
|
||||||
|
if (!dst_node) {{
|
||||||
|
return;
|
||||||
|
}}
|
||||||
|
|
||||||
|
{ListType} node_list = {Tlower}_node_to_list(node);
|
||||||
|
|
||||||
|
list->node_count += node_list.node_count;
|
||||||
|
|
||||||
|
{NodeType} *prev = dst_node->prev;
|
||||||
|
|
||||||
|
dst_node->prev = node_list.last;
|
||||||
|
prev->next = node_list.first;
|
||||||
|
|
||||||
|
node_list.first->prev = prev;
|
||||||
|
node_list.last->next = dst_node;
|
1
codegen/dbl_list/snippets/list_node
Normal file
1
codegen/dbl_list/snippets/list_node
Normal file
@ -0,0 +1 @@
|
|||||||
|
(({NodeType}){{.item = ITEM_PTR}})
|
22
codegen/dbl_list/snippets/list_pop_back
Normal file
22
codegen/dbl_list/snippets/list_pop_back
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
assert(list != NULL);
|
||||||
|
|
||||||
|
{NodeType} *output = NULL;
|
||||||
|
|
||||||
|
if (list->node_count == 0) {{
|
||||||
|
goto RETURN_{Tupper}_LIST_POP_BACK;
|
||||||
|
}}
|
||||||
|
|
||||||
|
output = list->last;
|
||||||
|
|
||||||
|
if (list->node_count == 1) {{
|
||||||
|
*list = ({ListType}){{0}};
|
||||||
|
goto RETURN_{Tupper}_LIST_POP_BACK;
|
||||||
|
}}
|
||||||
|
|
||||||
|
--(list->node_count);
|
||||||
|
list->last = output->prev;
|
||||||
|
|
||||||
|
output->prev = output->next = NULL;
|
||||||
|
|
||||||
|
RETURN_{Tupper}_LIST_POP_BACK:
|
||||||
|
return output;
|
22
codegen/dbl_list/snippets/list_pop_front
Normal file
22
codegen/dbl_list/snippets/list_pop_front
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
assert(list != NULL);
|
||||||
|
|
||||||
|
{NodeType} *output = NULL;
|
||||||
|
|
||||||
|
if (list->node_count == 0) {{
|
||||||
|
goto RETURN_{Tupper}_LIST_POP_FRONT;
|
||||||
|
}}
|
||||||
|
|
||||||
|
output = list->first;
|
||||||
|
|
||||||
|
if (list->node_count == 1) {{
|
||||||
|
*list = ({ListType}){{0}};
|
||||||
|
goto RETURN_{Tupper}_LIST_POP_FRONT;
|
||||||
|
}}
|
||||||
|
|
||||||
|
--(list->node_count);
|
||||||
|
list->first = output->next;
|
||||||
|
|
||||||
|
output->prev = output->next = NULL;
|
||||||
|
|
||||||
|
RETURN_{Tupper}_LIST_POP_FRONT:
|
||||||
|
return output;
|
18
codegen/dbl_list/snippets/list_push_back
Normal file
18
codegen/dbl_list/snippets/list_push_back
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
assert(list != NULL && node != NULL && (node->item) != NULL);
|
||||||
|
|
||||||
|
{ListType} node_list = {Tlower}_node_to_list(node);
|
||||||
|
|
||||||
|
if (list->node_count == 0) {{
|
||||||
|
*list = node_list;
|
||||||
|
return;
|
||||||
|
}}
|
||||||
|
|
||||||
|
list->node_count += node_list.node_count;
|
||||||
|
|
||||||
|
{NodeType} *last = list->last;
|
||||||
|
if (last) {{
|
||||||
|
last->next = node_list.first;
|
||||||
|
}}
|
||||||
|
|
||||||
|
list->last = node_list.last;
|
||||||
|
node_list.first->prev = last;
|
18
codegen/dbl_list/snippets/list_push_front
Normal file
18
codegen/dbl_list/snippets/list_push_front
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
assert(list != NULL && node != NULL && (node->item) != NULL);
|
||||||
|
|
||||||
|
{ListType} node_list = {Tlower}_node_to_list(node);
|
||||||
|
|
||||||
|
if (list->node_count == 0) {{
|
||||||
|
*list = node_list;
|
||||||
|
return;
|
||||||
|
}}
|
||||||
|
|
||||||
|
list->node_count += node_list.node_count;
|
||||||
|
|
||||||
|
{NodeType} *first = list->first;
|
||||||
|
if (first) {{
|
||||||
|
first->prev = node_list.last;
|
||||||
|
}}
|
||||||
|
|
||||||
|
list->first = node_list.first;
|
||||||
|
node_list.last->next = first;
|
26
codegen/dbl_list/snippets/list_remove
Normal file
26
codegen/dbl_list/snippets/list_remove
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
assert(list != NULL);
|
||||||
|
|
||||||
|
{NodeType} *output = NULL;
|
||||||
|
|
||||||
|
if (index == 0) {{
|
||||||
|
output = wapp_{Tlower}_list_pop_front(list);
|
||||||
|
goto RETURN_{Tupper}_LIST_REMOVE;
|
||||||
|
}} else if (index == list->node_count) {{
|
||||||
|
output = wapp_{Tlower}_list_pop_back(list);
|
||||||
|
goto RETURN_{Tupper}_LIST_REMOVE;
|
||||||
|
}}
|
||||||
|
|
||||||
|
output = wapp_{Tlower}_list_get(list, index);
|
||||||
|
if (!output) {{
|
||||||
|
goto RETURN_{Tupper}_LIST_REMOVE;
|
||||||
|
}}
|
||||||
|
|
||||||
|
output->prev->next = output->next;
|
||||||
|
output->next->prev = output->prev;
|
||||||
|
|
||||||
|
--(list->node_count);
|
||||||
|
|
||||||
|
output->prev = output->next = NULL;
|
||||||
|
|
||||||
|
RETURN_{Tupper}_LIST_REMOVE:
|
||||||
|
return output;
|
13
codegen/dbl_list/snippets/node_to_list
Normal file
13
codegen/dbl_list/snippets/node_to_list
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{ListType} output = {{.first = node, .last = node, .node_count = 1}};
|
||||||
|
|
||||||
|
while (output.first->prev != NULL) {{
|
||||||
|
output.first = output.first->prev;
|
||||||
|
++(output.node_count);
|
||||||
|
}}
|
||||||
|
|
||||||
|
while (output.last->next != NULL) {{
|
||||||
|
output.last = output.last->next;
|
||||||
|
++(output.node_count);
|
||||||
|
}}
|
||||||
|
|
||||||
|
return output;
|
18
codegen/utils.py
Normal file
18
codegen/utils.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
def load_func_body_from_file(filename: Path) -> str:
|
||||||
|
with open(filename, "r") as infile:
|
||||||
|
return infile.read().rstrip()
|
||||||
|
|
||||||
|
|
||||||
|
def convert_to_relative(path: Path, target: Path) -> Path:
|
||||||
|
major = sys.version_info.major
|
||||||
|
minor = sys.version_info.minor
|
||||||
|
|
||||||
|
if major >= 3 and minor >= 12:
|
||||||
|
return path.relative_to(target, walk_up=True)
|
||||||
|
else:
|
||||||
|
return Path(os.path.relpath(str(path), start=str(target)))
|
@ -1,11 +1,25 @@
|
|||||||
#ifndef ALIASES_H
|
#ifndef ALIASES_H
|
||||||
#define ALIASES_H
|
#define ALIASES_H
|
||||||
|
|
||||||
|
#include "../platform/platform.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#define c8 uint8_t
|
#if WAPP_PLATFORM_C_VERSION >= WAPP_PLATFORM_C11_VERSION
|
||||||
#define c16 uint16_t
|
#include <uchar.h>
|
||||||
#define c32 uint32_t
|
|
||||||
|
#if WAPP_PLATFORM_C_VERSION >= WAPP_PLATFORM_C23_VERSION
|
||||||
|
#define c8 char8_t
|
||||||
|
#else
|
||||||
|
#define c8 uint8_t
|
||||||
|
#endif // !WAPP_PLATFORM_C23_VERSION
|
||||||
|
|
||||||
|
#define c16 char16_t
|
||||||
|
#define c32 char32_t
|
||||||
|
#else
|
||||||
|
#define c8 uint8_t
|
||||||
|
#define c16 uint16_t
|
||||||
|
#define c32 uint32_t
|
||||||
|
#endif // !WAPP_PLATFORM_C11_VERSION
|
||||||
|
|
||||||
#define u8 uint8_t
|
#define u8 uint8_t
|
||||||
#define u16 uint16_t
|
#define u16 uint16_t
|
||||||
@ -28,10 +42,4 @@
|
|||||||
#define internal static
|
#define internal static
|
||||||
#define persistent static
|
#define persistent static
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
#define class_mem static
|
|
||||||
#define BEGIN_C_LINKAGE extern "C" {
|
|
||||||
#define END_C_LINKAGE }
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !ALIASES_H
|
#endif // !ALIASES_H
|
||||||
|
@ -10,4 +10,28 @@
|
|||||||
|
|
||||||
#define wapp_misc_utils_padding_size(SIZE) u8 reserved_padding[sizeof(void *) - ((SIZE) % sizeof(void *))]
|
#define wapp_misc_utils_padding_size(SIZE) u8 reserved_padding[sizeof(void *) - ((SIZE) % sizeof(void *))]
|
||||||
|
|
||||||
|
#define U64_RSHIFT_OR_1(X) (((u64)X) | (((u64)X) >> 1))
|
||||||
|
#define U64_RSHIFT_OR_2(X) (((u64)X) | (((u64)X) >> 2))
|
||||||
|
#define U64_RSHIFT_OR_4(X) (((u64)X) | (((u64)X) >> 4))
|
||||||
|
#define U64_RSHIFT_OR_8(X) (((u64)X) | (((u64)X) >> 8))
|
||||||
|
#define U64_RSHIFT_OR_16(X) (((u64)X) | (((u64)X) >> 16))
|
||||||
|
#define U64_RSHIFT_OR_32(X) (((u64)X) | (((u64)X) >> 32))
|
||||||
|
#define wapp_misc_utils_u64_round_up_pow2(X) ( \
|
||||||
|
( \
|
||||||
|
U64_RSHIFT_OR_32( \
|
||||||
|
U64_RSHIFT_OR_16( \
|
||||||
|
U64_RSHIFT_OR_8( \
|
||||||
|
U64_RSHIFT_OR_4( \
|
||||||
|
U64_RSHIFT_OR_2( \
|
||||||
|
U64_RSHIFT_OR_1(X - 1) \
|
||||||
|
) \
|
||||||
|
) \
|
||||||
|
) \
|
||||||
|
) \
|
||||||
|
) \
|
||||||
|
) + 1 \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define wapp_misc_utils_va_args_count(T, ...) (sizeof((T[]){__VA_ARGS__})/sizeof(T))
|
||||||
|
|
||||||
#endif // !MISC_UTILS_H
|
#endif // !MISC_UTILS_H
|
||||||
|
@ -58,4 +58,32 @@
|
|||||||
#error "Unrecognised platform"
|
#error "Unrecognised platform"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#error "WAPP is a C only library"
|
||||||
|
#else
|
||||||
|
#define WAPP_PLATFORM_C
|
||||||
|
|
||||||
|
#if defined(__STDC_VERSION__)
|
||||||
|
#define WAPP_PLATFORM_C_VERSION __STDC_VERSION__
|
||||||
|
#define WAPP_PLATFORM_C99_VERSION 199901L
|
||||||
|
#define WAPP_PLATFORM_C11_VERSION 201112L
|
||||||
|
#define WAPP_PLATFORM_C17_VERSION 201710L
|
||||||
|
#define WAPP_PLATFORM_C23_VERSION 202311L
|
||||||
|
|
||||||
|
#if WAPP_PLATFORM_C_VERSION == WAPP_PLATFORM_C99_VERSION
|
||||||
|
#define WAPP_PLATFORM_C99
|
||||||
|
#elif WAPP_PLATFORM_C_VERSION == WAPP_PLATFORM_C11_VERSION
|
||||||
|
#define WAPP_PLATFORM_C11
|
||||||
|
#elif WAPP_PLATFORM_C_VERSION == WAPP_PLATFORM_C17_VERSION
|
||||||
|
#define WAPP_PLATFORM_C17
|
||||||
|
#elif WAPP_PLATFORM_C_VERSION == WAPP_PLATFORM_C23_VERSION
|
||||||
|
#define WAPP_PLATFORM_C23
|
||||||
|
#else
|
||||||
|
#error "Unrecognised C version"
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define WAPP_PLATFORM_C89
|
||||||
|
#endif
|
||||||
|
#endif // !__cplusplus
|
||||||
|
|
||||||
#endif // !PLATFORM_H
|
#endif // !PLATFORM_H
|
||||||
|
@ -1,209 +0,0 @@
|
|||||||
#include "./dbl_list.h"
|
|
||||||
#include "../../common/aliases/aliases.h"
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
internal DBL_LIST(void) node_to_list(DBL_NODE(void) *node);
|
|
||||||
|
|
||||||
DBL_NODE(void) *_dbl_list_get(const DBL_LIST(void) *list, u64 index) {
|
|
||||||
if (index >= list->node_count) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
DBL_NODE(void) *output = NULL;
|
|
||||||
DBL_NODE(void) *current = list->first;
|
|
||||||
for (u64 i = 1; i <= index; ++i) {
|
|
||||||
current = current->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
output = current;
|
|
||||||
|
|
||||||
return output;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void _dbl_list_push_front(DBL_LIST(void) *list, DBL_NODE(void) *node) {
|
|
||||||
if (!list || !node || !(node->item)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DBL_LIST(void) node_list = node_to_list(node);
|
|
||||||
|
|
||||||
if (list->node_count == 0) {
|
|
||||||
*list = node_list;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
list->node_count += node_list.node_count;
|
|
||||||
|
|
||||||
DBL_NODE(void) *first = list->first;
|
|
||||||
if (first) {
|
|
||||||
first->prev = node_list.last;
|
|
||||||
}
|
|
||||||
|
|
||||||
list->first = node_list.first;
|
|
||||||
node_list.last->next = first;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void _dbl_list_push_back(DBL_LIST(void) *list, DBL_NODE(void) *node) {
|
|
||||||
if (!list || !node || !(node->item)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DBL_LIST(void) node_list = node_to_list(node);
|
|
||||||
|
|
||||||
if (list->node_count == 0) {
|
|
||||||
*list = node_list;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
list->node_count += node_list.node_count;
|
|
||||||
|
|
||||||
DBL_NODE(void) *last = list->last;
|
|
||||||
if (last) {
|
|
||||||
last->next = node_list.first;
|
|
||||||
}
|
|
||||||
|
|
||||||
list->last = node_list.last;
|
|
||||||
node_list.first->prev = last;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void _dbl_list_insert(DBL_LIST(void) *list, DBL_NODE(void) *node, u64 index) {
|
|
||||||
if (!list || !node || !(node->item)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index == 0) {
|
|
||||||
_dbl_list_push_front(list, node);
|
|
||||||
return;
|
|
||||||
} else if (index == list->node_count) {
|
|
||||||
_dbl_list_push_back(list, node);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DBL_NODE(void) *dst_node = _dbl_list_get(list, index);
|
|
||||||
if (!dst_node) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DBL_LIST(void) node_list = node_to_list(node);
|
|
||||||
|
|
||||||
list->node_count += node_list.node_count;
|
|
||||||
|
|
||||||
DBL_NODE(void) *prev = dst_node->prev;
|
|
||||||
|
|
||||||
dst_node->prev = node_list.last;
|
|
||||||
prev->next = node_list.first;
|
|
||||||
|
|
||||||
node_list.first->prev = prev;
|
|
||||||
node_list.last->next = dst_node;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
DBL_NODE(void) *_dbl_list_pop_front(DBL_LIST(void) *list) {
|
|
||||||
DBL_NODE(void) *output = NULL;
|
|
||||||
|
|
||||||
if (!list || list->node_count == 0) {
|
|
||||||
goto RETURN_STR8_LIST_POP_FRONT;
|
|
||||||
}
|
|
||||||
|
|
||||||
output = list->first;
|
|
||||||
|
|
||||||
if (list->node_count == 1) {
|
|
||||||
*list = (DBL_LIST(void)){0};
|
|
||||||
goto RETURN_STR8_LIST_POP_FRONT;
|
|
||||||
}
|
|
||||||
|
|
||||||
--(list->node_count);
|
|
||||||
list->first = output->next;
|
|
||||||
|
|
||||||
output->prev = output->next = NULL;
|
|
||||||
|
|
||||||
RETURN_STR8_LIST_POP_FRONT:
|
|
||||||
return output;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
DBL_NODE(void) *_dbl_list_pop_back(DBL_LIST(void) *list) {
|
|
||||||
DBL_NODE(void) *output = NULL;
|
|
||||||
|
|
||||||
if (!list || list->node_count == 0) {
|
|
||||||
goto RETURN_STR8_LIST_POP_BACK;
|
|
||||||
}
|
|
||||||
|
|
||||||
output = list->last;
|
|
||||||
|
|
||||||
if (list->node_count == 1) {
|
|
||||||
*list = (DBL_LIST(void)){0};
|
|
||||||
goto RETURN_STR8_LIST_POP_BACK;
|
|
||||||
}
|
|
||||||
|
|
||||||
--(list->node_count);
|
|
||||||
list->last = output->prev;
|
|
||||||
|
|
||||||
output->prev = output->next = NULL;
|
|
||||||
|
|
||||||
RETURN_STR8_LIST_POP_BACK:
|
|
||||||
return output;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
DBL_NODE(void) *_dbl_list_remove(DBL_LIST(void) *list, u64 index) {
|
|
||||||
DBL_NODE(void) *output = NULL;
|
|
||||||
if (!list) {
|
|
||||||
goto RETURN_STR8_LIST_REMOVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index == 0) {
|
|
||||||
output = _dbl_list_pop_front(list);
|
|
||||||
goto RETURN_STR8_LIST_REMOVE;
|
|
||||||
} else if (index == list->node_count) {
|
|
||||||
output = _dbl_list_pop_back(list);
|
|
||||||
goto RETURN_STR8_LIST_REMOVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
output = _dbl_list_get(list, index);
|
|
||||||
if (!output) {
|
|
||||||
goto RETURN_STR8_LIST_REMOVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
output->prev->next = output->next;
|
|
||||||
output->next->prev = output->prev;
|
|
||||||
|
|
||||||
--(list->node_count);
|
|
||||||
|
|
||||||
output->prev = output->next = NULL;
|
|
||||||
|
|
||||||
RETURN_STR8_LIST_REMOVE:
|
|
||||||
return output;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void _dbl_list_empty(DBL_LIST(void) *list) {
|
|
||||||
if (!list) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
u64 count = list->node_count;
|
|
||||||
for (u64 i = 0; i < count; ++i) {
|
|
||||||
_dbl_list_pop_back(list);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
internal DBL_LIST(void) node_to_list(DBL_NODE(void) *node) {
|
|
||||||
DBL_LIST(void) output = {.first = node, .last = node, .node_count = 1};
|
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
|
||||||
output.first = output.first->prev;
|
|
||||||
++(output.node_count);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (output.last->next != NULL) {
|
|
||||||
output.last = output.last->next;
|
|
||||||
++(output.node_count);
|
|
||||||
}
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
@ -1,75 +0,0 @@
|
|||||||
#ifndef DBL_LIST_H
|
|
||||||
#define DBL_LIST_H
|
|
||||||
|
|
||||||
#include "../../common/aliases/aliases.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // !__cplusplus
|
|
||||||
|
|
||||||
#define DBL_NODE(T) T##Node
|
|
||||||
#define DBL_LIST(T) T##List
|
|
||||||
|
|
||||||
#define CAST_NODE(NODE) ((DBL_NODE(void))(NODE))
|
|
||||||
#define CAST_LIST(LIST) ((DBL_LIST(void))(LIST))
|
|
||||||
|
|
||||||
#define CAST_NODE_PTR(NODE_PTR) ((DBL_NODE(void)*)(NODE_PTR))
|
|
||||||
#define CAST_LIST_PTR(LIST_PTR) ((DBL_LIST(void)*)(LIST_PTR))
|
|
||||||
|
|
||||||
#define DBL_LIST_DECL(T) typedef struct DBL_NODE(T) DBL_NODE(T); \
|
|
||||||
struct DBL_NODE(T) { \
|
|
||||||
T *item; \
|
|
||||||
DBL_NODE(T) *prev; \
|
|
||||||
DBL_NODE(T) *next; \
|
|
||||||
}; \
|
|
||||||
\
|
|
||||||
typedef struct DBL_LIST(T) DBL_LIST(T); \
|
|
||||||
struct DBL_LIST(T) { \
|
|
||||||
DBL_NODE(T) *first; \
|
|
||||||
DBL_NODE(T) *last; \
|
|
||||||
u64 node_count; \
|
|
||||||
}
|
|
||||||
|
|
||||||
DBL_LIST_DECL(void);
|
|
||||||
|
|
||||||
#define wapp_dbl_list_node_from_item(T, ITEM_PTR) \
|
|
||||||
((DBL_NODE(T)){ .item = ITEM_PTR })
|
|
||||||
|
|
||||||
#define wapp_dbl_list_get(T, LIST_PTR, INDEX) \
|
|
||||||
(DBL_NODE(T)*)_dbl_list_get(CAST_LIST_PTR(LIST_PTR), INDEX)
|
|
||||||
|
|
||||||
#define wapp_dbl_list_push_front(LIST_PTR, NODE_PTR) \
|
|
||||||
_dbl_list_push_front(CAST_LIST_PTR(LIST_PTR), CAST_NODE_PTR(NODE_PTR))
|
|
||||||
|
|
||||||
#define wapp_dbl_list_push_back(LIST_PTR, NODE_PTR) \
|
|
||||||
_dbl_list_push_back(CAST_LIST_PTR(LIST_PTR), CAST_NODE_PTR(NODE_PTR))
|
|
||||||
|
|
||||||
#define wapp_dbl_list_insert(LIST_PTR, NODE_PTR, INDEX) \
|
|
||||||
_dbl_list_insert(CAST_LIST_PTR(LIST_PTR), CAST_NODE_PTR(NODE_PTR), INDEX)
|
|
||||||
|
|
||||||
#define wapp_dbl_list_pop_front(T, LIST_PTR) \
|
|
||||||
(DBL_NODE(T)*)_dbl_list_pop_front(CAST_LIST_PTR(LIST_PTR))
|
|
||||||
|
|
||||||
#define wapp_dbl_list_pop_back(T, LIST_PTR) \
|
|
||||||
(DBL_NODE(T)*)_dbl_list_pop_back(CAST_LIST_PTR(LIST_PTR))
|
|
||||||
|
|
||||||
#define wapp_dbl_list_remove(T, LIST_PTR, INDEX) \
|
|
||||||
(DBL_NODE(T)*)_dbl_list_remove(CAST_LIST_PTR(LIST_PTR), INDEX)
|
|
||||||
|
|
||||||
#define wapp_dbl_list_empty(LIST_PTR) \
|
|
||||||
_dbl_list_empty(CAST_LIST_PTR(LIST_PTR))
|
|
||||||
|
|
||||||
DBL_NODE(void) *_dbl_list_get(const DBL_LIST(void) *list, u64 index);
|
|
||||||
void _dbl_list_push_front(DBL_LIST(void) *list, DBL_NODE(void) *node);
|
|
||||||
void _dbl_list_push_back(DBL_LIST(void) *list, DBL_NODE(void) *node);
|
|
||||||
void _dbl_list_insert(DBL_LIST(void) *list, DBL_NODE(void) *node, u64 index);
|
|
||||||
DBL_NODE(void) *_dbl_list_pop_front(DBL_LIST(void) *list);
|
|
||||||
DBL_NODE(void) *_dbl_list_pop_back(DBL_LIST(void) *list);
|
|
||||||
DBL_NODE(void) *_dbl_list_remove(DBL_LIST(void) *list, u64 index);
|
|
||||||
void _dbl_list_empty(DBL_LIST(void) *list);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // !__cplusplus
|
|
||||||
|
|
||||||
#endif // !DBL_LIST_H
|
|
@ -1,6 +0,0 @@
|
|||||||
#ifndef WAPP_CONTAINERS_C
|
|
||||||
#define WAPP_CONTAINERS_C
|
|
||||||
|
|
||||||
#include "dbl_list/dbl_list.c"
|
|
||||||
|
|
||||||
#endif // !WAPP_CONTAINERS_C
|
|
@ -1,7 +0,0 @@
|
|||||||
#ifndef WAPP_CONTAINERS_H
|
|
||||||
#define WAPP_CONTAINERS_H
|
|
||||||
|
|
||||||
#include "dbl_list/dbl_list.h"
|
|
||||||
#include "../common/wapp_common.h"
|
|
||||||
|
|
||||||
#endif // !WAPP_CONTAINERS_H
|
|
@ -1,10 +1,12 @@
|
|||||||
#include "mem_arena.h"
|
#include "mem_arena.h"
|
||||||
|
#include "../utils/mem_utils.h"
|
||||||
#include "../../../common/aliases/aliases.h"
|
#include "../../../common/aliases/aliases.h"
|
||||||
#include "../../../common/misc/misc_utils.h"
|
#include "../../../common/misc/misc_utils.h"
|
||||||
#include "../../os/mem/mem_os.h"
|
#include "../../os/mem/mem_os.h"
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#ifndef DEFAULT_ALIGNMENT
|
#ifndef DEFAULT_ALIGNMENT
|
||||||
// Why 2 * sizeof(void *) instead of sizeof(void *)
|
// Why 2 * sizeof(void *) instead of sizeof(void *)
|
||||||
@ -36,7 +38,11 @@ bool wapp_mem_arena_init_custom(Arena **arena, u64 base_capacity, MemAllocFlags
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 arena_capacity = base_capacity >= ARENA_MINIMUM_CAPACITY ? base_capacity : ARENA_MINIMUM_CAPACITY;
|
u64 arena_capacity = wapp_misc_utils_u64_round_up_pow2(
|
||||||
|
base_capacity >= ARENA_MINIMUM_CAPACITY ?
|
||||||
|
base_capacity :
|
||||||
|
ARENA_MINIMUM_CAPACITY
|
||||||
|
);
|
||||||
|
|
||||||
arena_ptr->buf = (u8 *)wapp_mem_util_alloc(NULL, arena_capacity, WAPP_MEM_ACCESS_READ_WRITE, flags,
|
arena_ptr->buf = (u8 *)wapp_mem_util_alloc(NULL, arena_capacity, WAPP_MEM_ACCESS_READ_WRITE, flags,
|
||||||
zero_buffer ? WAPP_MEM_INIT_INITIALISED : WAPP_MEM_INIT_UNINITIALISED);
|
zero_buffer ? WAPP_MEM_INIT_INITIALISED : WAPP_MEM_INIT_UNINITIALISED);
|
||||||
@ -58,9 +64,7 @@ void *wapp_mem_arena_alloc(Arena *arena, u64 size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void *wapp_mem_arena_alloc_aligned(Arena *arena, u64 size, u64 alignment) {
|
void *wapp_mem_arena_alloc_aligned(Arena *arena, u64 size, u64 alignment) {
|
||||||
if (!arena) {
|
assert(arena != NULL);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
u8 *alloc_start = arena->offset;
|
u8 *alloc_start = arena->offset;
|
||||||
|
|
||||||
@ -119,18 +123,14 @@ void *wapp_mem_arena_realloc_aligned(Arena *arena, void *ptr, u64 old_size, u64
|
|||||||
}
|
}
|
||||||
|
|
||||||
void wapp_mem_arena_clear(Arena *arena) {
|
void wapp_mem_arena_clear(Arena *arena) {
|
||||||
if (!arena) {
|
assert(arena != NULL);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(arena->buf, 0, arena->offset - arena->buf);
|
memset(arena->buf, 0, arena->offset - arena->buf);
|
||||||
arena->offset = arena->buf;
|
arena->offset = arena->buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wapp_mem_arena_destroy(Arena **arena) {
|
void wapp_mem_arena_destroy(Arena **arena) {
|
||||||
if (!arena) {
|
assert(arena != NULL && (*arena) != NULL);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Arena *arena_ptr = *arena;
|
Arena *arena_ptr = *arena;
|
||||||
if (arena_ptr->buf) {
|
if (arena_ptr->buf) {
|
||||||
|
@ -2,13 +2,10 @@
|
|||||||
#define MEM_ARENA_H
|
#define MEM_ARENA_H
|
||||||
|
|
||||||
#include "../../../common/aliases/aliases.h"
|
#include "../../../common/aliases/aliases.h"
|
||||||
|
#include "../../../common/platform/platform.h"
|
||||||
#include "../../os/mem/mem_os.h"
|
#include "../../os/mem/mem_os.h"
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
typedef struct arena Arena;
|
typedef struct arena Arena;
|
||||||
|
|
||||||
#define wapp_mem_arena_init(arena_dptr, base_capacity) \
|
#define wapp_mem_arena_init(arena_dptr, base_capacity) \
|
||||||
@ -33,8 +30,4 @@ void *wapp_mem_arena_realloc_aligned(Arena *arena, void *ptr, u64 old_size, u64
|
|||||||
void wapp_mem_arena_clear(Arena *arena);
|
void wapp_mem_arena_clear(Arena *arena);
|
||||||
void wapp_mem_arena_destroy(Arena **arena);
|
void wapp_mem_arena_destroy(Arena **arena);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !MEM_ARENA_H
|
#endif // !MEM_ARENA_H
|
||||||
|
@ -2,14 +2,11 @@
|
|||||||
#define MEM_ARENA_ALLOCATOR_H
|
#define MEM_ARENA_ALLOCATOR_H
|
||||||
|
|
||||||
#include "../../../common/aliases/aliases.h"
|
#include "../../../common/aliases/aliases.h"
|
||||||
#include "../allocator/mem_allocator.h"
|
#include "../../../common/platform/platform.h"
|
||||||
|
#include "../../../primitives/mem_allocator/mem_allocator.h"
|
||||||
#include "../../os/mem/mem_os.h"
|
#include "../../os/mem/mem_os.h"
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#define wapp_mem_arena_allocator_init(base_capacity) \
|
#define wapp_mem_arena_allocator_init(base_capacity) \
|
||||||
(wapp_mem_arena_allocator_init_custom(base_capacity, WAPP_MEM_ALLOC_RESERVE, false))
|
(wapp_mem_arena_allocator_init_custom(base_capacity, WAPP_MEM_ALLOC_RESERVE, false))
|
||||||
#define wapp_mem_arena_allocator_init_commit(base_capacity) \
|
#define wapp_mem_arena_allocator_init_commit(base_capacity) \
|
||||||
@ -34,8 +31,4 @@ Allocator wapp_mem_arena_allocator_init_custom(u64 base_capacity, MemAllocFlags
|
|||||||
void wapp_mem_arena_allocator_clear(Allocator *allocator);
|
void wapp_mem_arena_allocator_clear(Allocator *allocator);
|
||||||
void wapp_mem_arena_allocator_destroy(Allocator *allocator);
|
void wapp_mem_arena_allocator_destroy(Allocator *allocator);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !MEM_ARENA_ALLOCATOR_H
|
#endif // !MEM_ARENA_ALLOCATOR_H
|
||||||
|
@ -7,10 +7,7 @@
|
|||||||
internal bool is_power_of_two(u64 num) { return (num & (num - 1)) == 0; }
|
internal bool is_power_of_two(u64 num) { return (num & (num - 1)) == 0; }
|
||||||
|
|
||||||
void *wapp_mem_util_align_forward(void *ptr, u64 alignment) {
|
void *wapp_mem_util_align_forward(void *ptr, u64 alignment) {
|
||||||
if (!ptr) {
|
assert(ptr != NULL);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(is_power_of_two(alignment));
|
assert(is_power_of_two(alignment));
|
||||||
|
|
||||||
uptr p = (uptr)ptr;
|
uptr p = (uptr)ptr;
|
||||||
|
@ -2,15 +2,8 @@
|
|||||||
#define MEM_UTILS_H
|
#define MEM_UTILS_H
|
||||||
|
|
||||||
#include "../../../common/aliases/aliases.h"
|
#include "../../../common/aliases/aliases.h"
|
||||||
|
#include "../../../common/platform/platform.h"
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
void *wapp_mem_util_align_forward(void *ptr, u64 alignment);
|
void *wapp_mem_util_align_forward(void *ptr, u64 alignment);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !MEM_UTILS_H
|
#endif // !MEM_UTILS_H
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
#include "cpath.h"
|
#include "cpath.h"
|
||||||
#include "../../../common/aliases/aliases.h"
|
#include "../../../common/aliases/aliases.h"
|
||||||
#include "../../../common/misc/misc_utils.h"
|
#include "../../../common/misc/misc_utils.h"
|
||||||
#include "../../mem/allocator/mem_allocator.h"
|
|
||||||
#include "../../mem/arena/mem_arena_allocator.h"
|
#include "../../mem/arena/mem_arena_allocator.h"
|
||||||
#include "../../strings/str8/str8.h"
|
#include "../../../primitives/dbl_list/dbl_list.h"
|
||||||
#include "../../strings/str8/str8_list.h"
|
#include "../../../primitives/mem_allocator/mem_allocator.h"
|
||||||
|
#include "../../../primitives/strings/str8/str8.h"
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
u32 wapp_cpath_join_path(Str8 *dst, const DBL_LIST(Str8) *parts) {
|
u32 wapp_cpath_join_path(Str8 *dst, const Str8List *parts) {
|
||||||
if (!dst || !parts) {
|
if (!dst || !parts) {
|
||||||
return CPATH_JOIN_INVALID_ARGS;
|
return CPATH_JOIN_INVALID_ARGS;
|
||||||
}
|
}
|
||||||
@ -28,14 +28,14 @@ u32 wapp_cpath_join_path(Str8 *dst, const DBL_LIST(Str8) *parts) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Handle first node
|
// Handle first node
|
||||||
const DBL_NODE(Str8) *first_node = wapp_dbl_list_get(Str8, parts, 0);
|
const Str8Node *first_node = wapp_str8_list_get(parts, 0);
|
||||||
wapp_str8_copy_str8_capped(dst, first_node->item);
|
wapp_str8_copy_str8_capped(dst, first_node->item);
|
||||||
|
|
||||||
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
||||||
// MSVC Spectre mitigation warnings
|
// MSVC Spectre mitigation warnings
|
||||||
const DBL_NODE(Str8) *node = first_node;
|
const Str8Node *node = first_node;
|
||||||
u64 node_index = 1;
|
u64 node_index = 1;
|
||||||
bool running = true;
|
bool running = node_index < parts->node_count;
|
||||||
while (running && node->next) {
|
while (running && node->next) {
|
||||||
node = node->next;
|
node = node->next;
|
||||||
if (node->item->size == 0) {
|
if (node->item->size == 0) {
|
||||||
@ -91,7 +91,7 @@ Str8 *dirup(const Allocator *allocator, Str8RO *path, u64 levels) {
|
|||||||
goto RETURN_DIRUP;
|
goto RETURN_DIRUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
DBL_LIST(Str8) *parts = wapp_str8_split(&tmp_arena, path, &separator);
|
Str8List *parts = wapp_str8_split(&tmp_arena, path, &separator);
|
||||||
if (!parts) {
|
if (!parts) {
|
||||||
goto RETURN_DIRUP;
|
goto RETURN_DIRUP;
|
||||||
}
|
}
|
||||||
@ -105,7 +105,7 @@ Str8 *dirup(const Allocator *allocator, Str8RO *path, u64 levels) {
|
|||||||
wapp_str8_push_back(output, absolute ? PATH_SEP : '.');
|
wapp_str8_push_back(output, absolute ? PATH_SEP : '.');
|
||||||
} else {
|
} else {
|
||||||
for (u64 i = 0; i < levels; ++i) {
|
for (u64 i = 0; i < levels; ++i) {
|
||||||
wapp_dbl_list_pop_back(Str8, parts);
|
wapp_str8_list_pop_back(parts);
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 alignment = sizeof(void *) * 2;
|
u64 alignment = sizeof(void *) * 2;
|
||||||
|
@ -3,12 +3,8 @@
|
|||||||
|
|
||||||
#include "../../../common/aliases/aliases.h"
|
#include "../../../common/aliases/aliases.h"
|
||||||
#include "../../../common/platform/platform.h"
|
#include "../../../common/platform/platform.h"
|
||||||
#include "../../mem/allocator/mem_allocator.h"
|
#include "../../../primitives/mem_allocator/mem_allocator.h"
|
||||||
#include "../../strings/str8/str8.h"
|
#include "../../../primitives/strings/str8/str8.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_POSIX
|
#ifdef WAPP_PLATFORM_POSIX
|
||||||
#define PATH_SEP '/'
|
#define PATH_SEP '/'
|
||||||
@ -28,11 +24,7 @@ enum {
|
|||||||
CPATH_JOIN_INSUFFICIENT_DST_CAPACITY,
|
CPATH_JOIN_INSUFFICIENT_DST_CAPACITY,
|
||||||
};
|
};
|
||||||
|
|
||||||
u32 wapp_cpath_join_path(Str8 *dst, const DBL_LIST(Str8) *parts);
|
u32 wapp_cpath_join_path(Str8 *dst, const Str8List *parts);
|
||||||
Str8 *dirup(const Allocator *allocator, Str8RO *path, u64 levels);
|
Str8 *dirup(const Allocator *allocator, Str8RO *path, u64 levels);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !CPATH_H
|
#endif // !CPATH_H
|
||||||
|
@ -4,10 +4,6 @@
|
|||||||
#include "../../../common/aliases/aliases.h"
|
#include "../../../common/aliases/aliases.h"
|
||||||
#include "../../../common/platform/platform.h"
|
#include "../../../common/platform/platform.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#include "mem_os_ops.h"
|
#include "mem_os_ops.h"
|
||||||
|
|
||||||
#if defined(WAPP_PLATFORM_WINDOWS)
|
#if defined(WAPP_PLATFORM_WINDOWS)
|
||||||
@ -18,15 +14,10 @@ BEGIN_C_LINKAGE
|
|||||||
#error "Unrecognised platform"
|
#error "Unrecognised platform"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void *wapp_mem_util_align_forward(void *ptr, u64 alignment);
|
|
||||||
void *wapp_mem_util_alloc(void *addr, u64 size, MemAccess access, MemAllocFlags flags, MemInitType type);
|
void *wapp_mem_util_alloc(void *addr, u64 size, MemAccess access, MemAllocFlags flags, MemInitType type);
|
||||||
void wapp_mem_util_free(void *ptr, u64 size);
|
void wapp_mem_util_free(void *ptr, u64 size);
|
||||||
|
|
||||||
external void *mem_util_allocate(void *addr, u64 size, MemAccess access, MemAllocFlags flags, MemInitType type);
|
external void *mem_util_allocate(void *addr, u64 size, MemAccess access, MemAllocFlags flags, MemInitType type);
|
||||||
external void mem_util_free(void *ptr, u64 size);
|
external void mem_util_free(void *ptr, u64 size);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !MEM_OS_H
|
#endif // !MEM_OS_H
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
#ifndef MEM_OS_OPS_H
|
#ifndef MEM_OS_OPS_H
|
||||||
#define MEM_OS_OPS_H
|
#define MEM_OS_OPS_H
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#include "../../../common/platform/platform.h"
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
typedef enum mem_access {
|
typedef enum mem_access {
|
||||||
WAPP_MEM_ACCESS_NONE,
|
WAPP_MEM_ACCESS_NONE,
|
||||||
@ -19,8 +17,4 @@ typedef enum mem_init_type {
|
|||||||
WAPP_MEM_INIT_INITIALISED,
|
WAPP_MEM_INIT_INITIALISED,
|
||||||
} MemInitType;
|
} MemInitType;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !MEM_OS_OPS_H
|
#endif // !MEM_OS_OPS_H
|
||||||
|
@ -3,10 +3,6 @@
|
|||||||
|
|
||||||
#include "../../../../common/platform/platform.h"
|
#include "../../../../common/platform/platform.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // !__cplusplus
|
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_POSIX
|
#ifdef WAPP_PLATFORM_POSIX
|
||||||
|
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
@ -26,8 +22,4 @@ typedef enum mem_alloc_flags {
|
|||||||
|
|
||||||
#endif // !WAPP_PLATFORM_POSIX
|
#endif // !WAPP_PLATFORM_POSIX
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // !__cplusplus
|
|
||||||
|
|
||||||
#endif // !MEM_OS_POSIX_H
|
#endif // !MEM_OS_POSIX_H
|
||||||
|
@ -3,10 +3,6 @@
|
|||||||
|
|
||||||
#include "../../../../common/platform/platform.h"
|
#include "../../../../common/platform/platform.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // !__cplusplus
|
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_WINDOWS
|
#ifdef WAPP_PLATFORM_WINDOWS
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
@ -20,8 +16,4 @@ typedef enum mem_alloc_flags {
|
|||||||
|
|
||||||
#endif // !WAPP_PLATFORM_WINDOWS
|
#endif // !WAPP_PLATFORM_WINDOWS
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // !__cplusplus
|
|
||||||
|
|
||||||
#endif // !MEM_OS_WIN_H
|
#endif // !MEM_OS_WIN_H
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
#include "commander.h"
|
#include "commander.h"
|
||||||
#include "commander_output.h"
|
#include "commander_output.h"
|
||||||
#include "../utils/shell_utils.h"
|
#include "../utils/shell_utils.h"
|
||||||
#include "../../../mem/allocator/mem_allocator.h"
|
|
||||||
#include "../../../mem/arena/mem_arena_allocator.h"
|
#include "../../../mem/arena/mem_arena_allocator.h"
|
||||||
#include "../../../strings/str8/str8.h"
|
|
||||||
#include "../../../../common/aliases/aliases.h"
|
#include "../../../../common/aliases/aliases.h"
|
||||||
#include "../../../../common/misc/misc_utils.h"
|
#include "../../../../common/misc/misc_utils.h"
|
||||||
|
#include "../../../../primitives/dbl_list/dbl_list.h"
|
||||||
|
#include "../../../../primitives/mem_allocator/mem_allocator.h"
|
||||||
|
#include "../../../../primitives/strings/str8/str8.h"
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -18,7 +19,7 @@
|
|||||||
internal inline CMDResult execute_command(Str8RO *cmd, CMDOutHandling out_handling, Str8 *out_buf);
|
internal inline CMDResult execute_command(Str8RO *cmd, CMDOutHandling out_handling, Str8 *out_buf);
|
||||||
internal inline CMDError get_command_output(FILE *fp, CMDOutHandling out_handling, Str8 *out_buf);
|
internal inline CMDError get_command_output(FILE *fp, CMDOutHandling out_handling, Str8 *out_buf);
|
||||||
|
|
||||||
CMDResult wapp_shell_commander_execute(CMDOutHandling out_handling, Str8 *out_buf, const DBL_LIST(Str8) *cmd) {
|
CMDResult wapp_shell_commander_execute(CMDOutHandling out_handling, Str8 *out_buf, const Str8List *cmd) {
|
||||||
if (!cmd) {
|
if (!cmd) {
|
||||||
return CMD_NO_EXIT(SHELL_ERR_INVALID_ARGS);
|
return CMD_NO_EXIT(SHELL_ERR_INVALID_ARGS);
|
||||||
}
|
}
|
||||||
|
@ -3,23 +3,16 @@
|
|||||||
|
|
||||||
#include "commander_output.h"
|
#include "commander_output.h"
|
||||||
#include "../../../../common/aliases/aliases.h"
|
#include "../../../../common/aliases/aliases.h"
|
||||||
#include "../../../strings/str8/str8.h"
|
#include "../../../../common/platform/platform.h"
|
||||||
|
#include "../../../../primitives/strings/str8/str8.h"
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#define CMD_NO_EXIT(ERR) ((CMDResult){.exited = false, .exit_code = EXIT_FAILURE, .error = ERR})
|
#define CMD_NO_EXIT(ERR) ((CMDResult){.exited = false, .exit_code = EXIT_FAILURE, .error = ERR})
|
||||||
|
|
||||||
CMDResult wapp_shell_commander_execute(CMDOutHandling out_handling, Str8 *out_buf, const DBL_LIST(Str8) *cmd);
|
CMDResult wapp_shell_commander_execute(CMDOutHandling out_handling, Str8 *out_buf, const Str8List *cmd);
|
||||||
|
|
||||||
external CMDError get_output_status(FILE *fp, i32 *status_out);
|
external CMDError get_output_status(FILE *fp, i32 *status_out);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !COMMANDER_H
|
#endif // !COMMANDER_H
|
||||||
|
@ -5,10 +5,6 @@
|
|||||||
#include "../../../../common/platform/platform.h"
|
#include "../../../../common/platform/platform.h"
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SHELL_OUTPUT_DISCARD,
|
SHELL_OUTPUT_DISCARD,
|
||||||
SHELL_OUTPUT_PRINT,
|
SHELL_OUTPUT_PRINT,
|
||||||
@ -31,13 +27,9 @@ struct commander_result {
|
|||||||
bool exited;
|
bool exited;
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_WINDOWS
|
#ifdef WAPP_PLATFORM_WINDOWS
|
||||||
#include "misc_utils.h"
|
#include "../../../../common/misc/misc_utils.h"
|
||||||
wapp_misc_utils_padding_size(sizeof(bool) + sizeof(i32) + sizeof(CMDError));
|
wapp_misc_utils_padding_size(sizeof(bool) + sizeof(i32) + sizeof(CMDError));
|
||||||
#endif // !WAPP_PLATFORM_WINDOWS
|
#endif // !WAPP_PLATFORM_WINDOWS
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !COMMANDER_OUTPUT_H
|
#endif // !COMMANDER_OUTPUT_H
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#include "../../../../../common/aliases/aliases.h"
|
#include "../../../../../common/aliases/aliases.h"
|
||||||
#include "../../../../../common/platform/platform.h"
|
#include "../../../../../common/platform/platform.h"
|
||||||
#include "../../../../strings/str8/str8.h"
|
#include "../../../../../primitives/strings/str8/str8.h"
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_POSIX
|
#ifdef WAPP_PLATFORM_POSIX
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#include "termcolour.h"
|
#include "termcolour.h"
|
||||||
#include "terminal_colours.h"
|
#include "terminal_colours.h"
|
||||||
#include "../../../strings/str8/str8.h"
|
#include "../../../../primitives/strings/str8/str8.h"
|
||||||
|
|
||||||
void wapp_shell_termcolour_print_text(Str8RO *text, TerminalColour colour) {
|
void wapp_shell_termcolour_print_text(Str8RO *text, TerminalColour colour) {
|
||||||
if (colour < WAPP_TERM_COLOUR_FG_BLACK || colour > WAPP_TERM_COLOUR_FG_BR_WHITE) {
|
if (colour < WAPP_TERM_COLOUR_FG_BLACK || colour > WAPP_TERM_COLOUR_FG_BR_WHITE) {
|
||||||
|
@ -3,19 +3,12 @@
|
|||||||
|
|
||||||
#include "terminal_colours.h"
|
#include "terminal_colours.h"
|
||||||
#include "../../../../common/aliases/aliases.h"
|
#include "../../../../common/aliases/aliases.h"
|
||||||
#include "../../../strings/str8/str8.h"
|
#include "../../../../common/platform/platform.h"
|
||||||
|
#include "../../../../primitives/strings/str8/str8.h"
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
void wapp_shell_termcolour_print_text(Str8RO *text, TerminalColour colour);
|
void wapp_shell_termcolour_print_text(Str8RO *text, TerminalColour colour);
|
||||||
void wapp_shell_termcolour_clear_colour(void);
|
void wapp_shell_termcolour_clear_colour(void);
|
||||||
|
|
||||||
external void print_coloured_text(Str8RO *text, TerminalColour colour);
|
external void print_coloured_text(Str8RO *text, TerminalColour colour);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !TERM_COLOUR_H
|
#endif // !TERM_COLOUR_H
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
#ifndef TERMINAL_COLOURS_H
|
#ifndef TERMINAL_COLOURS_H
|
||||||
#define TERMINAL_COLOURS_H
|
#define TERMINAL_COLOURS_H
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#include "../../../../common/platform/platform.h"
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
WAPP_TERM_COLOUR_FG_BLACK,
|
WAPP_TERM_COLOUR_FG_BLACK,
|
||||||
@ -27,8 +25,4 @@ typedef enum {
|
|||||||
COUNT_TERM_COLOUR,
|
COUNT_TERM_COLOUR,
|
||||||
} TerminalColour;
|
} TerminalColour;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !TERMINAL_COLOURS_H
|
#endif // !TERMINAL_COLOURS_H
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#include "../../../../../common/aliases/aliases.h"
|
#include "../../../../../common/aliases/aliases.h"
|
||||||
#include "../../../../../common/platform/platform.h"
|
#include "../../../../../common/platform/platform.h"
|
||||||
#include "../../../../strings/str8/str8.h"
|
#include "../../../../../primitives/strings/str8/str8.h"
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_WINDOWS
|
#ifdef WAPP_PLATFORM_WINDOWS
|
||||||
|
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
#include "./str8_list.h"
|
|
||||||
#include "./str8.h"
|
|
||||||
#include "../../../common/aliases/aliases.h"
|
|
||||||
#include "../../../containers/dbl_list/dbl_list.h"
|
|
||||||
|
|
||||||
u64 wapp_str8_list_total_size(const DBL_LIST(Str8) *list) {
|
|
||||||
if (!list) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
u64 output = 0;
|
|
||||||
for (u64 i = 0; i < list->node_count; ++i) {
|
|
||||||
DBL_NODE(Str8) *node = wapp_dbl_list_get(Str8, list, i);
|
|
||||||
output += node->item->size;
|
|
||||||
}
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
/**
|
|
||||||
* THIS FILE IS AUTOMATICALLY GENERATED. ANY MODIFICATIONS TO IT WILL BE OVERWRITTEN
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef STR8_LIST_H
|
|
||||||
#define STR8_LIST_H
|
|
||||||
|
|
||||||
#include "../../../common/aliases/aliases.h"
|
|
||||||
#include "../../../containers/dbl_list/dbl_list.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // !__cplusplus
|
|
||||||
|
|
||||||
typedef struct str8 Str8;
|
|
||||||
|
|
||||||
DBL_LIST_DECL(Str8);
|
|
||||||
|
|
||||||
u64 wapp_str8_list_total_size(const DBL_LIST(Str8) *list);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // !__cplusplus
|
|
||||||
|
|
||||||
#endif // !STR8_LIST_H
|
|
@ -2,8 +2,6 @@
|
|||||||
#define WAPP_CORE_C
|
#define WAPP_CORE_C
|
||||||
|
|
||||||
#include "wapp_core.h"
|
#include "wapp_core.h"
|
||||||
#include "strings/str8/str8.c"
|
|
||||||
#include "strings/str8/str8_list.c"
|
|
||||||
#include "os/shell/termcolour/posix/termcolour_posix.c"
|
#include "os/shell/termcolour/posix/termcolour_posix.c"
|
||||||
#include "os/shell/termcolour/win/termcolour_win.c"
|
#include "os/shell/termcolour/win/termcolour_win.c"
|
||||||
#include "os/shell/termcolour/termcolour.c"
|
#include "os/shell/termcolour/termcolour.c"
|
||||||
@ -15,8 +13,8 @@
|
|||||||
#include "os/mem/win/mem_os_win.c"
|
#include "os/mem/win/mem_os_win.c"
|
||||||
#include "os/mem/mem_os.c"
|
#include "os/mem/mem_os.c"
|
||||||
#include "mem/utils/mem_utils.c"
|
#include "mem/utils/mem_utils.c"
|
||||||
#include "mem/allocator/mem_allocator.c"
|
|
||||||
#include "mem/arena/mem_arena.c"
|
#include "mem/arena/mem_arena.c"
|
||||||
#include "mem/arena/mem_arena_allocator.c"
|
#include "mem/arena/mem_arena_allocator.c"
|
||||||
|
#include "../primitives/wapp_primitives.c"
|
||||||
|
|
||||||
#endif // !WAPP_CORE_C
|
#endif // !WAPP_CORE_C
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
#ifndef WAPP_CORE_H
|
#ifndef WAPP_CORE_H
|
||||||
#define WAPP_CORE_H
|
#define WAPP_CORE_H
|
||||||
|
|
||||||
#include "strings/str8/str8.h"
|
|
||||||
#include "strings/str8/str8_list.h"
|
|
||||||
#include "os/shell/termcolour/termcolour.h"
|
#include "os/shell/termcolour/termcolour.h"
|
||||||
#include "os/shell/termcolour/terminal_colours.h"
|
#include "os/shell/termcolour/terminal_colours.h"
|
||||||
#include "os/shell/commander/commander.h"
|
#include "os/shell/commander/commander.h"
|
||||||
@ -14,9 +12,9 @@
|
|||||||
#include "os/mem/mem_os_ops.h"
|
#include "os/mem/mem_os_ops.h"
|
||||||
#include "os/mem/mem_os.h"
|
#include "os/mem/mem_os.h"
|
||||||
#include "mem/utils/mem_utils.h"
|
#include "mem/utils/mem_utils.h"
|
||||||
#include "mem/allocator/mem_allocator.h"
|
|
||||||
#include "mem/arena/mem_arena_allocator.h"
|
#include "mem/arena/mem_arena_allocator.h"
|
||||||
#include "mem/arena/mem_arena.h"
|
#include "mem/arena/mem_arena.h"
|
||||||
#include "../common/wapp_common.h"
|
#include "../common/wapp_common.h"
|
||||||
|
#include "../primitives/wapp_primitives.h"
|
||||||
|
|
||||||
#endif // !WAPP_CORE_H
|
#endif // !WAPP_CORE_H
|
||||||
|
2971
src/primitives/array/array.c
Normal file
2971
src/primitives/array/array.c
Normal file
File diff suppressed because it is too large
Load Diff
619
src/primitives/array/array.h
Normal file
619
src/primitives/array/array.h
Normal file
@ -0,0 +1,619 @@
|
|||||||
|
/**
|
||||||
|
* THIS FILE IS AUTOMATICALLY GENERATED. ANY MODIFICATIONS TO IT WILL BE OVERWRITTEN
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ARRAY_H
|
||||||
|
#define ARRAY_H
|
||||||
|
|
||||||
|
#include "../mem_allocator/mem_allocator.h"
|
||||||
|
#include "../../common/misc/misc_utils.h"
|
||||||
|
#include "../../common/aliases/aliases.h"
|
||||||
|
#include "../../common/platform/platform.h"
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#define wapp_str8_array(...) ((Str8Array){ \
|
||||||
|
.items = (Str8[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(Str8, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(Str8, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(Str8, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(Str8) \
|
||||||
|
})
|
||||||
|
#define wapp_str8_array_with_capacity(CAPACITY) ((Str8Array){.items = (Str8[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(Str8)})
|
||||||
|
#define wapp_str8_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((Str8Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(Str8)))
|
||||||
|
#define wapp_str8_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_str8_array_pop(ARRAY_PTR) : \
|
||||||
|
(Str8){0} \
|
||||||
|
)
|
||||||
|
#define wapp_void_ptr_array(...) ((VoidPArray){ \
|
||||||
|
.items = (void *[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(void *, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(void *, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(void *, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(void *) \
|
||||||
|
})
|
||||||
|
#define wapp_void_ptr_array_with_capacity(CAPACITY) ((VoidPArray){.items = (void *[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(void *)})
|
||||||
|
#define wapp_void_ptr_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((VoidPArray *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(void *)))
|
||||||
|
#define wapp_void_ptr_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_void_ptr_array_pop(ARRAY_PTR) : \
|
||||||
|
(void *){0} \
|
||||||
|
)
|
||||||
|
#define wapp_bool_array(...) ((BoolArray){ \
|
||||||
|
.items = (bool[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(bool, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(bool, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(bool, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(bool) \
|
||||||
|
})
|
||||||
|
#define wapp_bool_array_with_capacity(CAPACITY) ((BoolArray){.items = (bool[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(bool)})
|
||||||
|
#define wapp_bool_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((BoolArray *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(bool)))
|
||||||
|
#define wapp_bool_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_bool_array_pop(ARRAY_PTR) : \
|
||||||
|
(bool){0} \
|
||||||
|
)
|
||||||
|
#define wapp_char_array(...) ((CharArray){ \
|
||||||
|
.items = (char[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(char, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(char, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(char, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(char) \
|
||||||
|
})
|
||||||
|
#define wapp_char_array_with_capacity(CAPACITY) ((CharArray){.items = (char[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(char)})
|
||||||
|
#define wapp_char_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((CharArray *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(char)))
|
||||||
|
#define wapp_char_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_char_array_pop(ARRAY_PTR) : \
|
||||||
|
(char){0} \
|
||||||
|
)
|
||||||
|
#define wapp_c8_array(...) ((C8Array){ \
|
||||||
|
.items = (c8[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(c8, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(c8, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(c8, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(c8) \
|
||||||
|
})
|
||||||
|
#define wapp_c8_array_with_capacity(CAPACITY) ((C8Array){.items = (c8[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(c8)})
|
||||||
|
#define wapp_c8_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((C8Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(c8)))
|
||||||
|
#define wapp_c8_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_c8_array_pop(ARRAY_PTR) : \
|
||||||
|
(c8){0} \
|
||||||
|
)
|
||||||
|
#define wapp_c16_array(...) ((C16Array){ \
|
||||||
|
.items = (c16[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(c16, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(c16, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(c16, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(c16) \
|
||||||
|
})
|
||||||
|
#define wapp_c16_array_with_capacity(CAPACITY) ((C16Array){.items = (c16[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(c16)})
|
||||||
|
#define wapp_c16_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((C16Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(c16)))
|
||||||
|
#define wapp_c16_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_c16_array_pop(ARRAY_PTR) : \
|
||||||
|
(c16){0} \
|
||||||
|
)
|
||||||
|
#define wapp_c32_array(...) ((C32Array){ \
|
||||||
|
.items = (c32[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(c32, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(c32, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(c32, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(c32) \
|
||||||
|
})
|
||||||
|
#define wapp_c32_array_with_capacity(CAPACITY) ((C32Array){.items = (c32[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(c32)})
|
||||||
|
#define wapp_c32_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((C32Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(c32)))
|
||||||
|
#define wapp_c32_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_c32_array_pop(ARRAY_PTR) : \
|
||||||
|
(c32){0} \
|
||||||
|
)
|
||||||
|
#define wapp_i8_array(...) ((I8Array){ \
|
||||||
|
.items = (i8[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(i8, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(i8, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(i8, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(i8) \
|
||||||
|
})
|
||||||
|
#define wapp_i8_array_with_capacity(CAPACITY) ((I8Array){.items = (i8[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(i8)})
|
||||||
|
#define wapp_i8_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((I8Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(i8)))
|
||||||
|
#define wapp_i8_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_i8_array_pop(ARRAY_PTR) : \
|
||||||
|
(i8){0} \
|
||||||
|
)
|
||||||
|
#define wapp_i16_array(...) ((I16Array){ \
|
||||||
|
.items = (i16[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(i16, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(i16, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(i16, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(i16) \
|
||||||
|
})
|
||||||
|
#define wapp_i16_array_with_capacity(CAPACITY) ((I16Array){.items = (i16[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(i16)})
|
||||||
|
#define wapp_i16_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((I16Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(i16)))
|
||||||
|
#define wapp_i16_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_i16_array_pop(ARRAY_PTR) : \
|
||||||
|
(i16){0} \
|
||||||
|
)
|
||||||
|
#define wapp_i32_array(...) ((I32Array){ \
|
||||||
|
.items = (i32[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(i32, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(i32, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(i32, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(i32) \
|
||||||
|
})
|
||||||
|
#define wapp_i32_array_with_capacity(CAPACITY) ((I32Array){.items = (i32[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(i32)})
|
||||||
|
#define wapp_i32_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((I32Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(i32)))
|
||||||
|
#define wapp_i32_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_i32_array_pop(ARRAY_PTR) : \
|
||||||
|
(i32){0} \
|
||||||
|
)
|
||||||
|
#define wapp_i64_array(...) ((I64Array){ \
|
||||||
|
.items = (i64[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(i64, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(i64, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(i64, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(i64) \
|
||||||
|
})
|
||||||
|
#define wapp_i64_array_with_capacity(CAPACITY) ((I64Array){.items = (i64[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(i64)})
|
||||||
|
#define wapp_i64_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((I64Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(i64)))
|
||||||
|
#define wapp_i64_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_i64_array_pop(ARRAY_PTR) : \
|
||||||
|
(i64){0} \
|
||||||
|
)
|
||||||
|
#define wapp_u8_array(...) ((U8Array){ \
|
||||||
|
.items = (u8[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(u8, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(u8, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(u8, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(u8) \
|
||||||
|
})
|
||||||
|
#define wapp_u8_array_with_capacity(CAPACITY) ((U8Array){.items = (u8[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(u8)})
|
||||||
|
#define wapp_u8_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((U8Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(u8)))
|
||||||
|
#define wapp_u8_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_u8_array_pop(ARRAY_PTR) : \
|
||||||
|
(u8){0} \
|
||||||
|
)
|
||||||
|
#define wapp_u16_array(...) ((U16Array){ \
|
||||||
|
.items = (u16[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(u16, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(u16, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(u16, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(u16) \
|
||||||
|
})
|
||||||
|
#define wapp_u16_array_with_capacity(CAPACITY) ((U16Array){.items = (u16[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(u16)})
|
||||||
|
#define wapp_u16_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((U16Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(u16)))
|
||||||
|
#define wapp_u16_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_u16_array_pop(ARRAY_PTR) : \
|
||||||
|
(u16){0} \
|
||||||
|
)
|
||||||
|
#define wapp_u32_array(...) ((U32Array){ \
|
||||||
|
.items = (u32[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(u32, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(u32, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(u32, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(u32) \
|
||||||
|
})
|
||||||
|
#define wapp_u32_array_with_capacity(CAPACITY) ((U32Array){.items = (u32[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(u32)})
|
||||||
|
#define wapp_u32_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((U32Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(u32)))
|
||||||
|
#define wapp_u32_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_u32_array_pop(ARRAY_PTR) : \
|
||||||
|
(u32){0} \
|
||||||
|
)
|
||||||
|
#define wapp_u64_array(...) ((U64Array){ \
|
||||||
|
.items = (u64[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(u64, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(u64, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(u64, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(u64) \
|
||||||
|
})
|
||||||
|
#define wapp_u64_array_with_capacity(CAPACITY) ((U64Array){.items = (u64[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(u64)})
|
||||||
|
#define wapp_u64_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((U64Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(u64)))
|
||||||
|
#define wapp_u64_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_u64_array_pop(ARRAY_PTR) : \
|
||||||
|
(u64){0} \
|
||||||
|
)
|
||||||
|
#define wapp_f32_array(...) ((F32Array){ \
|
||||||
|
.items = (f32[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(f32, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(f32, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(f32, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(f32) \
|
||||||
|
})
|
||||||
|
#define wapp_f32_array_with_capacity(CAPACITY) ((F32Array){.items = (f32[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(f32)})
|
||||||
|
#define wapp_f32_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((F32Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(f32)))
|
||||||
|
#define wapp_f32_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_f32_array_pop(ARRAY_PTR) : \
|
||||||
|
(f32){0} \
|
||||||
|
)
|
||||||
|
#define wapp_f64_array(...) ((F64Array){ \
|
||||||
|
.items = (f64[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(f64, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(f64, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(f64, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(f64) \
|
||||||
|
})
|
||||||
|
#define wapp_f64_array_with_capacity(CAPACITY) ((F64Array){.items = (f64[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(f64)})
|
||||||
|
#define wapp_f64_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((F64Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(f64)))
|
||||||
|
#define wapp_f64_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_f64_array_pop(ARRAY_PTR) : \
|
||||||
|
(f64){0} \
|
||||||
|
)
|
||||||
|
#define wapp_f128_array(...) ((F128Array){ \
|
||||||
|
.items = (f128[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(f128, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(f128, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(f128, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(f128) \
|
||||||
|
})
|
||||||
|
#define wapp_f128_array_with_capacity(CAPACITY) ((F128Array){.items = (f128[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(f128)})
|
||||||
|
#define wapp_f128_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((F128Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(f128)))
|
||||||
|
#define wapp_f128_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_f128_array_pop(ARRAY_PTR) : \
|
||||||
|
(f128){0} \
|
||||||
|
)
|
||||||
|
#define wapp_iptr_array(...) ((IptrArray){ \
|
||||||
|
.items = (iptr[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(iptr, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(iptr, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(iptr, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(iptr) \
|
||||||
|
})
|
||||||
|
#define wapp_iptr_array_with_capacity(CAPACITY) ((IptrArray){.items = (iptr[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(iptr)})
|
||||||
|
#define wapp_iptr_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((IptrArray *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(iptr)))
|
||||||
|
#define wapp_iptr_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_iptr_array_pop(ARRAY_PTR) : \
|
||||||
|
(iptr){0} \
|
||||||
|
)
|
||||||
|
#define wapp_uptr_array(...) ((UptrArray){ \
|
||||||
|
.items = (uptr[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(uptr, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(uptr, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(uptr, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(uptr) \
|
||||||
|
})
|
||||||
|
#define wapp_uptr_array_with_capacity(CAPACITY) ((UptrArray){.items = (uptr[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(uptr)})
|
||||||
|
#define wapp_uptr_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((UptrArray *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(uptr)))
|
||||||
|
#define wapp_uptr_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_uptr_array_pop(ARRAY_PTR) : \
|
||||||
|
(uptr){0} \
|
||||||
|
)
|
||||||
|
|
||||||
|
typedef struct str8 Str8;
|
||||||
|
|
||||||
|
typedef struct Str8Array Str8Array;
|
||||||
|
struct Str8Array {
|
||||||
|
Str8 *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct VoidPArray VoidPArray;
|
||||||
|
struct VoidPArray {
|
||||||
|
void * *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct BoolArray BoolArray;
|
||||||
|
struct BoolArray {
|
||||||
|
bool *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CharArray CharArray;
|
||||||
|
struct CharArray {
|
||||||
|
char *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct C8Array C8Array;
|
||||||
|
struct C8Array {
|
||||||
|
c8 *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct C16Array C16Array;
|
||||||
|
struct C16Array {
|
||||||
|
c16 *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct C32Array C32Array;
|
||||||
|
struct C32Array {
|
||||||
|
c32 *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct I8Array I8Array;
|
||||||
|
struct I8Array {
|
||||||
|
i8 *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct I16Array I16Array;
|
||||||
|
struct I16Array {
|
||||||
|
i16 *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct I32Array I32Array;
|
||||||
|
struct I32Array {
|
||||||
|
i32 *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct I64Array I64Array;
|
||||||
|
struct I64Array {
|
||||||
|
i64 *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct U8Array U8Array;
|
||||||
|
struct U8Array {
|
||||||
|
u8 *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct U16Array U16Array;
|
||||||
|
struct U16Array {
|
||||||
|
u16 *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct U32Array U32Array;
|
||||||
|
struct U32Array {
|
||||||
|
u32 *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct U64Array U64Array;
|
||||||
|
struct U64Array {
|
||||||
|
u64 *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct F32Array F32Array;
|
||||||
|
struct F32Array {
|
||||||
|
f32 *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct F64Array F64Array;
|
||||||
|
struct F64Array {
|
||||||
|
f64 *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct F128Array F128Array;
|
||||||
|
struct F128Array {
|
||||||
|
f128 *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct IptrArray IptrArray;
|
||||||
|
struct IptrArray {
|
||||||
|
iptr *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct UptrArray UptrArray;
|
||||||
|
struct UptrArray {
|
||||||
|
uptr *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
Str8 *wapp_str8_array_get(const Str8Array *array, u64 index);
|
||||||
|
void wapp_str8_array_set(Str8Array *array, u64 index, Str8 *item);
|
||||||
|
void wapp_str8_array_append_capped(Str8Array *array, Str8 *item);
|
||||||
|
void wapp_str8_array_extend_capped(Str8Array *array, const Str8Array *other);
|
||||||
|
void wapp_str8_array_clear(Str8Array *array);
|
||||||
|
void wapp_str8_array_copy_capped(const Str8Array *src, Str8Array *dst);
|
||||||
|
Str8Array *wapp_str8_array_append_alloc(const Allocator *allocator, Str8Array *array, Str8 *item);
|
||||||
|
Str8Array *wapp_str8_array_extend_alloc(const Allocator *allocator, Str8Array *array, const Str8Array *other);
|
||||||
|
Str8Array *wapp_str8_array_copy_alloc(const Allocator *allocator, const Str8Array *src, Str8Array *dst);
|
||||||
|
Str8 *_str8_array_pop(Str8Array *array);
|
||||||
|
void * *wapp_void_ptr_array_get(const VoidPArray *array, u64 index);
|
||||||
|
void wapp_void_ptr_array_set(VoidPArray *array, u64 index, void * *item);
|
||||||
|
void wapp_void_ptr_array_append_capped(VoidPArray *array, void * *item);
|
||||||
|
void wapp_void_ptr_array_extend_capped(VoidPArray *array, const VoidPArray *other);
|
||||||
|
void wapp_void_ptr_array_clear(VoidPArray *array);
|
||||||
|
void wapp_void_ptr_array_copy_capped(const VoidPArray *src, VoidPArray *dst);
|
||||||
|
VoidPArray *wapp_void_ptr_array_append_alloc(const Allocator *allocator, VoidPArray *array, void * *item);
|
||||||
|
VoidPArray *wapp_void_ptr_array_extend_alloc(const Allocator *allocator, VoidPArray *array, const VoidPArray *other);
|
||||||
|
VoidPArray *wapp_void_ptr_array_copy_alloc(const Allocator *allocator, const VoidPArray *src, VoidPArray *dst);
|
||||||
|
void * *_void_ptr_array_pop(VoidPArray *array);
|
||||||
|
bool *wapp_bool_array_get(const BoolArray *array, u64 index);
|
||||||
|
void wapp_bool_array_set(BoolArray *array, u64 index, bool *item);
|
||||||
|
void wapp_bool_array_append_capped(BoolArray *array, bool *item);
|
||||||
|
void wapp_bool_array_extend_capped(BoolArray *array, const BoolArray *other);
|
||||||
|
void wapp_bool_array_clear(BoolArray *array);
|
||||||
|
void wapp_bool_array_copy_capped(const BoolArray *src, BoolArray *dst);
|
||||||
|
BoolArray *wapp_bool_array_append_alloc(const Allocator *allocator, BoolArray *array, bool *item);
|
||||||
|
BoolArray *wapp_bool_array_extend_alloc(const Allocator *allocator, BoolArray *array, const BoolArray *other);
|
||||||
|
BoolArray *wapp_bool_array_copy_alloc(const Allocator *allocator, const BoolArray *src, BoolArray *dst);
|
||||||
|
bool *_bool_array_pop(BoolArray *array);
|
||||||
|
char *wapp_char_array_get(const CharArray *array, u64 index);
|
||||||
|
void wapp_char_array_set(CharArray *array, u64 index, char *item);
|
||||||
|
void wapp_char_array_append_capped(CharArray *array, char *item);
|
||||||
|
void wapp_char_array_extend_capped(CharArray *array, const CharArray *other);
|
||||||
|
void wapp_char_array_clear(CharArray *array);
|
||||||
|
void wapp_char_array_copy_capped(const CharArray *src, CharArray *dst);
|
||||||
|
CharArray *wapp_char_array_append_alloc(const Allocator *allocator, CharArray *array, char *item);
|
||||||
|
CharArray *wapp_char_array_extend_alloc(const Allocator *allocator, CharArray *array, const CharArray *other);
|
||||||
|
CharArray *wapp_char_array_copy_alloc(const Allocator *allocator, const CharArray *src, CharArray *dst);
|
||||||
|
char *_char_array_pop(CharArray *array);
|
||||||
|
c8 *wapp_c8_array_get(const C8Array *array, u64 index);
|
||||||
|
void wapp_c8_array_set(C8Array *array, u64 index, c8 *item);
|
||||||
|
void wapp_c8_array_append_capped(C8Array *array, c8 *item);
|
||||||
|
void wapp_c8_array_extend_capped(C8Array *array, const C8Array *other);
|
||||||
|
void wapp_c8_array_clear(C8Array *array);
|
||||||
|
void wapp_c8_array_copy_capped(const C8Array *src, C8Array *dst);
|
||||||
|
C8Array *wapp_c8_array_append_alloc(const Allocator *allocator, C8Array *array, c8 *item);
|
||||||
|
C8Array *wapp_c8_array_extend_alloc(const Allocator *allocator, C8Array *array, const C8Array *other);
|
||||||
|
C8Array *wapp_c8_array_copy_alloc(const Allocator *allocator, const C8Array *src, C8Array *dst);
|
||||||
|
c8 *_c8_array_pop(C8Array *array);
|
||||||
|
c16 *wapp_c16_array_get(const C16Array *array, u64 index);
|
||||||
|
void wapp_c16_array_set(C16Array *array, u64 index, c16 *item);
|
||||||
|
void wapp_c16_array_append_capped(C16Array *array, c16 *item);
|
||||||
|
void wapp_c16_array_extend_capped(C16Array *array, const C16Array *other);
|
||||||
|
void wapp_c16_array_clear(C16Array *array);
|
||||||
|
void wapp_c16_array_copy_capped(const C16Array *src, C16Array *dst);
|
||||||
|
C16Array *wapp_c16_array_append_alloc(const Allocator *allocator, C16Array *array, c16 *item);
|
||||||
|
C16Array *wapp_c16_array_extend_alloc(const Allocator *allocator, C16Array *array, const C16Array *other);
|
||||||
|
C16Array *wapp_c16_array_copy_alloc(const Allocator *allocator, const C16Array *src, C16Array *dst);
|
||||||
|
c16 *_c16_array_pop(C16Array *array);
|
||||||
|
c32 *wapp_c32_array_get(const C32Array *array, u64 index);
|
||||||
|
void wapp_c32_array_set(C32Array *array, u64 index, c32 *item);
|
||||||
|
void wapp_c32_array_append_capped(C32Array *array, c32 *item);
|
||||||
|
void wapp_c32_array_extend_capped(C32Array *array, const C32Array *other);
|
||||||
|
void wapp_c32_array_clear(C32Array *array);
|
||||||
|
void wapp_c32_array_copy_capped(const C32Array *src, C32Array *dst);
|
||||||
|
C32Array *wapp_c32_array_append_alloc(const Allocator *allocator, C32Array *array, c32 *item);
|
||||||
|
C32Array *wapp_c32_array_extend_alloc(const Allocator *allocator, C32Array *array, const C32Array *other);
|
||||||
|
C32Array *wapp_c32_array_copy_alloc(const Allocator *allocator, const C32Array *src, C32Array *dst);
|
||||||
|
c32 *_c32_array_pop(C32Array *array);
|
||||||
|
i8 *wapp_i8_array_get(const I8Array *array, u64 index);
|
||||||
|
void wapp_i8_array_set(I8Array *array, u64 index, i8 *item);
|
||||||
|
void wapp_i8_array_append_capped(I8Array *array, i8 *item);
|
||||||
|
void wapp_i8_array_extend_capped(I8Array *array, const I8Array *other);
|
||||||
|
void wapp_i8_array_clear(I8Array *array);
|
||||||
|
void wapp_i8_array_copy_capped(const I8Array *src, I8Array *dst);
|
||||||
|
I8Array *wapp_i8_array_append_alloc(const Allocator *allocator, I8Array *array, i8 *item);
|
||||||
|
I8Array *wapp_i8_array_extend_alloc(const Allocator *allocator, I8Array *array, const I8Array *other);
|
||||||
|
I8Array *wapp_i8_array_copy_alloc(const Allocator *allocator, const I8Array *src, I8Array *dst);
|
||||||
|
i8 *_i8_array_pop(I8Array *array);
|
||||||
|
i16 *wapp_i16_array_get(const I16Array *array, u64 index);
|
||||||
|
void wapp_i16_array_set(I16Array *array, u64 index, i16 *item);
|
||||||
|
void wapp_i16_array_append_capped(I16Array *array, i16 *item);
|
||||||
|
void wapp_i16_array_extend_capped(I16Array *array, const I16Array *other);
|
||||||
|
void wapp_i16_array_clear(I16Array *array);
|
||||||
|
void wapp_i16_array_copy_capped(const I16Array *src, I16Array *dst);
|
||||||
|
I16Array *wapp_i16_array_append_alloc(const Allocator *allocator, I16Array *array, i16 *item);
|
||||||
|
I16Array *wapp_i16_array_extend_alloc(const Allocator *allocator, I16Array *array, const I16Array *other);
|
||||||
|
I16Array *wapp_i16_array_copy_alloc(const Allocator *allocator, const I16Array *src, I16Array *dst);
|
||||||
|
i16 *_i16_array_pop(I16Array *array);
|
||||||
|
i32 *wapp_i32_array_get(const I32Array *array, u64 index);
|
||||||
|
void wapp_i32_array_set(I32Array *array, u64 index, i32 *item);
|
||||||
|
void wapp_i32_array_append_capped(I32Array *array, i32 *item);
|
||||||
|
void wapp_i32_array_extend_capped(I32Array *array, const I32Array *other);
|
||||||
|
void wapp_i32_array_clear(I32Array *array);
|
||||||
|
void wapp_i32_array_copy_capped(const I32Array *src, I32Array *dst);
|
||||||
|
I32Array *wapp_i32_array_append_alloc(const Allocator *allocator, I32Array *array, i32 *item);
|
||||||
|
I32Array *wapp_i32_array_extend_alloc(const Allocator *allocator, I32Array *array, const I32Array *other);
|
||||||
|
I32Array *wapp_i32_array_copy_alloc(const Allocator *allocator, const I32Array *src, I32Array *dst);
|
||||||
|
i32 *_i32_array_pop(I32Array *array);
|
||||||
|
i64 *wapp_i64_array_get(const I64Array *array, u64 index);
|
||||||
|
void wapp_i64_array_set(I64Array *array, u64 index, i64 *item);
|
||||||
|
void wapp_i64_array_append_capped(I64Array *array, i64 *item);
|
||||||
|
void wapp_i64_array_extend_capped(I64Array *array, const I64Array *other);
|
||||||
|
void wapp_i64_array_clear(I64Array *array);
|
||||||
|
void wapp_i64_array_copy_capped(const I64Array *src, I64Array *dst);
|
||||||
|
I64Array *wapp_i64_array_append_alloc(const Allocator *allocator, I64Array *array, i64 *item);
|
||||||
|
I64Array *wapp_i64_array_extend_alloc(const Allocator *allocator, I64Array *array, const I64Array *other);
|
||||||
|
I64Array *wapp_i64_array_copy_alloc(const Allocator *allocator, const I64Array *src, I64Array *dst);
|
||||||
|
i64 *_i64_array_pop(I64Array *array);
|
||||||
|
u8 *wapp_u8_array_get(const U8Array *array, u64 index);
|
||||||
|
void wapp_u8_array_set(U8Array *array, u64 index, u8 *item);
|
||||||
|
void wapp_u8_array_append_capped(U8Array *array, u8 *item);
|
||||||
|
void wapp_u8_array_extend_capped(U8Array *array, const U8Array *other);
|
||||||
|
void wapp_u8_array_clear(U8Array *array);
|
||||||
|
void wapp_u8_array_copy_capped(const U8Array *src, U8Array *dst);
|
||||||
|
U8Array *wapp_u8_array_append_alloc(const Allocator *allocator, U8Array *array, u8 *item);
|
||||||
|
U8Array *wapp_u8_array_extend_alloc(const Allocator *allocator, U8Array *array, const U8Array *other);
|
||||||
|
U8Array *wapp_u8_array_copy_alloc(const Allocator *allocator, const U8Array *src, U8Array *dst);
|
||||||
|
u8 *_u8_array_pop(U8Array *array);
|
||||||
|
u16 *wapp_u16_array_get(const U16Array *array, u64 index);
|
||||||
|
void wapp_u16_array_set(U16Array *array, u64 index, u16 *item);
|
||||||
|
void wapp_u16_array_append_capped(U16Array *array, u16 *item);
|
||||||
|
void wapp_u16_array_extend_capped(U16Array *array, const U16Array *other);
|
||||||
|
void wapp_u16_array_clear(U16Array *array);
|
||||||
|
void wapp_u16_array_copy_capped(const U16Array *src, U16Array *dst);
|
||||||
|
U16Array *wapp_u16_array_append_alloc(const Allocator *allocator, U16Array *array, u16 *item);
|
||||||
|
U16Array *wapp_u16_array_extend_alloc(const Allocator *allocator, U16Array *array, const U16Array *other);
|
||||||
|
U16Array *wapp_u16_array_copy_alloc(const Allocator *allocator, const U16Array *src, U16Array *dst);
|
||||||
|
u16 *_u16_array_pop(U16Array *array);
|
||||||
|
u32 *wapp_u32_array_get(const U32Array *array, u64 index);
|
||||||
|
void wapp_u32_array_set(U32Array *array, u64 index, u32 *item);
|
||||||
|
void wapp_u32_array_append_capped(U32Array *array, u32 *item);
|
||||||
|
void wapp_u32_array_extend_capped(U32Array *array, const U32Array *other);
|
||||||
|
void wapp_u32_array_clear(U32Array *array);
|
||||||
|
void wapp_u32_array_copy_capped(const U32Array *src, U32Array *dst);
|
||||||
|
U32Array *wapp_u32_array_append_alloc(const Allocator *allocator, U32Array *array, u32 *item);
|
||||||
|
U32Array *wapp_u32_array_extend_alloc(const Allocator *allocator, U32Array *array, const U32Array *other);
|
||||||
|
U32Array *wapp_u32_array_copy_alloc(const Allocator *allocator, const U32Array *src, U32Array *dst);
|
||||||
|
u32 *_u32_array_pop(U32Array *array);
|
||||||
|
u64 *wapp_u64_array_get(const U64Array *array, u64 index);
|
||||||
|
void wapp_u64_array_set(U64Array *array, u64 index, u64 *item);
|
||||||
|
void wapp_u64_array_append_capped(U64Array *array, u64 *item);
|
||||||
|
void wapp_u64_array_extend_capped(U64Array *array, const U64Array *other);
|
||||||
|
void wapp_u64_array_clear(U64Array *array);
|
||||||
|
void wapp_u64_array_copy_capped(const U64Array *src, U64Array *dst);
|
||||||
|
U64Array *wapp_u64_array_append_alloc(const Allocator *allocator, U64Array *array, u64 *item);
|
||||||
|
U64Array *wapp_u64_array_extend_alloc(const Allocator *allocator, U64Array *array, const U64Array *other);
|
||||||
|
U64Array *wapp_u64_array_copy_alloc(const Allocator *allocator, const U64Array *src, U64Array *dst);
|
||||||
|
u64 *_u64_array_pop(U64Array *array);
|
||||||
|
f32 *wapp_f32_array_get(const F32Array *array, u64 index);
|
||||||
|
void wapp_f32_array_set(F32Array *array, u64 index, f32 *item);
|
||||||
|
void wapp_f32_array_append_capped(F32Array *array, f32 *item);
|
||||||
|
void wapp_f32_array_extend_capped(F32Array *array, const F32Array *other);
|
||||||
|
void wapp_f32_array_clear(F32Array *array);
|
||||||
|
void wapp_f32_array_copy_capped(const F32Array *src, F32Array *dst);
|
||||||
|
F32Array *wapp_f32_array_append_alloc(const Allocator *allocator, F32Array *array, f32 *item);
|
||||||
|
F32Array *wapp_f32_array_extend_alloc(const Allocator *allocator, F32Array *array, const F32Array *other);
|
||||||
|
F32Array *wapp_f32_array_copy_alloc(const Allocator *allocator, const F32Array *src, F32Array *dst);
|
||||||
|
f32 *_f32_array_pop(F32Array *array);
|
||||||
|
f64 *wapp_f64_array_get(const F64Array *array, u64 index);
|
||||||
|
void wapp_f64_array_set(F64Array *array, u64 index, f64 *item);
|
||||||
|
void wapp_f64_array_append_capped(F64Array *array, f64 *item);
|
||||||
|
void wapp_f64_array_extend_capped(F64Array *array, const F64Array *other);
|
||||||
|
void wapp_f64_array_clear(F64Array *array);
|
||||||
|
void wapp_f64_array_copy_capped(const F64Array *src, F64Array *dst);
|
||||||
|
F64Array *wapp_f64_array_append_alloc(const Allocator *allocator, F64Array *array, f64 *item);
|
||||||
|
F64Array *wapp_f64_array_extend_alloc(const Allocator *allocator, F64Array *array, const F64Array *other);
|
||||||
|
F64Array *wapp_f64_array_copy_alloc(const Allocator *allocator, const F64Array *src, F64Array *dst);
|
||||||
|
f64 *_f64_array_pop(F64Array *array);
|
||||||
|
f128 *wapp_f128_array_get(const F128Array *array, u64 index);
|
||||||
|
void wapp_f128_array_set(F128Array *array, u64 index, f128 *item);
|
||||||
|
void wapp_f128_array_append_capped(F128Array *array, f128 *item);
|
||||||
|
void wapp_f128_array_extend_capped(F128Array *array, const F128Array *other);
|
||||||
|
void wapp_f128_array_clear(F128Array *array);
|
||||||
|
void wapp_f128_array_copy_capped(const F128Array *src, F128Array *dst);
|
||||||
|
F128Array *wapp_f128_array_append_alloc(const Allocator *allocator, F128Array *array, f128 *item);
|
||||||
|
F128Array *wapp_f128_array_extend_alloc(const Allocator *allocator, F128Array *array, const F128Array *other);
|
||||||
|
F128Array *wapp_f128_array_copy_alloc(const Allocator *allocator, const F128Array *src, F128Array *dst);
|
||||||
|
f128 *_f128_array_pop(F128Array *array);
|
||||||
|
iptr *wapp_iptr_array_get(const IptrArray *array, u64 index);
|
||||||
|
void wapp_iptr_array_set(IptrArray *array, u64 index, iptr *item);
|
||||||
|
void wapp_iptr_array_append_capped(IptrArray *array, iptr *item);
|
||||||
|
void wapp_iptr_array_extend_capped(IptrArray *array, const IptrArray *other);
|
||||||
|
void wapp_iptr_array_clear(IptrArray *array);
|
||||||
|
void wapp_iptr_array_copy_capped(const IptrArray *src, IptrArray *dst);
|
||||||
|
IptrArray *wapp_iptr_array_append_alloc(const Allocator *allocator, IptrArray *array, iptr *item);
|
||||||
|
IptrArray *wapp_iptr_array_extend_alloc(const Allocator *allocator, IptrArray *array, const IptrArray *other);
|
||||||
|
IptrArray *wapp_iptr_array_copy_alloc(const Allocator *allocator, const IptrArray *src, IptrArray *dst);
|
||||||
|
iptr *_iptr_array_pop(IptrArray *array);
|
||||||
|
uptr *wapp_uptr_array_get(const UptrArray *array, u64 index);
|
||||||
|
void wapp_uptr_array_set(UptrArray *array, u64 index, uptr *item);
|
||||||
|
void wapp_uptr_array_append_capped(UptrArray *array, uptr *item);
|
||||||
|
void wapp_uptr_array_extend_capped(UptrArray *array, const UptrArray *other);
|
||||||
|
void wapp_uptr_array_clear(UptrArray *array);
|
||||||
|
void wapp_uptr_array_copy_capped(const UptrArray *src, UptrArray *dst);
|
||||||
|
UptrArray *wapp_uptr_array_append_alloc(const Allocator *allocator, UptrArray *array, uptr *item);
|
||||||
|
UptrArray *wapp_uptr_array_extend_alloc(const Allocator *allocator, UptrArray *array, const UptrArray *other);
|
||||||
|
UptrArray *wapp_uptr_array_copy_alloc(const Allocator *allocator, const UptrArray *src, UptrArray *dst);
|
||||||
|
uptr *_uptr_array_pop(UptrArray *array);
|
||||||
|
VoidPArray *_array_alloc_capacity(const Allocator *allocator, u64 capacity, u64 item_size);
|
||||||
|
|
||||||
|
#endif // !ARRAY_H
|
3812
src/primitives/dbl_list/dbl_list.c
Normal file
3812
src/primitives/dbl_list/dbl_list.c
Normal file
File diff suppressed because it is too large
Load Diff
476
src/primitives/dbl_list/dbl_list.h
Normal file
476
src/primitives/dbl_list/dbl_list.h
Normal file
@ -0,0 +1,476 @@
|
|||||||
|
/**
|
||||||
|
* THIS FILE IS AUTOMATICALLY GENERATED. ANY MODIFICATIONS TO IT WILL BE OVERWRITTEN
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DBL_LIST_H
|
||||||
|
#define DBL_LIST_H
|
||||||
|
|
||||||
|
#include "../../common/aliases/aliases.h"
|
||||||
|
#include "../../common/platform/platform.h"
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#define wapp_str8_list_node(ITEM_PTR) ((Str8Node){.item = ITEM_PTR})
|
||||||
|
#define wapp_void_ptr_list_node(ITEM_PTR) ((VoidPNode){.item = ITEM_PTR})
|
||||||
|
#define wapp_bool_list_node(ITEM_PTR) ((BoolNode){.item = ITEM_PTR})
|
||||||
|
#define wapp_char_list_node(ITEM_PTR) ((CharNode){.item = ITEM_PTR})
|
||||||
|
#define wapp_c8_list_node(ITEM_PTR) ((C8Node){.item = ITEM_PTR})
|
||||||
|
#define wapp_c16_list_node(ITEM_PTR) ((C16Node){.item = ITEM_PTR})
|
||||||
|
#define wapp_c32_list_node(ITEM_PTR) ((C32Node){.item = ITEM_PTR})
|
||||||
|
#define wapp_i8_list_node(ITEM_PTR) ((I8Node){.item = ITEM_PTR})
|
||||||
|
#define wapp_i16_list_node(ITEM_PTR) ((I16Node){.item = ITEM_PTR})
|
||||||
|
#define wapp_i32_list_node(ITEM_PTR) ((I32Node){.item = ITEM_PTR})
|
||||||
|
#define wapp_i64_list_node(ITEM_PTR) ((I64Node){.item = ITEM_PTR})
|
||||||
|
#define wapp_u8_list_node(ITEM_PTR) ((U8Node){.item = ITEM_PTR})
|
||||||
|
#define wapp_u16_list_node(ITEM_PTR) ((U16Node){.item = ITEM_PTR})
|
||||||
|
#define wapp_u32_list_node(ITEM_PTR) ((U32Node){.item = ITEM_PTR})
|
||||||
|
#define wapp_u64_list_node(ITEM_PTR) ((U64Node){.item = ITEM_PTR})
|
||||||
|
#define wapp_f32_list_node(ITEM_PTR) ((F32Node){.item = ITEM_PTR})
|
||||||
|
#define wapp_f64_list_node(ITEM_PTR) ((F64Node){.item = ITEM_PTR})
|
||||||
|
#define wapp_f128_list_node(ITEM_PTR) ((F128Node){.item = ITEM_PTR})
|
||||||
|
#define wapp_iptr_list_node(ITEM_PTR) ((IptrNode){.item = ITEM_PTR})
|
||||||
|
#define wapp_uptr_list_node(ITEM_PTR) ((UptrNode){.item = ITEM_PTR})
|
||||||
|
|
||||||
|
typedef struct str8 Str8;
|
||||||
|
|
||||||
|
typedef struct Str8Node Str8Node;
|
||||||
|
struct Str8Node {
|
||||||
|
Str8 *item;
|
||||||
|
Str8Node *prev;
|
||||||
|
Str8Node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct Str8List Str8List;
|
||||||
|
struct Str8List {
|
||||||
|
Str8Node *first;
|
||||||
|
Str8Node *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct VoidPNode VoidPNode;
|
||||||
|
struct VoidPNode {
|
||||||
|
void * *item;
|
||||||
|
VoidPNode *prev;
|
||||||
|
VoidPNode *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct VoidPList VoidPList;
|
||||||
|
struct VoidPList {
|
||||||
|
VoidPNode *first;
|
||||||
|
VoidPNode *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct BoolNode BoolNode;
|
||||||
|
struct BoolNode {
|
||||||
|
bool *item;
|
||||||
|
BoolNode *prev;
|
||||||
|
BoolNode *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct BoolList BoolList;
|
||||||
|
struct BoolList {
|
||||||
|
BoolNode *first;
|
||||||
|
BoolNode *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CharNode CharNode;
|
||||||
|
struct CharNode {
|
||||||
|
char *item;
|
||||||
|
CharNode *prev;
|
||||||
|
CharNode *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CharList CharList;
|
||||||
|
struct CharList {
|
||||||
|
CharNode *first;
|
||||||
|
CharNode *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct C8Node C8Node;
|
||||||
|
struct C8Node {
|
||||||
|
c8 *item;
|
||||||
|
C8Node *prev;
|
||||||
|
C8Node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct C8List C8List;
|
||||||
|
struct C8List {
|
||||||
|
C8Node *first;
|
||||||
|
C8Node *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct C16Node C16Node;
|
||||||
|
struct C16Node {
|
||||||
|
c16 *item;
|
||||||
|
C16Node *prev;
|
||||||
|
C16Node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct C16List C16List;
|
||||||
|
struct C16List {
|
||||||
|
C16Node *first;
|
||||||
|
C16Node *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct C32Node C32Node;
|
||||||
|
struct C32Node {
|
||||||
|
c32 *item;
|
||||||
|
C32Node *prev;
|
||||||
|
C32Node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct C32List C32List;
|
||||||
|
struct C32List {
|
||||||
|
C32Node *first;
|
||||||
|
C32Node *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct I8Node I8Node;
|
||||||
|
struct I8Node {
|
||||||
|
i8 *item;
|
||||||
|
I8Node *prev;
|
||||||
|
I8Node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct I8List I8List;
|
||||||
|
struct I8List {
|
||||||
|
I8Node *first;
|
||||||
|
I8Node *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct I16Node I16Node;
|
||||||
|
struct I16Node {
|
||||||
|
i16 *item;
|
||||||
|
I16Node *prev;
|
||||||
|
I16Node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct I16List I16List;
|
||||||
|
struct I16List {
|
||||||
|
I16Node *first;
|
||||||
|
I16Node *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct I32Node I32Node;
|
||||||
|
struct I32Node {
|
||||||
|
i32 *item;
|
||||||
|
I32Node *prev;
|
||||||
|
I32Node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct I32List I32List;
|
||||||
|
struct I32List {
|
||||||
|
I32Node *first;
|
||||||
|
I32Node *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct I64Node I64Node;
|
||||||
|
struct I64Node {
|
||||||
|
i64 *item;
|
||||||
|
I64Node *prev;
|
||||||
|
I64Node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct I64List I64List;
|
||||||
|
struct I64List {
|
||||||
|
I64Node *first;
|
||||||
|
I64Node *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct U8Node U8Node;
|
||||||
|
struct U8Node {
|
||||||
|
u8 *item;
|
||||||
|
U8Node *prev;
|
||||||
|
U8Node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct U8List U8List;
|
||||||
|
struct U8List {
|
||||||
|
U8Node *first;
|
||||||
|
U8Node *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct U16Node U16Node;
|
||||||
|
struct U16Node {
|
||||||
|
u16 *item;
|
||||||
|
U16Node *prev;
|
||||||
|
U16Node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct U16List U16List;
|
||||||
|
struct U16List {
|
||||||
|
U16Node *first;
|
||||||
|
U16Node *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct U32Node U32Node;
|
||||||
|
struct U32Node {
|
||||||
|
u32 *item;
|
||||||
|
U32Node *prev;
|
||||||
|
U32Node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct U32List U32List;
|
||||||
|
struct U32List {
|
||||||
|
U32Node *first;
|
||||||
|
U32Node *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct U64Node U64Node;
|
||||||
|
struct U64Node {
|
||||||
|
u64 *item;
|
||||||
|
U64Node *prev;
|
||||||
|
U64Node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct U64List U64List;
|
||||||
|
struct U64List {
|
||||||
|
U64Node *first;
|
||||||
|
U64Node *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct F32Node F32Node;
|
||||||
|
struct F32Node {
|
||||||
|
f32 *item;
|
||||||
|
F32Node *prev;
|
||||||
|
F32Node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct F32List F32List;
|
||||||
|
struct F32List {
|
||||||
|
F32Node *first;
|
||||||
|
F32Node *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct F64Node F64Node;
|
||||||
|
struct F64Node {
|
||||||
|
f64 *item;
|
||||||
|
F64Node *prev;
|
||||||
|
F64Node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct F64List F64List;
|
||||||
|
struct F64List {
|
||||||
|
F64Node *first;
|
||||||
|
F64Node *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct F128Node F128Node;
|
||||||
|
struct F128Node {
|
||||||
|
f128 *item;
|
||||||
|
F128Node *prev;
|
||||||
|
F128Node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct F128List F128List;
|
||||||
|
struct F128List {
|
||||||
|
F128Node *first;
|
||||||
|
F128Node *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct IptrNode IptrNode;
|
||||||
|
struct IptrNode {
|
||||||
|
iptr *item;
|
||||||
|
IptrNode *prev;
|
||||||
|
IptrNode *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct IptrList IptrList;
|
||||||
|
struct IptrList {
|
||||||
|
IptrNode *first;
|
||||||
|
IptrNode *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct UptrNode UptrNode;
|
||||||
|
struct UptrNode {
|
||||||
|
uptr *item;
|
||||||
|
UptrNode *prev;
|
||||||
|
UptrNode *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct UptrList UptrList;
|
||||||
|
struct UptrList {
|
||||||
|
UptrNode *first;
|
||||||
|
UptrNode *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
Str8Node *wapp_str8_list_get(const Str8List *list, u64 index);
|
||||||
|
void wapp_str8_list_push_front(Str8List *list, Str8Node *node);
|
||||||
|
void wapp_str8_list_push_back(Str8List *list, Str8Node *node);
|
||||||
|
void wapp_str8_list_insert(Str8List *list, Str8Node *node, u64 index);
|
||||||
|
Str8Node *wapp_str8_list_pop_front(Str8List *list);
|
||||||
|
Str8Node *wapp_str8_list_pop_back(Str8List *list);
|
||||||
|
Str8Node *wapp_str8_list_remove(Str8List *list, u64 index);
|
||||||
|
void wapp_str8_list_empty(Str8List *list);
|
||||||
|
VoidPNode *wapp_void_ptr_list_get(const VoidPList *list, u64 index);
|
||||||
|
void wapp_void_ptr_list_push_front(VoidPList *list, VoidPNode *node);
|
||||||
|
void wapp_void_ptr_list_push_back(VoidPList *list, VoidPNode *node);
|
||||||
|
void wapp_void_ptr_list_insert(VoidPList *list, VoidPNode *node, u64 index);
|
||||||
|
VoidPNode *wapp_void_ptr_list_pop_front(VoidPList *list);
|
||||||
|
VoidPNode *wapp_void_ptr_list_pop_back(VoidPList *list);
|
||||||
|
VoidPNode *wapp_void_ptr_list_remove(VoidPList *list, u64 index);
|
||||||
|
void wapp_void_ptr_list_empty(VoidPList *list);
|
||||||
|
BoolNode *wapp_bool_list_get(const BoolList *list, u64 index);
|
||||||
|
void wapp_bool_list_push_front(BoolList *list, BoolNode *node);
|
||||||
|
void wapp_bool_list_push_back(BoolList *list, BoolNode *node);
|
||||||
|
void wapp_bool_list_insert(BoolList *list, BoolNode *node, u64 index);
|
||||||
|
BoolNode *wapp_bool_list_pop_front(BoolList *list);
|
||||||
|
BoolNode *wapp_bool_list_pop_back(BoolList *list);
|
||||||
|
BoolNode *wapp_bool_list_remove(BoolList *list, u64 index);
|
||||||
|
void wapp_bool_list_empty(BoolList *list);
|
||||||
|
CharNode *wapp_char_list_get(const CharList *list, u64 index);
|
||||||
|
void wapp_char_list_push_front(CharList *list, CharNode *node);
|
||||||
|
void wapp_char_list_push_back(CharList *list, CharNode *node);
|
||||||
|
void wapp_char_list_insert(CharList *list, CharNode *node, u64 index);
|
||||||
|
CharNode *wapp_char_list_pop_front(CharList *list);
|
||||||
|
CharNode *wapp_char_list_pop_back(CharList *list);
|
||||||
|
CharNode *wapp_char_list_remove(CharList *list, u64 index);
|
||||||
|
void wapp_char_list_empty(CharList *list);
|
||||||
|
C8Node *wapp_c8_list_get(const C8List *list, u64 index);
|
||||||
|
void wapp_c8_list_push_front(C8List *list, C8Node *node);
|
||||||
|
void wapp_c8_list_push_back(C8List *list, C8Node *node);
|
||||||
|
void wapp_c8_list_insert(C8List *list, C8Node *node, u64 index);
|
||||||
|
C8Node *wapp_c8_list_pop_front(C8List *list);
|
||||||
|
C8Node *wapp_c8_list_pop_back(C8List *list);
|
||||||
|
C8Node *wapp_c8_list_remove(C8List *list, u64 index);
|
||||||
|
void wapp_c8_list_empty(C8List *list);
|
||||||
|
C16Node *wapp_c16_list_get(const C16List *list, u64 index);
|
||||||
|
void wapp_c16_list_push_front(C16List *list, C16Node *node);
|
||||||
|
void wapp_c16_list_push_back(C16List *list, C16Node *node);
|
||||||
|
void wapp_c16_list_insert(C16List *list, C16Node *node, u64 index);
|
||||||
|
C16Node *wapp_c16_list_pop_front(C16List *list);
|
||||||
|
C16Node *wapp_c16_list_pop_back(C16List *list);
|
||||||
|
C16Node *wapp_c16_list_remove(C16List *list, u64 index);
|
||||||
|
void wapp_c16_list_empty(C16List *list);
|
||||||
|
C32Node *wapp_c32_list_get(const C32List *list, u64 index);
|
||||||
|
void wapp_c32_list_push_front(C32List *list, C32Node *node);
|
||||||
|
void wapp_c32_list_push_back(C32List *list, C32Node *node);
|
||||||
|
void wapp_c32_list_insert(C32List *list, C32Node *node, u64 index);
|
||||||
|
C32Node *wapp_c32_list_pop_front(C32List *list);
|
||||||
|
C32Node *wapp_c32_list_pop_back(C32List *list);
|
||||||
|
C32Node *wapp_c32_list_remove(C32List *list, u64 index);
|
||||||
|
void wapp_c32_list_empty(C32List *list);
|
||||||
|
I8Node *wapp_i8_list_get(const I8List *list, u64 index);
|
||||||
|
void wapp_i8_list_push_front(I8List *list, I8Node *node);
|
||||||
|
void wapp_i8_list_push_back(I8List *list, I8Node *node);
|
||||||
|
void wapp_i8_list_insert(I8List *list, I8Node *node, u64 index);
|
||||||
|
I8Node *wapp_i8_list_pop_front(I8List *list);
|
||||||
|
I8Node *wapp_i8_list_pop_back(I8List *list);
|
||||||
|
I8Node *wapp_i8_list_remove(I8List *list, u64 index);
|
||||||
|
void wapp_i8_list_empty(I8List *list);
|
||||||
|
I16Node *wapp_i16_list_get(const I16List *list, u64 index);
|
||||||
|
void wapp_i16_list_push_front(I16List *list, I16Node *node);
|
||||||
|
void wapp_i16_list_push_back(I16List *list, I16Node *node);
|
||||||
|
void wapp_i16_list_insert(I16List *list, I16Node *node, u64 index);
|
||||||
|
I16Node *wapp_i16_list_pop_front(I16List *list);
|
||||||
|
I16Node *wapp_i16_list_pop_back(I16List *list);
|
||||||
|
I16Node *wapp_i16_list_remove(I16List *list, u64 index);
|
||||||
|
void wapp_i16_list_empty(I16List *list);
|
||||||
|
I32Node *wapp_i32_list_get(const I32List *list, u64 index);
|
||||||
|
void wapp_i32_list_push_front(I32List *list, I32Node *node);
|
||||||
|
void wapp_i32_list_push_back(I32List *list, I32Node *node);
|
||||||
|
void wapp_i32_list_insert(I32List *list, I32Node *node, u64 index);
|
||||||
|
I32Node *wapp_i32_list_pop_front(I32List *list);
|
||||||
|
I32Node *wapp_i32_list_pop_back(I32List *list);
|
||||||
|
I32Node *wapp_i32_list_remove(I32List *list, u64 index);
|
||||||
|
void wapp_i32_list_empty(I32List *list);
|
||||||
|
I64Node *wapp_i64_list_get(const I64List *list, u64 index);
|
||||||
|
void wapp_i64_list_push_front(I64List *list, I64Node *node);
|
||||||
|
void wapp_i64_list_push_back(I64List *list, I64Node *node);
|
||||||
|
void wapp_i64_list_insert(I64List *list, I64Node *node, u64 index);
|
||||||
|
I64Node *wapp_i64_list_pop_front(I64List *list);
|
||||||
|
I64Node *wapp_i64_list_pop_back(I64List *list);
|
||||||
|
I64Node *wapp_i64_list_remove(I64List *list, u64 index);
|
||||||
|
void wapp_i64_list_empty(I64List *list);
|
||||||
|
U8Node *wapp_u8_list_get(const U8List *list, u64 index);
|
||||||
|
void wapp_u8_list_push_front(U8List *list, U8Node *node);
|
||||||
|
void wapp_u8_list_push_back(U8List *list, U8Node *node);
|
||||||
|
void wapp_u8_list_insert(U8List *list, U8Node *node, u64 index);
|
||||||
|
U8Node *wapp_u8_list_pop_front(U8List *list);
|
||||||
|
U8Node *wapp_u8_list_pop_back(U8List *list);
|
||||||
|
U8Node *wapp_u8_list_remove(U8List *list, u64 index);
|
||||||
|
void wapp_u8_list_empty(U8List *list);
|
||||||
|
U16Node *wapp_u16_list_get(const U16List *list, u64 index);
|
||||||
|
void wapp_u16_list_push_front(U16List *list, U16Node *node);
|
||||||
|
void wapp_u16_list_push_back(U16List *list, U16Node *node);
|
||||||
|
void wapp_u16_list_insert(U16List *list, U16Node *node, u64 index);
|
||||||
|
U16Node *wapp_u16_list_pop_front(U16List *list);
|
||||||
|
U16Node *wapp_u16_list_pop_back(U16List *list);
|
||||||
|
U16Node *wapp_u16_list_remove(U16List *list, u64 index);
|
||||||
|
void wapp_u16_list_empty(U16List *list);
|
||||||
|
U32Node *wapp_u32_list_get(const U32List *list, u64 index);
|
||||||
|
void wapp_u32_list_push_front(U32List *list, U32Node *node);
|
||||||
|
void wapp_u32_list_push_back(U32List *list, U32Node *node);
|
||||||
|
void wapp_u32_list_insert(U32List *list, U32Node *node, u64 index);
|
||||||
|
U32Node *wapp_u32_list_pop_front(U32List *list);
|
||||||
|
U32Node *wapp_u32_list_pop_back(U32List *list);
|
||||||
|
U32Node *wapp_u32_list_remove(U32List *list, u64 index);
|
||||||
|
void wapp_u32_list_empty(U32List *list);
|
||||||
|
U64Node *wapp_u64_list_get(const U64List *list, u64 index);
|
||||||
|
void wapp_u64_list_push_front(U64List *list, U64Node *node);
|
||||||
|
void wapp_u64_list_push_back(U64List *list, U64Node *node);
|
||||||
|
void wapp_u64_list_insert(U64List *list, U64Node *node, u64 index);
|
||||||
|
U64Node *wapp_u64_list_pop_front(U64List *list);
|
||||||
|
U64Node *wapp_u64_list_pop_back(U64List *list);
|
||||||
|
U64Node *wapp_u64_list_remove(U64List *list, u64 index);
|
||||||
|
void wapp_u64_list_empty(U64List *list);
|
||||||
|
F32Node *wapp_f32_list_get(const F32List *list, u64 index);
|
||||||
|
void wapp_f32_list_push_front(F32List *list, F32Node *node);
|
||||||
|
void wapp_f32_list_push_back(F32List *list, F32Node *node);
|
||||||
|
void wapp_f32_list_insert(F32List *list, F32Node *node, u64 index);
|
||||||
|
F32Node *wapp_f32_list_pop_front(F32List *list);
|
||||||
|
F32Node *wapp_f32_list_pop_back(F32List *list);
|
||||||
|
F32Node *wapp_f32_list_remove(F32List *list, u64 index);
|
||||||
|
void wapp_f32_list_empty(F32List *list);
|
||||||
|
F64Node *wapp_f64_list_get(const F64List *list, u64 index);
|
||||||
|
void wapp_f64_list_push_front(F64List *list, F64Node *node);
|
||||||
|
void wapp_f64_list_push_back(F64List *list, F64Node *node);
|
||||||
|
void wapp_f64_list_insert(F64List *list, F64Node *node, u64 index);
|
||||||
|
F64Node *wapp_f64_list_pop_front(F64List *list);
|
||||||
|
F64Node *wapp_f64_list_pop_back(F64List *list);
|
||||||
|
F64Node *wapp_f64_list_remove(F64List *list, u64 index);
|
||||||
|
void wapp_f64_list_empty(F64List *list);
|
||||||
|
F128Node *wapp_f128_list_get(const F128List *list, u64 index);
|
||||||
|
void wapp_f128_list_push_front(F128List *list, F128Node *node);
|
||||||
|
void wapp_f128_list_push_back(F128List *list, F128Node *node);
|
||||||
|
void wapp_f128_list_insert(F128List *list, F128Node *node, u64 index);
|
||||||
|
F128Node *wapp_f128_list_pop_front(F128List *list);
|
||||||
|
F128Node *wapp_f128_list_pop_back(F128List *list);
|
||||||
|
F128Node *wapp_f128_list_remove(F128List *list, u64 index);
|
||||||
|
void wapp_f128_list_empty(F128List *list);
|
||||||
|
IptrNode *wapp_iptr_list_get(const IptrList *list, u64 index);
|
||||||
|
void wapp_iptr_list_push_front(IptrList *list, IptrNode *node);
|
||||||
|
void wapp_iptr_list_push_back(IptrList *list, IptrNode *node);
|
||||||
|
void wapp_iptr_list_insert(IptrList *list, IptrNode *node, u64 index);
|
||||||
|
IptrNode *wapp_iptr_list_pop_front(IptrList *list);
|
||||||
|
IptrNode *wapp_iptr_list_pop_back(IptrList *list);
|
||||||
|
IptrNode *wapp_iptr_list_remove(IptrList *list, u64 index);
|
||||||
|
void wapp_iptr_list_empty(IptrList *list);
|
||||||
|
UptrNode *wapp_uptr_list_get(const UptrList *list, u64 index);
|
||||||
|
void wapp_uptr_list_push_front(UptrList *list, UptrNode *node);
|
||||||
|
void wapp_uptr_list_push_back(UptrList *list, UptrNode *node);
|
||||||
|
void wapp_uptr_list_insert(UptrList *list, UptrNode *node, u64 index);
|
||||||
|
UptrNode *wapp_uptr_list_pop_front(UptrList *list);
|
||||||
|
UptrNode *wapp_uptr_list_pop_back(UptrList *list);
|
||||||
|
UptrNode *wapp_uptr_list_remove(UptrList *list, u64 index);
|
||||||
|
void wapp_uptr_list_empty(UptrList *list);
|
||||||
|
|
||||||
|
#endif // !DBL_LIST_H
|
@ -1,37 +1,26 @@
|
|||||||
#include "mem_allocator.h"
|
#include "mem_allocator.h"
|
||||||
#include "../../../common/aliases/aliases.h"
|
#include "../../common/aliases/aliases.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
void *wapp_mem_allocator_alloc(const Allocator *allocator, u64 size) {
|
void *wapp_mem_allocator_alloc(const Allocator *allocator, u64 size) {
|
||||||
if (!allocator || !(allocator->alloc)) {
|
assert(allocator != NULL && (allocator->alloc) != NULL);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return allocator->alloc(size, allocator->obj);
|
return allocator->alloc(size, allocator->obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *wapp_mem_allocator_alloc_aligned(const Allocator *allocator, u64 size, u64 alignment) {
|
void *wapp_mem_allocator_alloc_aligned(const Allocator *allocator, u64 size, u64 alignment) {
|
||||||
if (!allocator || !(allocator->alloc_aligned)) {
|
assert(allocator != NULL && (allocator->alloc_aligned) != NULL);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return allocator->alloc_aligned(size, alignment, allocator->obj);
|
return allocator->alloc_aligned(size, alignment, allocator->obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *wapp_mem_allocator_realloc(const Allocator *allocator, void *ptr, u64 old_size, u64 new_size) {
|
void *wapp_mem_allocator_realloc(const Allocator *allocator, void *ptr, u64 old_size, u64 new_size) {
|
||||||
if (!allocator || !(allocator->realloc)) {
|
assert(allocator != NULL && (allocator->realloc) != NULL);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return allocator->realloc(ptr, old_size, new_size, allocator->obj);
|
return allocator->realloc(ptr, old_size, new_size, allocator->obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *wapp_mem_allocator_realloc_aligned(const Allocator *allocator, void *ptr, u64 old_size,
|
void *wapp_mem_allocator_realloc_aligned(const Allocator *allocator, void *ptr, u64 old_size,
|
||||||
u64 new_size, u64 alignment) {
|
u64 new_size, u64 alignment) {
|
||||||
if (!allocator || !(allocator->realloc_aligned)) {
|
assert(allocator != NULL && (allocator->realloc_aligned) != NULL);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return allocator->realloc_aligned(ptr, old_size, new_size, alignment, allocator->obj);
|
return allocator->realloc_aligned(ptr, old_size, new_size, alignment, allocator->obj);
|
||||||
}
|
}
|
||||||
|
|
@ -1,20 +1,16 @@
|
|||||||
#ifndef MEM_ALLOCATOR_H
|
#ifndef MEM_ALLOCATOR_H
|
||||||
#define MEM_ALLOCATOR_H
|
#define MEM_ALLOCATOR_H
|
||||||
|
|
||||||
#include "../../../common/aliases/aliases.h"
|
#include "../../common/aliases/aliases.h"
|
||||||
|
#include "../../common/platform/platform.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
typedef void *(MemAllocFunc)(u64 size, void *alloc_obj);
|
typedef void *(MemAllocFunc)(u64 size, void *alloc_obj);
|
||||||
typedef void *(MemAllocAlignedFunc)(u64 size, u64 alignment, void *alloc_obj);
|
typedef void *(MemAllocAlignedFunc)(u64 size, u64 alignment, void *alloc_obj);
|
||||||
typedef void *(MemReallocFunc)(void *ptr, u64 old_size, u64 new_size, void *alloc_obj);
|
typedef void *(MemReallocFunc)(void *ptr, u64 old_size, u64 new_size, void *alloc_obj);
|
||||||
typedef void *(MemReallocAlignedFunc)(void *ptr, u64 old_size, u64 new_size, u64 alignment, void *alloc_obj);
|
typedef void *(MemReallocAlignedFunc)(void *ptr, u64 old_size, u64 new_size, u64 alignment, void *alloc_obj);
|
||||||
typedef void (MemFreeFunc)(void **ptr, u64 size, void *alloc_obj);
|
typedef void (MemFreeFunc)(void **ptr, u64 size, void *alloc_obj);
|
||||||
|
|
||||||
|
|
||||||
typedef struct allocator Allocator;
|
typedef struct allocator Allocator;
|
||||||
struct allocator {
|
struct allocator {
|
||||||
void *obj;
|
void *obj;
|
||||||
@ -27,7 +23,6 @@ struct allocator {
|
|||||||
|
|
||||||
#define wapp_mem_allocator_invalid(ALLOCATOR) (memcmp(ALLOCATOR, &((Allocator){0}), sizeof(Allocator)) == 0)
|
#define wapp_mem_allocator_invalid(ALLOCATOR) (memcmp(ALLOCATOR, &((Allocator){0}), sizeof(Allocator)) == 0)
|
||||||
|
|
||||||
|
|
||||||
void *wapp_mem_allocator_alloc(const Allocator *allocator, u64 size);
|
void *wapp_mem_allocator_alloc(const Allocator *allocator, u64 size);
|
||||||
void *wapp_mem_allocator_alloc_aligned(const Allocator *allocator, u64 size, u64 alignment);
|
void *wapp_mem_allocator_alloc_aligned(const Allocator *allocator, u64 size, u64 alignment);
|
||||||
void *wapp_mem_allocator_realloc(const Allocator *allocator, void *ptr, u64 old_size, u64 new_size);
|
void *wapp_mem_allocator_realloc(const Allocator *allocator, void *ptr, u64 old_size, u64 new_size);
|
||||||
@ -35,8 +30,4 @@ void *wapp_mem_allocator_realloc_aligned(const Allocator *allocator, void *ptr,
|
|||||||
u64 new_size, u64 alignment);
|
u64 new_size, u64 alignment);
|
||||||
void wapp_mem_allocator_free(const Allocator *allocator, void **ptr, u64 size);
|
void wapp_mem_allocator_free(const Allocator *allocator, void **ptr, u64 size);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !MEM_ALLOCATOR_H
|
#endif // !MEM_ALLOCATOR_H
|
@ -1,24 +1,19 @@
|
|||||||
#include "str8.h"
|
#include "str8.h"
|
||||||
#include "str8_list.h"
|
|
||||||
#include "../../../common/aliases/aliases.h"
|
#include "../../../common/aliases/aliases.h"
|
||||||
#include "../../../containers/dbl_list/dbl_list.h"
|
#include "../../mem_allocator/mem_allocator.h"
|
||||||
#include "../../mem/allocator/mem_allocator.h"
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#define STR8_BUF_ALLOC_SIZE(CAPACITY) (sizeof(Str8) + sizeof(c8) * CAPACITY)
|
#define STR8_BUF_ALLOC_SIZE(CAPACITY) (sizeof(Str8) + sizeof(c8) * CAPACITY)
|
||||||
|
|
||||||
Str8 *wapp_str8_alloc_buf(const Allocator *allocator, u64 capacity) {
|
Str8 *wapp_str8_alloc_buf(const Allocator *allocator, u64 capacity) {
|
||||||
Str8 *str = NULL;
|
assert(allocator != NULL);
|
||||||
|
|
||||||
if (!allocator) {
|
Str8 *str = wapp_mem_allocator_alloc(allocator, STR8_BUF_ALLOC_SIZE(capacity));
|
||||||
goto RETURN_STR8;
|
|
||||||
}
|
|
||||||
|
|
||||||
str = wapp_mem_allocator_alloc(allocator, STR8_BUF_ALLOC_SIZE(capacity));
|
|
||||||
if (!str) {
|
if (!str) {
|
||||||
goto RETURN_STR8;
|
goto RETURN_STR8;
|
||||||
}
|
}
|
||||||
@ -32,14 +27,10 @@ RETURN_STR8:
|
|||||||
}
|
}
|
||||||
|
|
||||||
Str8 *wapp_str8_alloc_cstr(const Allocator *allocator, const char *str) {
|
Str8 *wapp_str8_alloc_cstr(const Allocator *allocator, const char *str) {
|
||||||
Str8 *output = NULL;
|
assert(allocator != NULL && str != NULL);
|
||||||
|
|
||||||
if (!allocator || !str) {
|
|
||||||
goto RETURN_ALLOC_CSTR;
|
|
||||||
}
|
|
||||||
|
|
||||||
u64 length = strlen(str);
|
u64 length = strlen(str);
|
||||||
output = wapp_str8_alloc_buf(allocator, length * 2);
|
Str8 *output = wapp_str8_alloc_buf(allocator, length * 2);
|
||||||
if (!output) {
|
if (!output) {
|
||||||
goto RETURN_ALLOC_CSTR;
|
goto RETURN_ALLOC_CSTR;
|
||||||
}
|
}
|
||||||
@ -52,13 +43,9 @@ RETURN_ALLOC_CSTR:
|
|||||||
}
|
}
|
||||||
|
|
||||||
Str8 *wapp_str8_alloc_str8(const Allocator *allocator, Str8RO *str) {
|
Str8 *wapp_str8_alloc_str8(const Allocator *allocator, Str8RO *str) {
|
||||||
Str8 *output = NULL;
|
assert(allocator != NULL && str != NULL);
|
||||||
|
|
||||||
if (!allocator || !str) {
|
Str8 *output = wapp_str8_alloc_buf(allocator, str->capacity);
|
||||||
goto RETURN_ALLOC_STR8;
|
|
||||||
}
|
|
||||||
|
|
||||||
output = wapp_str8_alloc_buf(allocator, str->capacity);
|
|
||||||
if (!output) {
|
if (!output) {
|
||||||
goto RETURN_ALLOC_STR8;
|
goto RETURN_ALLOC_STR8;
|
||||||
}
|
}
|
||||||
@ -71,10 +58,9 @@ RETURN_ALLOC_STR8:
|
|||||||
}
|
}
|
||||||
|
|
||||||
Str8 *wapp_str8_alloc_substr(const Allocator *allocator, Str8RO *str, u64 start, u64 end) {
|
Str8 *wapp_str8_alloc_substr(const Allocator *allocator, Str8RO *str, u64 start, u64 end) {
|
||||||
|
assert(allocator != NULL && str != NULL);
|
||||||
|
|
||||||
Str8 *output = NULL;
|
Str8 *output = NULL;
|
||||||
if (!allocator || !str) {
|
|
||||||
goto RETURN_ALLOC_SUBSTR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (start >= str->size || start >= end) {
|
if (start >= str->size || start >= end) {
|
||||||
goto RETURN_ALLOC_SUBSTR;
|
goto RETURN_ALLOC_SUBSTR;
|
||||||
@ -97,10 +83,7 @@ RETURN_ALLOC_SUBSTR:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void wapp_str8_dealloc_buf(const Allocator *allocator, Str8 **str) {
|
void wapp_str8_dealloc_buf(const Allocator *allocator, Str8 **str) {
|
||||||
if (!allocator || !str || !(*str)) {
|
assert(allocator != NULL && str != NULL && (*str) != NULL);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
wapp_mem_allocator_free(allocator, (void **)str, STR8_BUF_ALLOC_SIZE((*str)->capacity));
|
wapp_mem_allocator_free(allocator, (void **)str, STR8_BUF_ALLOC_SIZE((*str)->capacity));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,11 +121,11 @@ bool wapp_str8_equal(Str8RO *s1, Str8RO *s2) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool wapp_str8_equal_to_count(Str8RO* s1, Str8RO* s2, u64 count) {
|
bool wapp_str8_equal_to_count(Str8RO* s1, Str8RO* s2, u64 count) {
|
||||||
if (!s1 || !s2) {
|
if (!s1 || !s2) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return memcmp(s1->buf, s2->buf, count) == 0;
|
return memcmp(s1->buf, s2->buf, count) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Str8 wapp_str8_slice(Str8RO *str, u64 start, u64 end) {
|
Str8 wapp_str8_slice(Str8RO *str, u64 start, u64 end) {
|
||||||
@ -163,9 +146,7 @@ Str8 wapp_str8_slice(Str8RO *str, u64 start, u64 end) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Str8 *wapp_str8_alloc_concat(const Allocator *allocator, Str8 *dst, Str8RO *src) {
|
Str8 *wapp_str8_alloc_concat(const Allocator *allocator, Str8 *dst, Str8RO *src) {
|
||||||
if (!allocator || !dst || !src) {
|
assert(allocator != NULL && dst != NULL && src != NULL);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
Str8 *output = NULL;
|
Str8 *output = NULL;
|
||||||
u64 remaining = dst->capacity - dst->size;
|
u64 remaining = dst->capacity - dst->size;
|
||||||
@ -191,9 +172,7 @@ RETURN_STR8_CONCAT:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void wapp_str8_concat_capped(Str8 *dst, Str8RO *src) {
|
void wapp_str8_concat_capped(Str8 *dst, Str8RO *src) {
|
||||||
if (!dst || !src) {
|
assert(dst != NULL && src != NULL);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
u64 remaining = dst->capacity - dst->size;
|
u64 remaining = dst->capacity - dst->size;
|
||||||
u64 to_copy = remaining < src->size ? remaining : src->size;
|
u64 to_copy = remaining < src->size ? remaining : src->size;
|
||||||
@ -203,9 +182,7 @@ void wapp_str8_concat_capped(Str8 *dst, Str8RO *src) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void wapp_str8_copy_cstr_capped(Str8 *dst, const char *src) {
|
void wapp_str8_copy_cstr_capped(Str8 *dst, const char *src) {
|
||||||
if (!dst || !src) {
|
assert(dst != NULL && src != NULL);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
u64 length = strlen(src);
|
u64 length = strlen(src);
|
||||||
u64 to_copy = length <= dst->capacity ? length : dst->capacity;
|
u64 to_copy = length <= dst->capacity ? length : dst->capacity;
|
||||||
@ -216,9 +193,7 @@ void wapp_str8_copy_cstr_capped(Str8 *dst, const char *src) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void wapp_str8_copy_str8_capped(Str8 *dst, Str8RO *src) {
|
void wapp_str8_copy_str8_capped(Str8 *dst, Str8RO *src) {
|
||||||
if (!dst || !src) {
|
assert(dst != NULL && src != NULL);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
u64 to_copy = src->size <= dst->capacity ? src->size : dst->capacity;
|
u64 to_copy = src->size <= dst->capacity ? src->size : dst->capacity;
|
||||||
|
|
||||||
@ -228,9 +203,7 @@ void wapp_str8_copy_str8_capped(Str8 *dst, Str8RO *src) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void wapp_str8_copy_to_cstr(char *dst, Str8RO *src, u64 dst_capacity) {
|
void wapp_str8_copy_to_cstr(char *dst, Str8RO *src, u64 dst_capacity) {
|
||||||
if (!dst || !src) {
|
assert(dst != NULL && src != NULL);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
u64 to_copy = src->size < dst_capacity ? src->size : dst_capacity - 1;
|
u64 to_copy = src->size < dst_capacity ? src->size : dst_capacity - 1;
|
||||||
|
|
||||||
@ -239,9 +212,7 @@ void wapp_str8_copy_to_cstr(char *dst, Str8RO *src, u64 dst_capacity) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void wapp_str8_format(Str8 *dst, const char *format, ...) {
|
void wapp_str8_format(Str8 *dst, const char *format, ...) {
|
||||||
if (!dst || !format) {
|
assert(dst != NULL && format != NULL);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
va_list args1;
|
va_list args1;
|
||||||
va_list args2;
|
va_list args2;
|
||||||
@ -266,7 +237,7 @@ i64 wapp_str8_find(Str8RO *str, Str8RO substr) {
|
|||||||
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
||||||
// MSVC Spectre mitigation warnings
|
// MSVC Spectre mitigation warnings
|
||||||
u64 char_index = 0;
|
u64 char_index = 0;
|
||||||
bool running = true;
|
bool running = char_index < str->size;
|
||||||
while (running) {
|
while (running) {
|
||||||
const c8 *sub = str->buf + char_index;
|
const c8 *sub = str->buf + char_index;
|
||||||
if (memcmp(sub, substr.buf, substr.size) == 0) {
|
if (memcmp(sub, substr.buf, substr.size) == 0) {
|
||||||
@ -288,7 +259,7 @@ i64 wapp_str8_rfind(Str8RO *str, Str8RO substr) {
|
|||||||
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
||||||
// MSVC Spectre mitigation warnings
|
// MSVC Spectre mitigation warnings
|
||||||
i64 char_index = str->size - substr.size;
|
i64 char_index = str->size - substr.size;
|
||||||
bool running = true;
|
bool running = char_index >= 0;
|
||||||
while (running) {
|
while (running) {
|
||||||
const c8 *sub = str->buf + char_index;
|
const c8 *sub = str->buf + char_index;
|
||||||
if (memcmp(sub, substr.buf, substr.size) == 0) {
|
if (memcmp(sub, substr.buf, substr.size) == 0) {
|
||||||
@ -302,19 +273,17 @@ i64 wapp_str8_rfind(Str8RO *str, Str8RO substr) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
DBL_LIST(Str8) *wapp_str8_split_with_max(const Allocator *allocator, Str8RO *str, Str8RO *delimiter, i64 max_splits) {
|
Str8List *wapp_str8_split_with_max(const Allocator *allocator, Str8RO *str, Str8RO *delimiter, i64 max_splits) {
|
||||||
if (!allocator || !str || !delimiter) {
|
assert(allocator != NULL && str != NULL && delimiter != NULL);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
DBL_LIST(Str8) *output = wapp_mem_allocator_alloc(allocator, sizeof(DBL_LIST(Str8)));
|
Str8List *output = wapp_mem_allocator_alloc(allocator, sizeof(Str8List));
|
||||||
|
|
||||||
if (delimiter->size > str->size) {
|
if (delimiter->size > str->size) {
|
||||||
Str8 *full = wapp_str8_alloc_str8(allocator, str);
|
Str8 *full = wapp_str8_alloc_str8(allocator, str);
|
||||||
DBL_NODE(Str8) *node = wapp_mem_allocator_alloc(allocator, sizeof(DBL_NODE(Str8)));
|
Str8Node *node = wapp_mem_allocator_alloc(allocator, sizeof(Str8Node));
|
||||||
if (node) {
|
if (node) {
|
||||||
node->item = full;
|
node->item = full;
|
||||||
wapp_dbl_list_push_back(output, node);
|
wapp_str8_list_push_back(output, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
goto RETURN_STR8_SPLIT;
|
goto RETURN_STR8_SPLIT;
|
||||||
@ -332,10 +301,10 @@ DBL_LIST(Str8) *wapp_str8_split_with_max(const Allocator *allocator, Str8RO *str
|
|||||||
}
|
}
|
||||||
|
|
||||||
before_str = wapp_str8_alloc_substr(allocator, str, start, start + end);
|
before_str = wapp_str8_alloc_substr(allocator, str, start, start + end);
|
||||||
DBL_NODE(Str8) *node = wapp_mem_allocator_alloc(allocator, sizeof(DBL_NODE(Str8)));
|
Str8Node *node = wapp_mem_allocator_alloc(allocator, sizeof(Str8Node));
|
||||||
if (node) {
|
if (node && before_str) {
|
||||||
node->item = before_str;
|
node->item = before_str;
|
||||||
wapp_dbl_list_push_back(output, node);
|
wapp_str8_list_push_back(output, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
wapp_mem_allocator_free(allocator, (void **)&rest, sizeof(Str8));
|
wapp_mem_allocator_free(allocator, (void **)&rest, sizeof(Str8));
|
||||||
@ -346,30 +315,28 @@ DBL_LIST(Str8) *wapp_str8_split_with_max(const Allocator *allocator, Str8RO *str
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Ensure the last part of the string after the delimiter is added to the list
|
// Ensure the last part of the string after the delimiter is added to the list
|
||||||
rest = wapp_str8_alloc_substr(allocator, str, start, str->size);
|
rest = wapp_str8_alloc_substr(allocator, str, start, str->size);
|
||||||
DBL_NODE(Str8) *node = wapp_mem_allocator_alloc(allocator, sizeof(DBL_NODE(Str8)));
|
Str8Node *node = wapp_mem_allocator_alloc(allocator, sizeof(Str8Node));
|
||||||
if (node) {
|
if (node && rest) {
|
||||||
node->item = rest;
|
node->item = rest;
|
||||||
wapp_dbl_list_push_back(output, node);
|
wapp_str8_list_push_back(output, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
RETURN_STR8_SPLIT:
|
RETURN_STR8_SPLIT:
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
DBL_LIST(Str8) *wapp_str8_rsplit_with_max(const Allocator *allocator, Str8RO *str, Str8RO *delimiter, i64 max_splits) {
|
Str8List *wapp_str8_rsplit_with_max(const Allocator *allocator, Str8RO *str, Str8RO *delimiter, i64 max_splits) {
|
||||||
if (!allocator || !str || !delimiter) {
|
assert(allocator != NULL && str != NULL && delimiter != NULL);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
DBL_LIST(Str8) *output = wapp_mem_allocator_alloc(allocator, sizeof(DBL_LIST(Str8)));
|
Str8List *output = wapp_mem_allocator_alloc(allocator, sizeof(Str8List));
|
||||||
|
|
||||||
if (delimiter->size > str->size) {
|
if (delimiter->size > str->size) {
|
||||||
Str8 *full = wapp_str8_alloc_str8(allocator, str);
|
Str8 *full = wapp_str8_alloc_str8(allocator, str);
|
||||||
DBL_NODE(Str8) *node = wapp_mem_allocator_alloc(allocator, sizeof(DBL_NODE(Str8)));
|
Str8Node *node = wapp_mem_allocator_alloc(allocator, sizeof(Str8Node));
|
||||||
if (node) {
|
if (node && full) {
|
||||||
node->item = full;
|
node->item = full;
|
||||||
wapp_dbl_list_push_back(output, node);
|
wapp_str8_list_push_back(output, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
goto RETURN_STR8_SPLIT;
|
goto RETURN_STR8_SPLIT;
|
||||||
@ -386,10 +353,10 @@ DBL_LIST(Str8) *wapp_str8_rsplit_with_max(const Allocator *allocator, Str8RO *st
|
|||||||
}
|
}
|
||||||
|
|
||||||
after_str = wapp_str8_alloc_substr(allocator, rest, end + delimiter->size, str->size);
|
after_str = wapp_str8_alloc_substr(allocator, rest, end + delimiter->size, str->size);
|
||||||
DBL_NODE(Str8) *node = wapp_mem_allocator_alloc(allocator, sizeof(DBL_NODE(Str8)));
|
Str8Node *node = wapp_mem_allocator_alloc(allocator, sizeof(Str8Node));
|
||||||
if (node) {
|
if (node) {
|
||||||
node->item = after_str;
|
node->item = after_str;
|
||||||
wapp_dbl_list_push_front(output, node);
|
wapp_str8_list_push_front(output, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
wapp_mem_allocator_free(allocator, (void **)&rest, sizeof(Str8));
|
wapp_mem_allocator_free(allocator, (void **)&rest, sizeof(Str8));
|
||||||
@ -399,33 +366,39 @@ DBL_LIST(Str8) *wapp_str8_rsplit_with_max(const Allocator *allocator, Str8RO *st
|
|||||||
}
|
}
|
||||||
|
|
||||||
rest = wapp_str8_alloc_substr(allocator, str, 0, rest->size);
|
rest = wapp_str8_alloc_substr(allocator, str, 0, rest->size);
|
||||||
DBL_NODE(Str8) *node = wapp_mem_allocator_alloc(allocator, sizeof(DBL_NODE(Str8)));
|
Str8Node *node = wapp_mem_allocator_alloc(allocator, sizeof(Str8Node));
|
||||||
if (node) {
|
if (node && rest) {
|
||||||
node->item = rest;
|
node->item = rest;
|
||||||
wapp_dbl_list_push_front(output, node);
|
wapp_str8_list_push_front(output, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
RETURN_STR8_SPLIT:
|
RETURN_STR8_SPLIT:
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
Str8 *wapp_str8_join(const Allocator *allocator, const DBL_LIST(Str8) *list, Str8RO *delimiter) {
|
Str8 *wapp_str8_join(const Allocator *allocator, const Str8List *list, Str8RO *delimiter) {
|
||||||
if (!allocator || !list || !delimiter) {
|
assert(allocator != NULL && list != NULL && delimiter != NULL);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
u64 capacity = wapp_str8_list_total_size(list) + (delimiter->size * (list->node_count - 1));
|
u64 capacity = wapp_str8_list_total_size(list) + (delimiter->size * (list->node_count - 1));
|
||||||
Str8 *output = wapp_str8_alloc_buf(allocator, capacity * 2);
|
Str8 *output = wapp_str8_alloc_buf(allocator, capacity * 2);
|
||||||
|
|
||||||
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
||||||
// MSVC Spectre mitigation warnings
|
// MSVC Spectre mitigation warnings
|
||||||
DBL_NODE(Str8) *node;
|
Str8Node *node;
|
||||||
u64 node_index = 0;
|
u64 node_index = 0;
|
||||||
bool running = true;
|
bool running = node_index < list->node_count;
|
||||||
while (running) {
|
while (running) {
|
||||||
node = wapp_dbl_list_get(Str8, list, node_index);
|
node = wapp_str8_list_get(list, node_index);
|
||||||
|
if (!node) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
wapp_str8_concat_capped(output, node->item);
|
wapp_str8_concat_capped(output, node->item);
|
||||||
if (node_index + 1 < list->node_count) {
|
|
||||||
|
// NOTE (Abdelrahman): Comparison extracted to variable to silence
|
||||||
|
// MSVC Spectre mitigation warnings
|
||||||
|
bool not_last = node_index + 1 < list->node_count;
|
||||||
|
if (not_last) {
|
||||||
wapp_str8_concat_capped(output, delimiter);
|
wapp_str8_concat_capped(output, delimiter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -435,3 +408,28 @@ Str8 *wapp_str8_join(const Allocator *allocator, const DBL_LIST(Str8) *list, Str
|
|||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u64 wapp_str8_list_total_size(const Str8List *list) {
|
||||||
|
if (!list) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
||||||
|
// MSVC Spectre mitigation warnings
|
||||||
|
Str8Node* node;
|
||||||
|
u64 node_index = 0;
|
||||||
|
u64 output = 0;
|
||||||
|
bool running = node_index < list->node_count;
|
||||||
|
while (running) {
|
||||||
|
node = wapp_str8_list_get(list, node_index);
|
||||||
|
if (!node) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
output += node->item->size;
|
||||||
|
++node_index;
|
||||||
|
running = node_index < list->node_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
@ -1,17 +1,13 @@
|
|||||||
#ifndef STR8_H
|
#ifndef STR8_H
|
||||||
#define STR8_H
|
#define STR8_H
|
||||||
|
|
||||||
#include "./str8_list.h"
|
|
||||||
#include "../../../common/aliases/aliases.h"
|
#include "../../../common/aliases/aliases.h"
|
||||||
#include "../../../containers/dbl_list/dbl_list.h"
|
#include "../../../common/platform/platform.h"
|
||||||
#include "../../mem/allocator/mem_allocator.h"
|
#include "../../../primitives/dbl_list/dbl_list.h"
|
||||||
|
#include "../../mem_allocator/mem_allocator.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // !__cplusplus
|
|
||||||
|
|
||||||
typedef struct str8 Str8;
|
typedef struct str8 Str8;
|
||||||
struct str8 {
|
struct str8 {
|
||||||
u64 capacity;
|
u64 capacity;
|
||||||
@ -85,18 +81,15 @@ i64 wapp_str8_rfind(Str8RO *str, Str8RO substr);
|
|||||||
*/
|
*/
|
||||||
#define wapp_str8_split(ALLOCATOR, STR, DELIMITER) wapp_str8_split_with_max(ALLOCATOR, STR, DELIMITER, -1)
|
#define wapp_str8_split(ALLOCATOR, STR, DELIMITER) wapp_str8_split_with_max(ALLOCATOR, STR, DELIMITER, -1)
|
||||||
#define wapp_str8_rsplit(ALLOCATOR, STR, DELIMITER) wapp_str8_rsplit_with_max(ALLOCATOR, STR, DELIMITER, -1)
|
#define wapp_str8_rsplit(ALLOCATOR, STR, DELIMITER) wapp_str8_rsplit_with_max(ALLOCATOR, STR, DELIMITER, -1)
|
||||||
DBL_LIST(Str8) *wapp_str8_split_with_max(const Allocator *allocator, Str8RO *str, Str8RO *delimiter, i64 max_splits);
|
Str8List *wapp_str8_split_with_max(const Allocator *allocator, Str8RO *str, Str8RO *delimiter, i64 max_splits);
|
||||||
DBL_LIST(Str8) *wapp_str8_rsplit_with_max(const Allocator *allocator, Str8RO *str, Str8RO *delimiter, i64 max_splits);
|
Str8List *wapp_str8_rsplit_with_max(const Allocator *allocator, Str8RO *str, Str8RO *delimiter, i64 max_splits);
|
||||||
Str8 *wapp_str8_join(const Allocator *allocator, const DBL_LIST(Str8) *list, Str8RO *delimiter);
|
Str8 *wapp_str8_join(const Allocator *allocator, const Str8List *list, Str8RO *delimiter);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Str8 list utilities
|
* Str8 list utilities
|
||||||
*/
|
*/
|
||||||
#define wapp_str8_node_from_cstr(STRING) wapp_dbl_list_node_from_item(Str8, &wapp_str8_lit(STRING))
|
#define wapp_str8_node_from_cstr(STRING) wapp_str8_list_node(&wapp_str8_lit(STRING))
|
||||||
#define wapp_str8_node_from_str8(STRING) wapp_dbl_list_node_from_item(Str8, &(STRING))
|
#define wapp_str8_node_from_str8(STRING) wapp_str8_list_node(&(STRING))
|
||||||
|
u64 wapp_str8_list_total_size(const Str8List *list);
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // !__cplusplus
|
|
||||||
|
|
||||||
#endif // !STR8_H
|
#endif // !STR8_H
|
10
src/primitives/wapp_primitives.c
Normal file
10
src/primitives/wapp_primitives.c
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#ifndef WAPP_PRIMITIVES_C
|
||||||
|
#define WAPP_PRIMITIVES_C
|
||||||
|
|
||||||
|
#include "wapp_primitives.h"
|
||||||
|
#include "array/array.c"
|
||||||
|
#include "dbl_list/dbl_list.c"
|
||||||
|
#include "mem_allocator/mem_allocator.c"
|
||||||
|
#include "strings/str8/str8.c"
|
||||||
|
|
||||||
|
#endif // !WAPP_PRIMITIVES_C
|
10
src/primitives/wapp_primitives.h
Normal file
10
src/primitives/wapp_primitives.h
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#ifndef WAPP_PRIMITIVES_H
|
||||||
|
#define WAPP_PRIMITIVES_H
|
||||||
|
|
||||||
|
#include "dbl_list/dbl_list.h"
|
||||||
|
#include "array/array.h"
|
||||||
|
#include "mem_allocator/mem_allocator.h"
|
||||||
|
#include "strings/str8/str8.h"
|
||||||
|
#include "../common/wapp_common.h"
|
||||||
|
|
||||||
|
#endif // !WAPP_PRIMITIVES_H
|
@ -1,5 +1,7 @@
|
|||||||
#include "xorshift.h"
|
#include "xorshift.h"
|
||||||
#include "../../common/aliases/aliases.h"
|
#include "../../common/aliases/aliases.h"
|
||||||
|
#include "../../common/platform/platform.h"
|
||||||
|
#include <assert.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
@ -11,19 +13,17 @@ struct split_mix_64_state {
|
|||||||
|
|
||||||
internal u64 rol64(u64 x, u64 bits);
|
internal u64 rol64(u64 x, u64 bits);
|
||||||
internal u64 split_mix_64(SplitMix64State *state);
|
internal u64 split_mix_64(SplitMix64State *state);
|
||||||
|
internal void seed_os_generator(void);
|
||||||
|
internal u64 generate_random_number(void);
|
||||||
|
|
||||||
XOR256State wapp_prng_xorshift_init_state(void) {
|
XOR256State wapp_prng_xorshift_init_state(void) {
|
||||||
persistent bool seeded = false;
|
persistent bool seeded = false;
|
||||||
if (!seeded) {
|
if (!seeded) {
|
||||||
seeded = true;
|
seeded = true;
|
||||||
|
seed_os_generator();
|
||||||
struct timespec ts = {0};
|
|
||||||
clock_gettime(CLOCK_MONOTONIC_RAW, &ts);
|
|
||||||
|
|
||||||
srand48(ts.tv_nsec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SplitMix64State sm64 = {.seed = lrand48()};
|
SplitMix64State sm64 = {.seed = generate_random_number()};
|
||||||
|
|
||||||
return (XOR256State){
|
return (XOR256State){
|
||||||
.x = split_mix_64(&sm64),
|
.x = split_mix_64(&sm64),
|
||||||
@ -87,3 +87,48 @@ internal u64 split_mix_64(SplitMix64State *state) {
|
|||||||
|
|
||||||
return result ^ (result >> 31);
|
return result ^ (result >> 31);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(WAPP_PLATFORM_C) && WAPP_PLATFORM_C_VERSION >= WAPP_PLATFORM_C11_VERSION
|
||||||
|
#ifdef WAPP_PLATFORM_POSIX
|
||||||
|
internal void seed_os_generator(void) {
|
||||||
|
struct timespec ts = {0};
|
||||||
|
int result = clock_gettime(CLOCK_MONOTONIC_RAW, &ts);
|
||||||
|
assert(result == 0);
|
||||||
|
|
||||||
|
srand48(ts.tv_nsec);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal u64 generate_random_number(void) {
|
||||||
|
return lrand48();
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
internal void seed_os_generator(void) {
|
||||||
|
struct timespec ts = {0};
|
||||||
|
int result = timespec_get(&ts, TIME_UTC);
|
||||||
|
assert(result != 0);
|
||||||
|
|
||||||
|
srand(ts.tv_nsec);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal u64 generate_random_number(void) {
|
||||||
|
i32 n1 = rand();
|
||||||
|
i32 n2 = rand();
|
||||||
|
|
||||||
|
return (((u64)n1) << 32 | (u64)n2);
|
||||||
|
}
|
||||||
|
#endif // !WAPP_PLATFORM_POSIX
|
||||||
|
#else
|
||||||
|
internal void seed_os_generator(void) {
|
||||||
|
time_t result = time(NULL);
|
||||||
|
assert(result != (time_t)(-1));
|
||||||
|
|
||||||
|
srand(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal u64 generate_random_number(void) {
|
||||||
|
i32 n1 = rand();
|
||||||
|
i32 n2 = rand();
|
||||||
|
|
||||||
|
return (((u64)n1) << 32 | (u64)n2);
|
||||||
|
}
|
||||||
|
#endif // !WAPP_PLATFORM_C
|
||||||
|
@ -2,10 +2,7 @@
|
|||||||
#define XORSHIFT_H
|
#define XORSHIFT_H
|
||||||
|
|
||||||
#include "../../common/aliases/aliases.h"
|
#include "../../common/aliases/aliases.h"
|
||||||
|
#include "../../common/platform/platform.h"
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
typedef struct xor_256_state XOR256State;
|
typedef struct xor_256_state XOR256State;
|
||||||
struct xor_256_state {
|
struct xor_256_state {
|
||||||
@ -20,8 +17,4 @@ u64 wapp_prng_xorshift_256(XOR256State *state);
|
|||||||
u64 wapp_prng_xorshift_256ss(XOR256State *state);
|
u64 wapp_prng_xorshift_256ss(XOR256State *state);
|
||||||
u64 wapp_prng_xorshift_256p(XOR256State *state);
|
u64 wapp_prng_xorshift_256p(XOR256State *state);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !XORSHIFT_H
|
#endif // !XORSHIFT_H
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include "tester.h"
|
#include "tester.h"
|
||||||
#include "../../common/aliases/aliases.h"
|
#include "../../common/aliases/aliases.h"
|
||||||
#include "../../core/os/shell/termcolour/termcolour.h"
|
#include "../../core/os/shell/termcolour/termcolour.h"
|
||||||
#include "../../core/strings/str8/str8.h"
|
#include "../../primitives/strings/str8/str8.h"
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -3,13 +3,9 @@
|
|||||||
|
|
||||||
#include "../../common/misc/misc_utils.h"
|
#include "../../common/misc/misc_utils.h"
|
||||||
#include "../../common/platform/platform.h"
|
#include "../../common/platform/platform.h"
|
||||||
#include "../../core/strings/str8/str8.h"
|
#include "../../primitives/strings/str8/str8.h"
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#define wapp_tester_result(PASSED) ((TestFuncResult){.name = wapp_str8_lit_ro(__func__), .passed = PASSED})
|
#define wapp_tester_result(PASSED) ((TestFuncResult){.name = wapp_str8_lit_ro(__func__), .passed = PASSED})
|
||||||
#define wapp_tester_run_tests(...) run_tests(__VA_ARGS__, NULL)
|
#define wapp_tester_run_tests(...) run_tests(__VA_ARGS__, NULL)
|
||||||
|
|
||||||
@ -27,8 +23,4 @@ typedef TestFuncResult(TestFunc)(void);
|
|||||||
|
|
||||||
void run_tests(TestFunc *func1, ...);
|
void run_tests(TestFunc *func1, ...);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !TESTER_H
|
#endif // !TESTER_H
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
#include "uuid.h"
|
#include "uuid.h"
|
||||||
#include "../common/aliases/aliases.h"
|
#include "../common/aliases/aliases.h"
|
||||||
#include "../core/strings/str8/str8.h"
|
#include "../primitives/strings/str8/str8.h"
|
||||||
#include "../prng/xorshift/xorshift.h"
|
#include "../prng/xorshift/xorshift.h"
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#define UUID_STR_FORMAT ("%.8" PRIx64 "-%.4" PRIx64 "-%.4" PRIx64 "-%.4" PRIx64 "-%.12" PRIx64)
|
#define UUID_STR_FORMAT ("%.8" PRIx64 "-%.4" PRIx64 "-%.4" PRIx64 "-%.4" PRIx64 "-%.12" PRIx64)
|
||||||
|
|
||||||
@ -17,15 +18,12 @@ internal UUID4 generate_uuid4(void);
|
|||||||
internal void uuid4_to_uuid(const UUID4* uuid4, UUID *uuid);
|
internal void uuid4_to_uuid(const UUID4* uuid4, UUID *uuid);
|
||||||
|
|
||||||
UUID *wapp_uuid_init_uuid4(UUID *uuid) {
|
UUID *wapp_uuid_init_uuid4(UUID *uuid) {
|
||||||
if (!uuid) {
|
assert(uuid != NULL);
|
||||||
goto RETURN_INIT_UUID4;
|
|
||||||
}
|
|
||||||
|
|
||||||
UUID4 uuid4 = generate_uuid4();
|
UUID4 uuid4 = generate_uuid4();
|
||||||
uuid4_to_uuid(&uuid4, uuid);
|
uuid4_to_uuid(&uuid4, uuid);
|
||||||
|
|
||||||
RETURN_INIT_UUID4:
|
return uuid;
|
||||||
return uuid;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal UUID4 generate_uuid4(void) {
|
internal UUID4 generate_uuid4(void) {
|
||||||
|
@ -2,11 +2,8 @@
|
|||||||
#define UUID_H
|
#define UUID_H
|
||||||
|
|
||||||
#include "../common/aliases/aliases.h"
|
#include "../common/aliases/aliases.h"
|
||||||
#include "../core/strings/str8/str8.h"
|
#include "../common/platform/platform.h"
|
||||||
|
#include "../primitives/strings/str8/str8.h"
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#define UUID_BUF_LENGTH 48
|
#define UUID_BUF_LENGTH 48
|
||||||
#define WAPP_UUID_SPEC WAPP_STR8_SPEC
|
#define WAPP_UUID_SPEC WAPP_STR8_SPEC
|
||||||
@ -24,11 +21,7 @@ struct uuid {
|
|||||||
#define wapp_uuid_create() ((UUID){.uuid = wapp_str8_buf(UUID_BUF_LENGTH)})
|
#define wapp_uuid_create() ((UUID){.uuid = wapp_str8_buf(UUID_BUF_LENGTH)})
|
||||||
|
|
||||||
// Just returns the same pointer that was passed in with the UUID initialised.
|
// Just returns the same pointer that was passed in with the UUID initialised.
|
||||||
// If the pointer is NULL, it skips initialisation.
|
// Fails when passed a NULL pointer.
|
||||||
UUID *wapp_uuid_init_uuid4(UUID *uuid);
|
UUID *wapp_uuid_init_uuid4(UUID *uuid);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !UUID_H
|
#endif // !UUID_H
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#define WAPP_UUID_C
|
#define WAPP_UUID_C
|
||||||
|
|
||||||
#include "uuid.c"
|
#include "uuid.c"
|
||||||
#include "../core/wapp_core.c"
|
#include "../primitives/wapp_primitives.c"
|
||||||
#include "../prng/wapp_prng.c"
|
#include "../prng/wapp_prng.c"
|
||||||
|
|
||||||
#endif // !WAPP_UUID_C
|
#endif // !WAPP_UUID_C
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include "uuid.h"
|
#include "uuid.h"
|
||||||
#include "../common/wapp_common.h"
|
#include "../common/wapp_common.h"
|
||||||
#include "../core/wapp_core.h"
|
#include "../primitives/wapp_primitives.h"
|
||||||
#include "../prng/wapp_prng.h"
|
#include "../prng/wapp_prng.h"
|
||||||
|
|
||||||
#endif // !WAPP_UUID_H
|
#endif // !WAPP_UUID_H
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#define WAPP_C
|
#define WAPP_C
|
||||||
|
|
||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
#include "containers/wapp_containers.c"
|
#include "primitives/wapp_primitives.c"
|
||||||
#include "core/wapp_core.c"
|
#include "core/wapp_core.c"
|
||||||
#include "prng/wapp_prng.c"
|
#include "prng/wapp_prng.c"
|
||||||
#include "uuid/uuid.c"
|
#include "uuid/uuid.c"
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#define WAPP_H
|
#define WAPP_H
|
||||||
|
|
||||||
#include "common/wapp_common.h"
|
#include "common/wapp_common.h"
|
||||||
#include "containers/wapp_containers.h"
|
#include "primitives/wapp_primitives.h"
|
||||||
#include "core/wapp_core.h"
|
#include "core/wapp_core.h"
|
||||||
#include "prng/wapp_prng.h"
|
#include "prng/wapp_prng.h"
|
||||||
#include "uuid/wapp_uuid.h"
|
#include "uuid/wapp_uuid.h"
|
||||||
|
@ -3,14 +3,6 @@
|
|||||||
|
|
||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
TestFuncResult test_arena_allocator(void);
|
TestFuncResult test_arena_allocator(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !TEST_ALLOCATOR_H
|
#endif // !TEST_ALLOCATOR_H
|
||||||
|
@ -3,10 +3,6 @@
|
|||||||
|
|
||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
TestFuncResult test_arena_init(void);
|
TestFuncResult test_arena_init(void);
|
||||||
TestFuncResult test_arena_init_succeeds_when_reserving_very_large_size(void);
|
TestFuncResult test_arena_init_succeeds_when_reserving_very_large_size(void);
|
||||||
TestFuncResult test_arena_alloc_succeeds_when_within_capacity(void);
|
TestFuncResult test_arena_alloc_succeeds_when_within_capacity(void);
|
||||||
@ -16,8 +12,4 @@ TestFuncResult test_arena_realloc_smaller_size(void);
|
|||||||
TestFuncResult test_arena_clear(void);
|
TestFuncResult test_arena_clear(void);
|
||||||
TestFuncResult test_arena_destroy(void);
|
TestFuncResult test_arena_destroy(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !TEST_ARENA_H
|
#endif // !TEST_ARENA_H
|
||||||
|
271
tests/array/test_i32_array.c
Normal file
271
tests/array/test_i32_array.c
Normal file
@ -0,0 +1,271 @@
|
|||||||
|
#include "test_i32_array.h"
|
||||||
|
#include "wapp.h"
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
TestFuncResult test_i32_array(void) {
|
||||||
|
bool result;
|
||||||
|
|
||||||
|
I32Array array = wapp_i32_array(1, 2, 3, 4, 5, 6, 7);
|
||||||
|
result = array.count == 7 && array.capacity == 16;
|
||||||
|
|
||||||
|
i32 *item;
|
||||||
|
u64 count = array.count;
|
||||||
|
u64 index = 0;
|
||||||
|
bool running = true;
|
||||||
|
while (running) {
|
||||||
|
item = wapp_i32_array_get(&array, index);
|
||||||
|
result = result && item && (*item == (i32)(index + 1));
|
||||||
|
|
||||||
|
++index;
|
||||||
|
running = index < count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return wapp_tester_result(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestFuncResult test_i32_array_with_capacity(void) {
|
||||||
|
bool result;
|
||||||
|
|
||||||
|
I32Array array = wapp_i32_array_with_capacity(64);
|
||||||
|
result = array.count == 0 && array.capacity == 64;
|
||||||
|
|
||||||
|
return wapp_tester_result(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestFuncResult test_i32_array_get(void) {
|
||||||
|
bool result = true;
|
||||||
|
|
||||||
|
I32Array array = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
|
|
||||||
|
i32 *item;
|
||||||
|
u64 count = array.count;
|
||||||
|
u64 index = 0;
|
||||||
|
bool running = true;
|
||||||
|
while (running) {
|
||||||
|
item = wapp_i32_array_get(&array, index);
|
||||||
|
result = result && item && (*item == (i32)index);
|
||||||
|
|
||||||
|
++index;
|
||||||
|
running = index < count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return wapp_tester_result(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestFuncResult test_i32_array_set(void) {
|
||||||
|
bool result = true;
|
||||||
|
|
||||||
|
I32Array array = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
|
|
||||||
|
i32 *item;
|
||||||
|
u64 count = array.count;
|
||||||
|
u64 index = 0;
|
||||||
|
bool running = true;
|
||||||
|
while (running) {
|
||||||
|
i32 num = (i32)(index * 2);
|
||||||
|
wapp_i32_array_set(&array, index, &num);
|
||||||
|
item = wapp_i32_array_get(&array, index);
|
||||||
|
result = result && item && (*item == (i32)(index * 2));
|
||||||
|
|
||||||
|
++index;
|
||||||
|
running = index < count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return wapp_tester_result(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestFuncResult test_i32_array_append_capped(void) {
|
||||||
|
bool result;
|
||||||
|
|
||||||
|
I32Array array = wapp_i32_array_with_capacity(64);
|
||||||
|
wapp_i32_array_append_capped(&array, &((i32){10}));
|
||||||
|
|
||||||
|
result = array.count == 1;
|
||||||
|
i32 *item = wapp_i32_array_get(&array, 0);
|
||||||
|
result = result && item && *item == 10;
|
||||||
|
|
||||||
|
array = wapp_i32_array(1);
|
||||||
|
wapp_i32_array_append_capped(&array, &((i32){10}));
|
||||||
|
|
||||||
|
result = result && array.count == 2;
|
||||||
|
|
||||||
|
return wapp_tester_result(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestFuncResult test_i32_array_extend_capped(void) {
|
||||||
|
bool result;
|
||||||
|
|
||||||
|
I32Array array1 = wapp_i32_array(1, 2, 3, 4);
|
||||||
|
I32Array array2 = wapp_i32_array(10, 20);
|
||||||
|
|
||||||
|
result = array1.count == 4 && array2.count == 2;
|
||||||
|
|
||||||
|
wapp_i32_array_extend_capped(&array1, &array2);
|
||||||
|
|
||||||
|
result = result && array1.count == 6;
|
||||||
|
|
||||||
|
return wapp_tester_result(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestFuncResult test_i32_array_clear(void) {
|
||||||
|
bool result;
|
||||||
|
|
||||||
|
I32Array array = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
|
result = array.count == 9;
|
||||||
|
|
||||||
|
wapp_i32_array_clear(&array);
|
||||||
|
|
||||||
|
result = result && array.count == 0;
|
||||||
|
|
||||||
|
return wapp_tester_result(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestFuncResult test_i32_array_pop(void) {
|
||||||
|
bool result;
|
||||||
|
|
||||||
|
I32Array array1 = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
|
I32Array array2 = wapp_i32_array_with_capacity(32);
|
||||||
|
|
||||||
|
i32 item1 = wapp_i32_array_pop(&array1);
|
||||||
|
i32 item2 = wapp_i32_array_pop(&array2);
|
||||||
|
|
||||||
|
result = item1 == 8 && item2 == 0;
|
||||||
|
|
||||||
|
return wapp_tester_result(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestFuncResult test_i32_array_copy_capped(void) {
|
||||||
|
bool result;
|
||||||
|
|
||||||
|
I32Array src = wapp_i32_array(1, 2, 3, 4, 5);
|
||||||
|
I32Array dst1 = wapp_i32_array(1, 2, 3, 4, 5, 6);
|
||||||
|
I32Array dst2 = wapp_i32_array(1, 2);
|
||||||
|
|
||||||
|
u64 expected_count = 5;
|
||||||
|
wapp_i32_array_copy_capped(&src, &dst1);
|
||||||
|
result = dst1.count == expected_count;
|
||||||
|
|
||||||
|
u64 index = 0;
|
||||||
|
bool running = true;
|
||||||
|
while (running) {
|
||||||
|
result = result && (*wapp_i32_array_get(&src, index) == *wapp_i32_array_get(&dst1, index));
|
||||||
|
|
||||||
|
++index;
|
||||||
|
running = index < expected_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
expected_count = 4;
|
||||||
|
wapp_i32_array_copy_capped(&src, &dst2);
|
||||||
|
result = result && dst2.count == expected_count;
|
||||||
|
|
||||||
|
index = 0;
|
||||||
|
running = true;
|
||||||
|
while (running) {
|
||||||
|
result = result && (*wapp_i32_array_get(&src, index) == *wapp_i32_array_get(&dst2, index));
|
||||||
|
|
||||||
|
++index;
|
||||||
|
running = index < expected_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return wapp_tester_result(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestFuncResult test_i32_array_alloc_capacity(void) {
|
||||||
|
bool result;
|
||||||
|
|
||||||
|
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
||||||
|
u64 capacity = 32;
|
||||||
|
I32Array *array = wapp_i32_array_alloc_capacity(&allocator, capacity);
|
||||||
|
|
||||||
|
result = array && array->capacity == capacity;
|
||||||
|
|
||||||
|
wapp_mem_arena_allocator_destroy(&allocator);
|
||||||
|
|
||||||
|
return wapp_tester_result(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestFuncResult test_i32_array_append_alloc(void) {
|
||||||
|
bool result;
|
||||||
|
|
||||||
|
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
||||||
|
I32Array array1 = wapp_i32_array(1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
|
I32Array array2 = wapp_i32_array(1, 2);
|
||||||
|
|
||||||
|
I32Array *arr_ptr = wapp_i32_array_append_alloc(&allocator, &array1, &((i32){10}));
|
||||||
|
result = arr_ptr == &array1;
|
||||||
|
|
||||||
|
u64 count = 4;
|
||||||
|
u64 index = 0;
|
||||||
|
bool running = true;
|
||||||
|
while (running) {
|
||||||
|
i32 num = (i32)index;
|
||||||
|
arr_ptr = wapp_i32_array_append_alloc(&allocator, &array2, &num);
|
||||||
|
|
||||||
|
++index;
|
||||||
|
running = index < count;
|
||||||
|
}
|
||||||
|
result = result && arr_ptr != &array2;
|
||||||
|
|
||||||
|
wapp_mem_arena_allocator_destroy(&allocator);
|
||||||
|
|
||||||
|
return wapp_tester_result(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestFuncResult test_i32_array_extend_alloc(void) {
|
||||||
|
bool result;
|
||||||
|
|
||||||
|
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
||||||
|
I32Array array1 = wapp_i32_array(1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
|
I32Array array2 = wapp_i32_array(1, 2);
|
||||||
|
I32Array array3 = wapp_i32_array(1, 2, 3, 4);
|
||||||
|
|
||||||
|
I32Array *arr_ptr = wapp_i32_array_extend_alloc(&allocator, &array1, &array3);
|
||||||
|
result = arr_ptr == &array1;
|
||||||
|
|
||||||
|
arr_ptr = wapp_i32_array_extend_alloc(&allocator, &array2, &array3);
|
||||||
|
result = result && arr_ptr != &array2;
|
||||||
|
|
||||||
|
wapp_mem_arena_allocator_destroy(&allocator);
|
||||||
|
|
||||||
|
return wapp_tester_result(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestFuncResult test_i32_array_copy_alloc(void) {
|
||||||
|
bool result;
|
||||||
|
|
||||||
|
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
||||||
|
I32Array src = wapp_i32_array(1, 2, 3, 4, 5);
|
||||||
|
I32Array dst1 = wapp_i32_array(1, 2, 3, 4, 5, 6);
|
||||||
|
I32Array dst2 = wapp_i32_array(1, 2);
|
||||||
|
I32Array *array_ptr = NULL;
|
||||||
|
|
||||||
|
u64 expected_count = 5;
|
||||||
|
array_ptr = wapp_i32_array_copy_alloc(&allocator, &src, &dst1);
|
||||||
|
result = array_ptr->count == expected_count && array_ptr == &dst1;
|
||||||
|
|
||||||
|
u64 index = 0;
|
||||||
|
bool running = true;
|
||||||
|
while (running) {
|
||||||
|
result = result && (*wapp_i32_array_get(&src, index) == *wapp_i32_array_get(array_ptr, index));
|
||||||
|
|
||||||
|
++index;
|
||||||
|
running = index < expected_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
expected_count = 5;
|
||||||
|
array_ptr = wapp_i32_array_copy_alloc(&allocator, &src, &dst2);
|
||||||
|
result = result && array_ptr->count == expected_count && array_ptr != &dst2;
|
||||||
|
|
||||||
|
index = 0;
|
||||||
|
running = true;
|
||||||
|
while (running) {
|
||||||
|
result = result && (*wapp_i32_array_get(&src, index) == *wapp_i32_array_get(array_ptr, index));
|
||||||
|
|
||||||
|
++index;
|
||||||
|
running = index < expected_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
wapp_mem_arena_allocator_destroy(&allocator);
|
||||||
|
|
||||||
|
return wapp_tester_result(result);
|
||||||
|
}
|
20
tests/array/test_i32_array.h
Normal file
20
tests/array/test_i32_array.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#ifndef TEST_INT_ARRAY_H
|
||||||
|
#define TEST_INT_ARRAY_H
|
||||||
|
|
||||||
|
#include "wapp.h"
|
||||||
|
|
||||||
|
TestFuncResult test_i32_array(void);
|
||||||
|
TestFuncResult test_i32_array_with_capacity(void);
|
||||||
|
TestFuncResult test_i32_array_get(void);
|
||||||
|
TestFuncResult test_i32_array_set(void);
|
||||||
|
TestFuncResult test_i32_array_append_capped(void);
|
||||||
|
TestFuncResult test_i32_array_extend_capped(void);
|
||||||
|
TestFuncResult test_i32_array_clear(void);
|
||||||
|
TestFuncResult test_i32_array_pop(void);
|
||||||
|
TestFuncResult test_i32_array_copy_capped(void);
|
||||||
|
TestFuncResult test_i32_array_alloc_capacity(void);
|
||||||
|
TestFuncResult test_i32_array_append_alloc(void);
|
||||||
|
TestFuncResult test_i32_array_extend_alloc(void);
|
||||||
|
TestFuncResult test_i32_array_copy_alloc(void);
|
||||||
|
|
||||||
|
#endif // !TEST_INT_ARRAY_H
|
@ -17,16 +17,16 @@ TestFuncResult test_cpath_join_path(void) {
|
|||||||
wapp_str8_format(&expected, "%chome%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP, PATH_SEP);
|
wapp_str8_format(&expected, "%chome%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP, PATH_SEP);
|
||||||
wapp_str8_format(&tmp, "%c", PATH_SEP);
|
wapp_str8_format(&tmp, "%c", PATH_SEP);
|
||||||
|
|
||||||
DBL_LIST(Str8) parts = {0};
|
Str8List parts = {0};
|
||||||
wapp_dbl_list_push_back(&parts, &wapp_str8_node_from_str8(tmp));
|
wapp_str8_list_push_back(&parts, &wapp_str8_node_from_str8(tmp));
|
||||||
wapp_dbl_list_push_back(&parts, &wapp_str8_node_from_cstr("home"));
|
wapp_str8_list_push_back(&parts, &wapp_str8_node_from_cstr("home"));
|
||||||
wapp_dbl_list_push_back(&parts, &wapp_str8_node_from_cstr("abdelrahman"));
|
wapp_str8_list_push_back(&parts, &wapp_str8_node_from_cstr("abdelrahman"));
|
||||||
wapp_dbl_list_push_back(&parts, &wapp_str8_node_from_cstr("Documents"));
|
wapp_str8_list_push_back(&parts, &wapp_str8_node_from_cstr("Documents"));
|
||||||
|
|
||||||
wapp_cpath_join_path(&out, &parts);
|
wapp_cpath_join_path(&out, &parts);
|
||||||
result = wapp_str8_equal(&out, &expected);
|
result = wapp_str8_equal(&out, &expected);
|
||||||
|
|
||||||
wapp_dbl_list_pop_front(Str8, &parts);
|
wapp_str8_list_pop_front(&parts);
|
||||||
|
|
||||||
wapp_str8_format(&expected, "home%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP);
|
wapp_str8_format(&expected, "home%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP);
|
||||||
|
|
||||||
@ -34,8 +34,8 @@ TestFuncResult test_cpath_join_path(void) {
|
|||||||
result = result && wapp_str8_equal(&out, &expected);
|
result = result && wapp_str8_equal(&out, &expected);
|
||||||
|
|
||||||
wapp_str8_concat_capped(&tmp, &wapp_str8_lit_ro("home"));
|
wapp_str8_concat_capped(&tmp, &wapp_str8_lit_ro("home"));
|
||||||
wapp_dbl_list_pop_front(Str8, &parts);
|
wapp_str8_list_pop_front(&parts);
|
||||||
wapp_dbl_list_push_front(&parts, &wapp_str8_node_from_str8(tmp));
|
wapp_str8_list_push_front(&parts, &wapp_str8_node_from_str8(tmp));
|
||||||
|
|
||||||
wapp_str8_format(&expected, "%chome%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP, PATH_SEP);
|
wapp_str8_format(&expected, "%chome%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP, PATH_SEP);
|
||||||
|
|
||||||
@ -43,35 +43,35 @@ TestFuncResult test_cpath_join_path(void) {
|
|||||||
result = result && wapp_str8_equal(&out, &expected);
|
result = result && wapp_str8_equal(&out, &expected);
|
||||||
|
|
||||||
wapp_str8_format(&tmp, "home%c", PATH_SEP);
|
wapp_str8_format(&tmp, "home%c", PATH_SEP);
|
||||||
wapp_dbl_list_pop_front(Str8, &parts);
|
wapp_str8_list_pop_front(&parts);
|
||||||
wapp_dbl_list_push_front(&parts, &wapp_str8_node_from_cstr("home"));
|
wapp_str8_list_push_front(&parts, &wapp_str8_node_from_cstr("home"));
|
||||||
|
|
||||||
wapp_str8_format(&expected, "home%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP);
|
wapp_str8_format(&expected, "home%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP);
|
||||||
|
|
||||||
wapp_cpath_join_path(&out, &parts);
|
wapp_cpath_join_path(&out, &parts);
|
||||||
result = result && wapp_str8_equal(&out, &expected);
|
result = result && wapp_str8_equal(&out, &expected);
|
||||||
|
|
||||||
wapp_dbl_list_empty(&parts);
|
wapp_str8_list_empty(&parts);
|
||||||
|
|
||||||
wapp_str8_format(&tmp, "%chome", PATH_SEP);
|
wapp_str8_format(&tmp, "%chome", PATH_SEP);
|
||||||
wapp_dbl_list_push_back(&parts, &wapp_str8_node_from_str8(tmp));
|
wapp_str8_list_push_back(&parts, &wapp_str8_node_from_str8(tmp));
|
||||||
wapp_dbl_list_push_back(&parts, &wapp_str8_node_from_cstr(""));
|
wapp_str8_list_push_back(&parts, &wapp_str8_node_from_cstr(""));
|
||||||
|
|
||||||
wapp_str8_format(&expected, "%chome", PATH_SEP);
|
wapp_str8_format(&expected, "%chome", PATH_SEP);
|
||||||
|
|
||||||
wapp_cpath_join_path(&out, &parts);
|
wapp_cpath_join_path(&out, &parts);
|
||||||
result = result && wapp_str8_equal(&out, &expected);
|
result = result && wapp_str8_equal(&out, &expected);
|
||||||
|
|
||||||
wapp_dbl_list_pop_front(Str8, &parts);
|
wapp_str8_list_pop_front(&parts);
|
||||||
wapp_dbl_list_push_back(&parts, &wapp_str8_node_from_cstr(""));
|
wapp_str8_list_push_back(&parts, &wapp_str8_node_from_cstr(""));
|
||||||
|
|
||||||
wapp_str8_format(&expected, "%s", "");
|
wapp_str8_format(&expected, "%s", "");
|
||||||
|
|
||||||
wapp_cpath_join_path(&out, &parts);
|
wapp_cpath_join_path(&out, &parts);
|
||||||
result = result && wapp_str8_equal(&out, &expected);
|
result = result && wapp_str8_equal(&out, &expected);
|
||||||
|
|
||||||
wapp_dbl_list_pop_back(Str8, &parts);
|
wapp_str8_list_pop_back(&parts);
|
||||||
wapp_dbl_list_push_back(&parts, &wapp_str8_node_from_cstr("home"));
|
wapp_str8_list_push_back(&parts, &wapp_str8_node_from_cstr("home"));
|
||||||
|
|
||||||
wapp_str8_copy_cstr_capped(&expected, "home");
|
wapp_str8_copy_cstr_capped(&expected, "home");
|
||||||
|
|
||||||
|
@ -3,16 +3,8 @@
|
|||||||
|
|
||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
TestFuncResult test_cpath_join_path(void);
|
TestFuncResult test_cpath_join_path(void);
|
||||||
TestFuncResult test_cpath_dirname(void);
|
TestFuncResult test_cpath_dirname(void);
|
||||||
TestFuncResult test_cpath_dirup(void);
|
TestFuncResult test_cpath_dirup(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !TEST_CPATH_H
|
#endif // !TEST_CPATH_H
|
||||||
|
@ -6,9 +6,9 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
TestFuncResult test_commander_cmd_success(void) {
|
TestFuncResult test_commander_cmd_success(void) {
|
||||||
DBL_LIST(Str8) cmd = {0};
|
Str8List cmd = {0};
|
||||||
wapp_dbl_list_push_back(&cmd, &wapp_str8_node_from_cstr("echo"));
|
wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr("echo"));
|
||||||
wapp_dbl_list_push_back(&cmd, &wapp_str8_node_from_cstr("hello world"));
|
wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr("hello world"));
|
||||||
|
|
||||||
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_DISCARD, NULL, &cmd);
|
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_DISCARD, NULL, &cmd);
|
||||||
bool succeeded = result.exited && result.exit_code == EXIT_SUCCESS &&
|
bool succeeded = result.exited && result.exit_code == EXIT_SUCCESS &&
|
||||||
@ -18,8 +18,8 @@ TestFuncResult test_commander_cmd_success(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_commander_cmd_failure(void) {
|
TestFuncResult test_commander_cmd_failure(void) {
|
||||||
DBL_LIST(Str8) cmd = {0};
|
Str8List cmd = {0};
|
||||||
wapp_dbl_list_push_back(&cmd, &wapp_str8_node_from_cstr("grep"));
|
wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr("grep"));
|
||||||
|
|
||||||
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_DISCARD, NULL, &cmd);
|
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_DISCARD, NULL, &cmd);
|
||||||
bool failed = result.exited && result.exit_code != EXIT_SUCCESS &&
|
bool failed = result.exited && result.exit_code != EXIT_SUCCESS &&
|
||||||
@ -34,9 +34,9 @@ TestFuncResult test_commander_cmd_out_buf_success(void) {
|
|||||||
char msg[] = "hello world";
|
char msg[] = "hello world";
|
||||||
wapp_str8_copy_cstr_capped(&expected, msg);
|
wapp_str8_copy_cstr_capped(&expected, msg);
|
||||||
|
|
||||||
DBL_LIST(Str8) cmd = {0};
|
Str8List cmd = {0};
|
||||||
wapp_dbl_list_push_back(&cmd, &wapp_str8_node_from_cstr("echo"));
|
wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr("echo"));
|
||||||
wapp_dbl_list_push_back(&cmd, &wapp_str8_node_from_cstr(msg));
|
wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr(msg));
|
||||||
|
|
||||||
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_CAPTURE, &buf, &cmd);
|
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_CAPTURE, &buf, &cmd);
|
||||||
bool succeeded = result.exited && result.exit_code == EXIT_SUCCESS &&
|
bool succeeded = result.exited && result.exit_code == EXIT_SUCCESS &&
|
||||||
@ -51,9 +51,9 @@ TestFuncResult test_commander_cmd_out_buf_failure(void) {
|
|||||||
char msg[] = "hello world";
|
char msg[] = "hello world";
|
||||||
wapp_str8_copy_cstr_capped(&expected, msg);
|
wapp_str8_copy_cstr_capped(&expected, msg);
|
||||||
|
|
||||||
DBL_LIST(Str8) cmd = {0};
|
Str8List cmd = {0};
|
||||||
wapp_dbl_list_push_back(&cmd, &wapp_str8_node_from_cstr("echo"));
|
wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr("echo"));
|
||||||
wapp_dbl_list_push_back(&cmd, &wapp_str8_node_from_cstr(msg));
|
wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr(msg));
|
||||||
|
|
||||||
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_CAPTURE, &buf, &cmd);
|
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_CAPTURE, &buf, &cmd);
|
||||||
bool failed = !result.exited && result.exit_code != EXIT_SUCCESS &&
|
bool failed = !result.exited && result.exit_code != EXIT_SUCCESS &&
|
||||||
|
@ -3,17 +3,9 @@
|
|||||||
|
|
||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
TestFuncResult test_commander_cmd_success(void);
|
TestFuncResult test_commander_cmd_success(void);
|
||||||
TestFuncResult test_commander_cmd_failure(void);
|
TestFuncResult test_commander_cmd_failure(void);
|
||||||
TestFuncResult test_commander_cmd_out_buf_success(void);
|
TestFuncResult test_commander_cmd_out_buf_success(void);
|
||||||
TestFuncResult test_commander_cmd_out_buf_failure(void);
|
TestFuncResult test_commander_cmd_out_buf_failure(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !TEST_SHELL_COMMANDER_H
|
#endif // !TEST_SHELL_COMMANDER_H
|
||||||
|
@ -416,8 +416,8 @@ TestFuncResult test_str8_split(void) {
|
|||||||
Str8 str = wapp_str8_lit("hello world from me");
|
Str8 str = wapp_str8_lit("hello world from me");
|
||||||
Str8 delim1 = wapp_str8_lit(" ");
|
Str8 delim1 = wapp_str8_lit(" ");
|
||||||
Str8 delim2 = wapp_str8_lit("from");
|
Str8 delim2 = wapp_str8_lit("from");
|
||||||
DBL_LIST(Str8) *list1 = wapp_str8_split(&arena, &str, &delim1);
|
Str8List *list1 = wapp_str8_split(&arena, &str, &delim1);
|
||||||
DBL_LIST(Str8) *list2 = wapp_str8_split(&arena, &str, &delim2);
|
Str8List *list2 = wapp_str8_split(&arena, &str, &delim2);
|
||||||
|
|
||||||
Str8RO splits1[] = {
|
Str8RO splits1[] = {
|
||||||
wapp_str8_slice(&str, 0, 5),
|
wapp_str8_slice(&str, 0, 5),
|
||||||
@ -444,7 +444,7 @@ TestFuncResult test_str8_split(void) {
|
|||||||
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
||||||
// MSVC Spectre mitigation warnings
|
// MSVC Spectre mitigation warnings
|
||||||
while (running1) {
|
while (running1) {
|
||||||
DBL_NODE(Str8) *node = wapp_dbl_list_get(Str8, list1, index1);
|
Str8Node *node = wapp_str8_list_get(list1, index1);
|
||||||
result = result && wapp_str8_equal(node->item, &(splits1[index1]));
|
result = result && wapp_str8_equal(node->item, &(splits1[index1]));
|
||||||
|
|
||||||
++index1;
|
++index1;
|
||||||
@ -454,7 +454,7 @@ TestFuncResult test_str8_split(void) {
|
|||||||
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
||||||
// MSVC Spectre mitigation warnings
|
// MSVC Spectre mitigation warnings
|
||||||
while (running2) {
|
while (running2) {
|
||||||
DBL_NODE(Str8) *node = wapp_dbl_list_get(Str8, list2, index2);
|
Str8Node *node = wapp_str8_list_get(list2, index2);
|
||||||
result = result && wapp_str8_equal(node->item, &(splits2[index2]));
|
result = result && wapp_str8_equal(node->item, &(splits2[index2]));
|
||||||
|
|
||||||
++index2;
|
++index2;
|
||||||
@ -472,7 +472,7 @@ TestFuncResult test_str8_split_with_max(void) {
|
|||||||
|
|
||||||
Str8 str = wapp_str8_lit("hello world from me");
|
Str8 str = wapp_str8_lit("hello world from me");
|
||||||
Str8 delim = wapp_str8_lit(" ");
|
Str8 delim = wapp_str8_lit(" ");
|
||||||
DBL_LIST(Str8) *list = wapp_str8_split_with_max(&arena, &str, &delim, 2);
|
Str8List *list = wapp_str8_split_with_max(&arena, &str, &delim, 2);
|
||||||
|
|
||||||
Str8RO splits[] = {
|
Str8RO splits[] = {
|
||||||
wapp_str8_slice(&str, 0, 5),
|
wapp_str8_slice(&str, 0, 5),
|
||||||
@ -489,7 +489,7 @@ TestFuncResult test_str8_split_with_max(void) {
|
|||||||
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
||||||
// MSVC Spectre mitigation warnings
|
// MSVC Spectre mitigation warnings
|
||||||
while (running) {
|
while (running) {
|
||||||
DBL_NODE(Str8) *node = wapp_dbl_list_get(Str8, list, index);
|
Str8Node *node = wapp_str8_list_get(list, index);
|
||||||
result = result && wapp_str8_equal(node->item, &(splits[index]));
|
result = result && wapp_str8_equal(node->item, &(splits[index]));
|
||||||
|
|
||||||
++index;
|
++index;
|
||||||
@ -508,8 +508,8 @@ TestFuncResult test_str8_rsplit(void) {
|
|||||||
Str8 str = wapp_str8_lit("hello world from me");
|
Str8 str = wapp_str8_lit("hello world from me");
|
||||||
Str8 delim1 = wapp_str8_lit(" ");
|
Str8 delim1 = wapp_str8_lit(" ");
|
||||||
Str8 delim2 = wapp_str8_lit("from");
|
Str8 delim2 = wapp_str8_lit("from");
|
||||||
DBL_LIST(Str8) *list1 = wapp_str8_rsplit(&arena, &str, &delim1);
|
Str8List *list1 = wapp_str8_rsplit(&arena, &str, &delim1);
|
||||||
DBL_LIST(Str8) *list2 = wapp_str8_rsplit(&arena, &str, &delim2);
|
Str8List *list2 = wapp_str8_rsplit(&arena, &str, &delim2);
|
||||||
|
|
||||||
Str8RO splits1[] = {
|
Str8RO splits1[] = {
|
||||||
wapp_str8_slice(&str, 0, 5),
|
wapp_str8_slice(&str, 0, 5),
|
||||||
@ -536,7 +536,7 @@ TestFuncResult test_str8_rsplit(void) {
|
|||||||
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
||||||
// MSVC Spectre mitigation warnings
|
// MSVC Spectre mitigation warnings
|
||||||
while (running1) {
|
while (running1) {
|
||||||
DBL_NODE(Str8) *node = wapp_dbl_list_get(Str8, list1, index1);
|
Str8Node *node = wapp_str8_list_get(list1, index1);
|
||||||
result = result && wapp_str8_equal(node->item, &(splits1[index1]));
|
result = result && wapp_str8_equal(node->item, &(splits1[index1]));
|
||||||
|
|
||||||
++index1;
|
++index1;
|
||||||
@ -546,7 +546,7 @@ TestFuncResult test_str8_rsplit(void) {
|
|||||||
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
||||||
// MSVC Spectre mitigation warnings
|
// MSVC Spectre mitigation warnings
|
||||||
while (running2) {
|
while (running2) {
|
||||||
DBL_NODE(Str8) *node = wapp_dbl_list_get(Str8, list2, index2);
|
Str8Node *node = wapp_str8_list_get(list2, index2);
|
||||||
result = result && wapp_str8_equal(node->item, &(splits2[index2]));
|
result = result && wapp_str8_equal(node->item, &(splits2[index2]));
|
||||||
|
|
||||||
++index2;
|
++index2;
|
||||||
@ -564,7 +564,7 @@ TestFuncResult test_str8_rsplit_with_max(void) {
|
|||||||
|
|
||||||
Str8 str = wapp_str8_lit("hello world from me");
|
Str8 str = wapp_str8_lit("hello world from me");
|
||||||
Str8 delim = wapp_str8_lit(" ");
|
Str8 delim = wapp_str8_lit(" ");
|
||||||
DBL_LIST(Str8) *list = wapp_str8_rsplit_with_max(&arena, &str, &delim, 2);
|
Str8List *list = wapp_str8_rsplit_with_max(&arena, &str, &delim, 2);
|
||||||
|
|
||||||
Str8RO splits[] = {
|
Str8RO splits[] = {
|
||||||
wapp_str8_slice(&str, 0, 11),
|
wapp_str8_slice(&str, 0, 11),
|
||||||
@ -581,7 +581,7 @@ TestFuncResult test_str8_rsplit_with_max(void) {
|
|||||||
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
||||||
// MSVC Spectre mitigation warnings
|
// MSVC Spectre mitigation warnings
|
||||||
while (running) {
|
while (running) {
|
||||||
DBL_NODE(Str8) *node = wapp_dbl_list_get(Str8, list, index);
|
Str8Node *node = wapp_str8_list_get(list, index);
|
||||||
result = result && wapp_str8_equal(node->item, &(splits[index]));
|
result = result && wapp_str8_equal(node->item, &(splits[index]));
|
||||||
|
|
||||||
++index;
|
++index;
|
||||||
@ -600,8 +600,8 @@ TestFuncResult test_str8_join(void) {
|
|||||||
Str8 str = wapp_str8_lit("hello world from me");
|
Str8 str = wapp_str8_lit("hello world from me");
|
||||||
Str8 delim1 = wapp_str8_lit(" ");
|
Str8 delim1 = wapp_str8_lit(" ");
|
||||||
Str8 delim2 = wapp_str8_lit("from");
|
Str8 delim2 = wapp_str8_lit("from");
|
||||||
DBL_LIST(Str8) *list1 = wapp_str8_rsplit(&arena, &str, &delim1);
|
Str8List *list1 = wapp_str8_rsplit(&arena, &str, &delim1);
|
||||||
DBL_LIST(Str8) *list2 = wapp_str8_rsplit(&arena, &str, &delim2);
|
Str8List *list2 = wapp_str8_rsplit(&arena, &str, &delim2);
|
||||||
Str8 *join1 = wapp_str8_join(&arena, list1, &delim1);
|
Str8 *join1 = wapp_str8_join(&arena, list1, &delim1);
|
||||||
Str8 *join2 = wapp_str8_join(&arena, list2, &delim2);
|
Str8 *join2 = wapp_str8_join(&arena, list2, &delim2);
|
||||||
|
|
||||||
|
@ -3,10 +3,6 @@
|
|||||||
|
|
||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
TestFuncResult test_str8_lit(void);
|
TestFuncResult test_str8_lit(void);
|
||||||
TestFuncResult test_str8_lit_ro(void);
|
TestFuncResult test_str8_lit_ro(void);
|
||||||
TestFuncResult test_str8_buf(void);
|
TestFuncResult test_str8_buf(void);
|
||||||
@ -33,8 +29,4 @@ TestFuncResult test_str8_rsplit(void);
|
|||||||
TestFuncResult test_str8_rsplit_with_max(void);
|
TestFuncResult test_str8_rsplit_with_max(void);
|
||||||
TestFuncResult test_str8_join(void);
|
TestFuncResult test_str8_join(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !TEST_STR8_H
|
#endif // !TEST_STR8_H
|
||||||
|
@ -10,32 +10,32 @@ TestFuncResult test_str8_list_get(void) {
|
|||||||
Str8 s4 = wapp_str8_lit("4");
|
Str8 s4 = wapp_str8_lit("4");
|
||||||
Str8 s5 = wapp_str8_lit("5");
|
Str8 s5 = wapp_str8_lit("5");
|
||||||
|
|
||||||
DBL_LIST(Str8) list = {0};
|
Str8List list = {0};
|
||||||
DBL_NODE(Str8) n1 = { .item = &s1 };
|
Str8Node n1 = { .item = &s1 };
|
||||||
DBL_NODE(Str8) n2 = { .item = &s2 };
|
Str8Node n2 = { .item = &s2 };
|
||||||
DBL_NODE(Str8) n3 = { .item = &s3 };
|
Str8Node n3 = { .item = &s3 };
|
||||||
DBL_NODE(Str8) n4 = { .item = &s4 };
|
Str8Node n4 = { .item = &s4 };
|
||||||
DBL_NODE(Str8) n5 = { .item = &s5 };
|
Str8Node n5 = { .item = &s5 };
|
||||||
|
|
||||||
wapp_dbl_list_push_back(&list, &n1);
|
wapp_str8_list_push_back(&list, &n1);
|
||||||
wapp_dbl_list_push_back(&list, &n2);
|
wapp_str8_list_push_back(&list, &n2);
|
||||||
wapp_dbl_list_push_back(&list, &n3);
|
wapp_str8_list_push_back(&list, &n3);
|
||||||
wapp_dbl_list_push_back(&list, &n4);
|
wapp_str8_list_push_back(&list, &n4);
|
||||||
wapp_dbl_list_push_back(&list, &n5);
|
wapp_str8_list_push_back(&list, &n5);
|
||||||
|
|
||||||
DBL_NODE(Str8) *node = wapp_dbl_list_get(Str8, &list, 0);
|
Str8Node *node = wapp_str8_list_get(&list, 0);
|
||||||
result = node->item == &s1 && wapp_str8_equal(node->item, &s1);
|
result = node->item == &s1 && wapp_str8_equal(node->item, &s1);
|
||||||
|
|
||||||
node = wapp_dbl_list_get(Str8, &list, 1);
|
node = wapp_str8_list_get(&list, 1);
|
||||||
result = result && node->item == &s2 && wapp_str8_equal(node->item, &s2);
|
result = result && node->item == &s2 && wapp_str8_equal(node->item, &s2);
|
||||||
|
|
||||||
node = wapp_dbl_list_get(Str8, &list, 2);
|
node = wapp_str8_list_get(&list, 2);
|
||||||
result = result && node->item == &s3 && wapp_str8_equal(node->item, &s3);
|
result = result && node->item == &s3 && wapp_str8_equal(node->item, &s3);
|
||||||
|
|
||||||
node = wapp_dbl_list_get(Str8, &list, 3);
|
node = wapp_str8_list_get(&list, 3);
|
||||||
result = result && node->item == &s4 && wapp_str8_equal(node->item, &s4);
|
result = result && node->item == &s4 && wapp_str8_equal(node->item, &s4);
|
||||||
|
|
||||||
node = wapp_dbl_list_get(Str8, &list, 4);
|
node = wapp_str8_list_get(&list, 4);
|
||||||
result = result && node->item == &s5 && wapp_str8_equal(node->item, &s5);
|
result = result && node->item == &s5 && wapp_str8_equal(node->item, &s5);
|
||||||
|
|
||||||
return wapp_tester_result(result);
|
return wapp_tester_result(result);
|
||||||
@ -48,18 +48,18 @@ TestFuncResult test_str8_list_push_front(void) {
|
|||||||
Str8 s2 = wapp_str8_lit("2");
|
Str8 s2 = wapp_str8_lit("2");
|
||||||
Str8 s3 = wapp_str8_lit("3");
|
Str8 s3 = wapp_str8_lit("3");
|
||||||
|
|
||||||
DBL_LIST(Str8) list = {0};
|
Str8List list = {0};
|
||||||
DBL_NODE(Str8) n1 = { .item = &s1 };
|
Str8Node n1 = { .item = &s1 };
|
||||||
DBL_NODE(Str8) n2 = { .item = &s2 };
|
Str8Node n2 = { .item = &s2 };
|
||||||
DBL_NODE(Str8) n3 = { .item = &s3 };
|
Str8Node n3 = { .item = &s3 };
|
||||||
|
|
||||||
wapp_dbl_list_push_front(&list, &n1);
|
wapp_str8_list_push_front(&list, &n1);
|
||||||
result = list.first == list.last && list.first == &n1 && list.first->item == &s1 && wapp_str8_list_total_size(&list) == 1 && list.node_count == 1;
|
result = list.first == list.last && list.first == &n1 && list.first->item == &s1 && wapp_str8_list_total_size(&list) == 1 && list.node_count == 1;
|
||||||
|
|
||||||
wapp_dbl_list_push_front(&list, &n2);
|
wapp_str8_list_push_front(&list, &n2);
|
||||||
result = result && list.first == &n2 && list.first->item == &s2 && wapp_str8_list_total_size(&list) == 2 && list.node_count == 2;
|
result = result && list.first == &n2 && list.first->item == &s2 && wapp_str8_list_total_size(&list) == 2 && list.node_count == 2;
|
||||||
|
|
||||||
wapp_dbl_list_push_front(&list, &n3);
|
wapp_str8_list_push_front(&list, &n3);
|
||||||
result = result && list.first == &n3 && list.first->item == &s3 && wapp_str8_list_total_size(&list) == 3 && list.node_count == 3;
|
result = result && list.first == &n3 && list.first->item == &s3 && wapp_str8_list_total_size(&list) == 3 && list.node_count == 3;
|
||||||
|
|
||||||
return wapp_tester_result(result);
|
return wapp_tester_result(result);
|
||||||
@ -72,18 +72,18 @@ TestFuncResult test_str8_list_push_back(void) {
|
|||||||
Str8 s2 = wapp_str8_lit("2");
|
Str8 s2 = wapp_str8_lit("2");
|
||||||
Str8 s3 = wapp_str8_lit("3");
|
Str8 s3 = wapp_str8_lit("3");
|
||||||
|
|
||||||
DBL_LIST(Str8) list = {0};
|
Str8List list = {0};
|
||||||
DBL_NODE(Str8) n1 = { .item = &s1 };
|
Str8Node n1 = { .item = &s1 };
|
||||||
DBL_NODE(Str8) n2 = { .item = &s2 };
|
Str8Node n2 = { .item = &s2 };
|
||||||
DBL_NODE(Str8) n3 = { .item = &s3 };
|
Str8Node n3 = { .item = &s3 };
|
||||||
|
|
||||||
wapp_dbl_list_push_back(&list, &n1);
|
wapp_str8_list_push_back(&list, &n1);
|
||||||
result = list.first == list.last && list.last == &n1 && list.last->item == &s1 && wapp_str8_list_total_size(&list) == 1 && list.node_count == 1;
|
result = list.first == list.last && list.last == &n1 && list.last->item == &s1 && wapp_str8_list_total_size(&list) == 1 && list.node_count == 1;
|
||||||
|
|
||||||
wapp_dbl_list_push_back(&list, &n2);
|
wapp_str8_list_push_back(&list, &n2);
|
||||||
result = result && list.last == &n2 && list.last->item == &s2 && wapp_str8_list_total_size(&list) == 2 && list.node_count == 2;
|
result = result && list.last == &n2 && list.last->item == &s2 && wapp_str8_list_total_size(&list) == 2 && list.node_count == 2;
|
||||||
|
|
||||||
wapp_dbl_list_push_back(&list, &n3);
|
wapp_str8_list_push_back(&list, &n3);
|
||||||
result = result && list.last == &n3 && list.last->item == &s3 && wapp_str8_list_total_size(&list) == 3 && list.node_count == 3;
|
result = result && list.last == &n3 && list.last->item == &s3 && wapp_str8_list_total_size(&list) == 3 && list.node_count == 3;
|
||||||
|
|
||||||
return wapp_tester_result(result);
|
return wapp_tester_result(result);
|
||||||
@ -100,27 +100,27 @@ TestFuncResult test_str8_list_insert(void) {
|
|||||||
Str8 s6 = wapp_str8_lit("6");
|
Str8 s6 = wapp_str8_lit("6");
|
||||||
Str8 s7 = wapp_str8_lit("7");
|
Str8 s7 = wapp_str8_lit("7");
|
||||||
|
|
||||||
DBL_LIST(Str8) list = {0};
|
Str8List list = {0};
|
||||||
DBL_NODE(Str8) n1 = { .item = &s1 };
|
Str8Node n1 = { .item = &s1 };
|
||||||
DBL_NODE(Str8) n2 = { .item = &s2 };
|
Str8Node n2 = { .item = &s2 };
|
||||||
DBL_NODE(Str8) n3 = { .item = &s3 };
|
Str8Node n3 = { .item = &s3 };
|
||||||
DBL_NODE(Str8) n4 = { .item = &s4 };
|
Str8Node n4 = { .item = &s4 };
|
||||||
DBL_NODE(Str8) n5 = { .item = &s5 };
|
Str8Node n5 = { .item = &s5 };
|
||||||
DBL_NODE(Str8) n6 = { .item = &s6 };
|
Str8Node n6 = { .item = &s6 };
|
||||||
DBL_NODE(Str8) n7 = { .item = &s7 };
|
Str8Node n7 = { .item = &s7 };
|
||||||
|
|
||||||
wapp_dbl_list_push_back(&list, &n1);
|
wapp_str8_list_push_back(&list, &n1);
|
||||||
wapp_dbl_list_push_back(&list, &n2);
|
wapp_str8_list_push_back(&list, &n2);
|
||||||
wapp_dbl_list_push_back(&list, &n3);
|
wapp_str8_list_push_back(&list, &n3);
|
||||||
wapp_dbl_list_push_back(&list, &n4);
|
wapp_str8_list_push_back(&list, &n4);
|
||||||
wapp_dbl_list_push_back(&list, &n5);
|
wapp_str8_list_push_back(&list, &n5);
|
||||||
|
|
||||||
DBL_NODE(Str8) *node;
|
Str8Node *node;
|
||||||
wapp_dbl_list_insert(&list, &n6, 2);
|
wapp_str8_list_insert(&list, &n6, 2);
|
||||||
node = wapp_dbl_list_get(Str8, &list, 2);
|
node = wapp_str8_list_get(&list, 2);
|
||||||
result = node != NULL && node->item == &s6 && wapp_str8_list_total_size(&list) == 6 && list.node_count == 6;
|
result = node != NULL && node->item == &s6 && wapp_str8_list_total_size(&list) == 6 && list.node_count == 6;
|
||||||
wapp_dbl_list_insert(&list, &n7, 5);
|
wapp_str8_list_insert(&list, &n7, 5);
|
||||||
node = wapp_dbl_list_get(Str8, &list, 5);
|
node = wapp_str8_list_get(&list, 5);
|
||||||
result = result && node != NULL && node->item == &s7 && wapp_str8_list_total_size(&list) == 7 && list.node_count == 7;
|
result = result && node != NULL && node->item == &s7 && wapp_str8_list_total_size(&list) == 7 && list.node_count == 7;
|
||||||
|
|
||||||
return wapp_tester_result(result);
|
return wapp_tester_result(result);
|
||||||
@ -135,32 +135,32 @@ TestFuncResult test_str8_list_pop_front(void) {
|
|||||||
Str8 s4 = wapp_str8_lit("4");
|
Str8 s4 = wapp_str8_lit("4");
|
||||||
Str8 s5 = wapp_str8_lit("5");
|
Str8 s5 = wapp_str8_lit("5");
|
||||||
|
|
||||||
DBL_LIST(Str8) list = {0};
|
Str8List list = {0};
|
||||||
DBL_NODE(Str8) n1 = { .item = &s1 };
|
Str8Node n1 = { .item = &s1 };
|
||||||
DBL_NODE(Str8) n2 = { .item = &s2 };
|
Str8Node n2 = { .item = &s2 };
|
||||||
DBL_NODE(Str8) n3 = { .item = &s3 };
|
Str8Node n3 = { .item = &s3 };
|
||||||
DBL_NODE(Str8) n4 = { .item = &s4 };
|
Str8Node n4 = { .item = &s4 };
|
||||||
DBL_NODE(Str8) n5 = { .item = &s5 };
|
Str8Node n5 = { .item = &s5 };
|
||||||
|
|
||||||
wapp_dbl_list_push_back(&list, &n1);
|
wapp_str8_list_push_back(&list, &n1);
|
||||||
wapp_dbl_list_push_back(&list, &n2);
|
wapp_str8_list_push_back(&list, &n2);
|
||||||
wapp_dbl_list_push_back(&list, &n3);
|
wapp_str8_list_push_back(&list, &n3);
|
||||||
wapp_dbl_list_push_back(&list, &n4);
|
wapp_str8_list_push_back(&list, &n4);
|
||||||
wapp_dbl_list_push_back(&list, &n5);
|
wapp_str8_list_push_back(&list, &n5);
|
||||||
|
|
||||||
DBL_NODE(Str8) *node = wapp_dbl_list_pop_front(Str8, &list);
|
Str8Node *node = wapp_str8_list_pop_front(&list);
|
||||||
result = node == &n1 && node->item == &s1 && wapp_str8_equal(node->item, &s1) && wapp_str8_list_total_size(&list) == 4 && list.node_count == 4;
|
result = node == &n1 && node->item == &s1 && wapp_str8_equal(node->item, &s1) && wapp_str8_list_total_size(&list) == 4 && list.node_count == 4;
|
||||||
|
|
||||||
node = wapp_dbl_list_pop_front(Str8, &list);
|
node = wapp_str8_list_pop_front(&list);
|
||||||
result = result && node == &n2 && node->item == &s2 && wapp_str8_equal(node->item, &s2) && wapp_str8_list_total_size(&list) == 3 && list.node_count == 3;
|
result = result && node == &n2 && node->item == &s2 && wapp_str8_equal(node->item, &s2) && wapp_str8_list_total_size(&list) == 3 && list.node_count == 3;
|
||||||
|
|
||||||
node = wapp_dbl_list_pop_front(Str8, &list);
|
node = wapp_str8_list_pop_front(&list);
|
||||||
result = result && node == &n3 && node->item == &s3 && wapp_str8_equal(node->item, &s3) && wapp_str8_list_total_size(&list) == 2 && list.node_count == 2;
|
result = result && node == &n3 && node->item == &s3 && wapp_str8_equal(node->item, &s3) && wapp_str8_list_total_size(&list) == 2 && list.node_count == 2;
|
||||||
|
|
||||||
node = wapp_dbl_list_pop_front(Str8, &list);
|
node = wapp_str8_list_pop_front(&list);
|
||||||
result = result && node == &n4 && node->item == &s4 && wapp_str8_equal(node->item, &s4) && wapp_str8_list_total_size(&list) == 1 && list.node_count == 1;
|
result = result && node == &n4 && node->item == &s4 && wapp_str8_equal(node->item, &s4) && wapp_str8_list_total_size(&list) == 1 && list.node_count == 1;
|
||||||
|
|
||||||
node = wapp_dbl_list_pop_front(Str8, &list);
|
node = wapp_str8_list_pop_front(&list);
|
||||||
result = result && node == &n5 && node->item == &s5 && wapp_str8_equal(node->item, &s5) && wapp_str8_list_total_size(&list) == 0 && list.node_count == 0;
|
result = result && node == &n5 && node->item == &s5 && wapp_str8_equal(node->item, &s5) && wapp_str8_list_total_size(&list) == 0 && list.node_count == 0;
|
||||||
|
|
||||||
return wapp_tester_result(result);
|
return wapp_tester_result(result);
|
||||||
@ -175,32 +175,32 @@ TestFuncResult test_str8_list_pop_back(void) {
|
|||||||
Str8 s4 = wapp_str8_lit("4");
|
Str8 s4 = wapp_str8_lit("4");
|
||||||
Str8 s5 = wapp_str8_lit("5");
|
Str8 s5 = wapp_str8_lit("5");
|
||||||
|
|
||||||
DBL_LIST(Str8) list = {0};
|
Str8List list = {0};
|
||||||
DBL_NODE(Str8) n1 = { .item = &s1 };
|
Str8Node n1 = { .item = &s1 };
|
||||||
DBL_NODE(Str8) n2 = { .item = &s2 };
|
Str8Node n2 = { .item = &s2 };
|
||||||
DBL_NODE(Str8) n3 = { .item = &s3 };
|
Str8Node n3 = { .item = &s3 };
|
||||||
DBL_NODE(Str8) n4 = { .item = &s4 };
|
Str8Node n4 = { .item = &s4 };
|
||||||
DBL_NODE(Str8) n5 = { .item = &s5 };
|
Str8Node n5 = { .item = &s5 };
|
||||||
|
|
||||||
wapp_dbl_list_push_front(&list, &n1);
|
wapp_str8_list_push_front(&list, &n1);
|
||||||
wapp_dbl_list_push_front(&list, &n2);
|
wapp_str8_list_push_front(&list, &n2);
|
||||||
wapp_dbl_list_push_front(&list, &n3);
|
wapp_str8_list_push_front(&list, &n3);
|
||||||
wapp_dbl_list_push_front(&list, &n4);
|
wapp_str8_list_push_front(&list, &n4);
|
||||||
wapp_dbl_list_push_front(&list, &n5);
|
wapp_str8_list_push_front(&list, &n5);
|
||||||
|
|
||||||
DBL_NODE(Str8) *node = wapp_dbl_list_pop_back(Str8, &list);
|
Str8Node *node = wapp_str8_list_pop_back(&list);
|
||||||
result = node == &n1 && node->item == &s1 && wapp_str8_equal(node->item, &s1) && wapp_str8_list_total_size(&list) == 4 && list.node_count == 4;
|
result = node == &n1 && node->item == &s1 && wapp_str8_equal(node->item, &s1) && wapp_str8_list_total_size(&list) == 4 && list.node_count == 4;
|
||||||
|
|
||||||
node = wapp_dbl_list_pop_back(Str8, &list);
|
node = wapp_str8_list_pop_back(&list);
|
||||||
result = result && node == &n2 && node->item == &s2 && wapp_str8_equal(node->item, &s2) && wapp_str8_list_total_size(&list) == 3 && list.node_count == 3;
|
result = result && node == &n2 && node->item == &s2 && wapp_str8_equal(node->item, &s2) && wapp_str8_list_total_size(&list) == 3 && list.node_count == 3;
|
||||||
|
|
||||||
node = wapp_dbl_list_pop_back(Str8, &list);
|
node = wapp_str8_list_pop_back(&list);
|
||||||
result = result && node == &n3 && node->item == &s3 && wapp_str8_equal(node->item, &s3) && wapp_str8_list_total_size(&list) == 2 && list.node_count == 2;
|
result = result && node == &n3 && node->item == &s3 && wapp_str8_equal(node->item, &s3) && wapp_str8_list_total_size(&list) == 2 && list.node_count == 2;
|
||||||
|
|
||||||
node = wapp_dbl_list_pop_back(Str8, &list);
|
node = wapp_str8_list_pop_back(&list);
|
||||||
result = result && node == &n4 && node->item == &s4 && wapp_str8_equal(node->item, &s4) && wapp_str8_list_total_size(&list) == 1 && list.node_count == 1;
|
result = result && node == &n4 && node->item == &s4 && wapp_str8_equal(node->item, &s4) && wapp_str8_list_total_size(&list) == 1 && list.node_count == 1;
|
||||||
|
|
||||||
node = wapp_dbl_list_pop_back(Str8, &list);
|
node = wapp_str8_list_pop_back(&list);
|
||||||
result = result && node == &n5 && node->item == &s5 && wapp_str8_equal(node->item, &s5) && wapp_str8_list_total_size(&list) == 0 && list.node_count == 0;
|
result = result && node == &n5 && node->item == &s5 && wapp_str8_equal(node->item, &s5) && wapp_str8_list_total_size(&list) == 0 && list.node_count == 0;
|
||||||
|
|
||||||
return wapp_tester_result(result);
|
return wapp_tester_result(result);
|
||||||
@ -215,32 +215,32 @@ TestFuncResult test_str8_list_remove(void) {
|
|||||||
Str8 s4 = wapp_str8_lit("4");
|
Str8 s4 = wapp_str8_lit("4");
|
||||||
Str8 s5 = wapp_str8_lit("5");
|
Str8 s5 = wapp_str8_lit("5");
|
||||||
|
|
||||||
DBL_LIST(Str8) list = {0};
|
Str8List list = {0};
|
||||||
DBL_NODE(Str8) n1 = { .item = &s1 };
|
Str8Node n1 = { .item = &s1 };
|
||||||
DBL_NODE(Str8) n2 = { .item = &s2 };
|
Str8Node n2 = { .item = &s2 };
|
||||||
DBL_NODE(Str8) n3 = { .item = &s3 };
|
Str8Node n3 = { .item = &s3 };
|
||||||
DBL_NODE(Str8) n4 = { .item = &s4 };
|
Str8Node n4 = { .item = &s4 };
|
||||||
DBL_NODE(Str8) n5 = { .item = &s5 };
|
Str8Node n5 = { .item = &s5 };
|
||||||
|
|
||||||
wapp_dbl_list_push_back(&list, &n1);
|
wapp_str8_list_push_back(&list, &n1);
|
||||||
wapp_dbl_list_push_back(&list, &n2);
|
wapp_str8_list_push_back(&list, &n2);
|
||||||
wapp_dbl_list_push_back(&list, &n3);
|
wapp_str8_list_push_back(&list, &n3);
|
||||||
wapp_dbl_list_push_back(&list, &n4);
|
wapp_str8_list_push_back(&list, &n4);
|
||||||
wapp_dbl_list_push_back(&list, &n5);
|
wapp_str8_list_push_back(&list, &n5);
|
||||||
|
|
||||||
DBL_NODE(Str8) *node = wapp_dbl_list_remove(Str8, &list, 0);
|
Str8Node *node = wapp_str8_list_remove(&list, 0);
|
||||||
result = node == &n1 && node->item == &s1 && wapp_str8_equal(node->item, &s1) && wapp_str8_list_total_size(&list) == 4 && list.node_count == 4;
|
result = node == &n1 && node->item == &s1 && wapp_str8_equal(node->item, &s1) && wapp_str8_list_total_size(&list) == 4 && list.node_count == 4;
|
||||||
|
|
||||||
node = wapp_dbl_list_remove(Str8, &list, 0);
|
node = wapp_str8_list_remove(&list, 0);
|
||||||
result = result && node == &n2 && node->item == &s2 && wapp_str8_equal(node->item, &s2) && wapp_str8_list_total_size(&list) == 3 && list.node_count == 3;
|
result = result && node == &n2 && node->item == &s2 && wapp_str8_equal(node->item, &s2) && wapp_str8_list_total_size(&list) == 3 && list.node_count == 3;
|
||||||
|
|
||||||
node = wapp_dbl_list_remove(Str8, &list, 0);
|
node = wapp_str8_list_remove(&list, 0);
|
||||||
result = result && node == &n3 && node->item == &s3 && wapp_str8_equal(node->item, &s3) && wapp_str8_list_total_size(&list) == 2 && list.node_count == 2;
|
result = result && node == &n3 && node->item == &s3 && wapp_str8_equal(node->item, &s3) && wapp_str8_list_total_size(&list) == 2 && list.node_count == 2;
|
||||||
|
|
||||||
node = wapp_dbl_list_remove(Str8, &list, 0);
|
node = wapp_str8_list_remove(&list, 0);
|
||||||
result = result && node == &n4 && node->item == &s4 && wapp_str8_equal(node->item, &s4) && wapp_str8_list_total_size(&list) == 1 && list.node_count == 1;
|
result = result && node == &n4 && node->item == &s4 && wapp_str8_equal(node->item, &s4) && wapp_str8_list_total_size(&list) == 1 && list.node_count == 1;
|
||||||
|
|
||||||
node = wapp_dbl_list_remove(Str8, &list, 0);
|
node = wapp_str8_list_remove(&list, 0);
|
||||||
result = result && node == &n5 && node->item == &s5 && wapp_str8_equal(node->item, &s5) && wapp_str8_list_total_size(&list) == 0 && list.node_count == 0;
|
result = result && node == &n5 && node->item == &s5 && wapp_str8_equal(node->item, &s5) && wapp_str8_list_total_size(&list) == 0 && list.node_count == 0;
|
||||||
|
|
||||||
return wapp_tester_result(result);
|
return wapp_tester_result(result);
|
||||||
@ -249,13 +249,13 @@ TestFuncResult test_str8_list_remove(void) {
|
|||||||
TestFuncResult test_str8_list_empty(void) {
|
TestFuncResult test_str8_list_empty(void) {
|
||||||
bool result;
|
bool result;
|
||||||
|
|
||||||
DBL_LIST(Str8) list = {0};
|
Str8List list = {0};
|
||||||
wapp_dbl_list_push_back(&list, &wapp_str8_node_from_cstr("Hello"));
|
wapp_str8_list_push_back(&list, &wapp_str8_node_from_cstr("Hello"));
|
||||||
wapp_dbl_list_push_back(&list, &wapp_str8_node_from_cstr("from"));
|
wapp_str8_list_push_back(&list, &wapp_str8_node_from_cstr("from"));
|
||||||
wapp_dbl_list_push_back(&list, &wapp_str8_node_from_cstr("wizapp"));
|
wapp_str8_list_push_back(&list, &wapp_str8_node_from_cstr("wizapp"));
|
||||||
wapp_dbl_list_push_back(&list, &wapp_str8_node_from_cstr("stdlib"));
|
wapp_str8_list_push_back(&list, &wapp_str8_node_from_cstr("stdlib"));
|
||||||
|
|
||||||
wapp_dbl_list_empty(&list);
|
wapp_str8_list_empty(&list);
|
||||||
|
|
||||||
result = list.first == NULL && list.last == NULL && list.node_count == 0 && wapp_str8_list_total_size(&list) == 0;
|
result = list.first == NULL && list.last == NULL && list.node_count == 0 && wapp_str8_list_total_size(&list) == 0;
|
||||||
|
|
||||||
|
@ -3,10 +3,6 @@
|
|||||||
|
|
||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
BEGIN_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
TestFuncResult test_str8_list_get(void);
|
TestFuncResult test_str8_list_get(void);
|
||||||
TestFuncResult test_str8_list_push_front(void);
|
TestFuncResult test_str8_list_push_front(void);
|
||||||
TestFuncResult test_str8_list_push_back(void);
|
TestFuncResult test_str8_list_push_back(void);
|
||||||
@ -16,8 +12,4 @@ TestFuncResult test_str8_list_pop_back(void);
|
|||||||
TestFuncResult test_str8_list_remove(void);
|
TestFuncResult test_str8_list_remove(void);
|
||||||
TestFuncResult test_str8_list_empty(void);
|
TestFuncResult test_str8_list_empty(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
END_C_LINKAGE
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif // !TEST_STR8_LIST_H
|
#endif // !TEST_STR8_LIST_H
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#include "test_str8_list.h"
|
#include "test_str8_list.h"
|
||||||
#include "test_allocator.h"
|
#include "test_allocator.h"
|
||||||
#include "test_arena.h"
|
#include "test_arena.h"
|
||||||
|
#include "test_i32_array.h"
|
||||||
#include "test_cpath.h"
|
#include "test_cpath.h"
|
||||||
#include "test_shell_commander.h"
|
#include "test_shell_commander.h"
|
||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
@ -17,6 +18,19 @@ int main(void) {
|
|||||||
test_arena_realloc_smaller_size,
|
test_arena_realloc_smaller_size,
|
||||||
test_arena_clear,
|
test_arena_clear,
|
||||||
test_arena_destroy,
|
test_arena_destroy,
|
||||||
|
test_i32_array,
|
||||||
|
test_i32_array_with_capacity,
|
||||||
|
test_i32_array_get,
|
||||||
|
test_i32_array_set,
|
||||||
|
test_i32_array_append_capped,
|
||||||
|
test_i32_array_extend_capped,
|
||||||
|
test_i32_array_clear,
|
||||||
|
test_i32_array_pop,
|
||||||
|
test_i32_array_copy_capped,
|
||||||
|
test_i32_array_alloc_capacity,
|
||||||
|
test_i32_array_append_alloc,
|
||||||
|
test_i32_array_extend_alloc,
|
||||||
|
test_i32_array_copy_alloc,
|
||||||
test_str8_lit,
|
test_str8_lit,
|
||||||
test_str8_lit_ro,
|
test_str8_lit_ro,
|
||||||
test_str8_buf,
|
test_str8_buf,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user