Fixed some bugs in l1 codegen. Passes test 0 and test 1
This commit is contained in:
parent
42a64c6e15
commit
24969c0bc0
@ -8,13 +8,13 @@ add_compile_definitions(_POSIX_C_SOURCE=200112L)
|
||||
add_compile_definitions(_GNU_SOURCE)
|
||||
add_compile_options(-fno-trapping-math)
|
||||
|
||||
add_executable(codegen_l1 src/l1/codegen/codegen.c)
|
||||
target_compile_definitions(codegen_l1
|
||||
PRIVATE PROTOTYPE1_L1_CODEGEN_BOOTSTRAP_USE_CHICKEN_VECU8)
|
||||
#add_executable(codegen_l1 src/l1/codegen/codegen.c)
|
||||
#target_compile_definitions(codegen_l1
|
||||
# PRIVATE PROTOTYPE1_L1_CODEGEN_BOOTSTRAP_USE_CHICKEN_VECU8)
|
||||
|
||||
add_executable(0_test src/l1/tests/t0.c)
|
||||
add_executable(1_test src/l1/tests/t1.c)
|
||||
|
||||
#add_executable(0_test src/l1/tests/t0.c)
|
||||
#add_executable(1_test src/l1/tests/t1.c)
|
||||
#
|
||||
#add_executable(codegen_l2 src/l2/codegen/codegen.c)
|
||||
#
|
||||
#add_executable(0_render_test src/l2/tests/r0/r0.c)
|
||||
|
||||
74
Makefile
74
Makefile
@ -1,50 +1,64 @@
|
||||
#HEADERS := $(shell find src -type f -name '*.h')
|
||||
HEADERS_src_l1 := $(shell find src/l1 -type f -name '*.h')
|
||||
HEADERS_gen_l1 := $(shell find gen/l1 -type f -name '*.h') essence_gen_l1
|
||||
|
||||
HEADERS_src_l2 := $(shell find src/l2 -type f -name '*.h')
|
||||
HEADERS_gen_l2 := $(shell find gen/l2 -type f -name '*.h') essence_gen_l2
|
||||
|
||||
HEADERS_src_l3 := $(shell find src/l3 -type f -name '*.h')
|
||||
|
||||
cflags := -Wall -Wextra -Werror=implicit-function-declaration -Werror=return-type --std=c99 -g -ggdb -O0 \
|
||||
-fno-trapping-math -D_POSIX_C_SOURCE=200112L -D_GNU_SOURCE
|
||||
cc := 'gcc'
|
||||
cc := gcc
|
||||
|
||||
wl_protocols := $(shell pkg-config --variable=pkgdatadir wayland-protocols)
|
||||
|
||||
out/l1/codegen_l1: src/l1/codegen/codegen.c $(HEADERS)
|
||||
mkdir -p out/l2
|
||||
$(cc) $(cflags) -o $@ $<
|
||||
out/l1/codegen: src/l1/codegen/codegen.c $(HEADERS_src_l1)
|
||||
mkdir -p out/l1
|
||||
$(cc) $(cflags) -D PROTOTYPE1_L1_CODEGEN_BOOTSTRAP_USE_CHICKEN_VECU8 -o $@ $<
|
||||
|
||||
out/l1/t0: src/l1/tests/t0.c $(HEADERS)
|
||||
.PHONY: essence_gen_l1
|
||||
essence_gen_l1: out/l1/codegen
|
||||
mkdir -p gen
|
||||
cd gen && ../out/l1/codegen
|
||||
|
||||
|
||||
out/l1/t0: src/l1/tests/t0.c $(HEADERS_gen_l1) $(HEADERS_src_l1)
|
||||
mkdir -p out/l1
|
||||
$(cc) $(cflags) -o $@ $<
|
||||
|
||||
out/l1/t1: src/l1/tests/t1.c $(HEADERS)
|
||||
out/l1/t1: src/l1/tests/t1.c $(HEADERS_gen_l1) $(HEADERS_src_l1)
|
||||
mkdir -p out/l1
|
||||
$(cc) $(cflags) -o $@ $<
|
||||
|
||||
|
||||
|
||||
out/l2/codegen_l2: src/l2/codegen/codegen.c $(HEADERS)
|
||||
mkdir -p out/l2
|
||||
$(cc) $(cflags) -o $@ $<
|
||||
|
||||
gen/l_wl_protocols/xdg-shell-client.h: $(wl_protocols)/stable/xdg-shell/xdg-shell.xml
|
||||
mkdir -p gen/l_wl_protocols
|
||||
wayland-scanner client-header $< $@
|
||||
|
||||
gen/l_wl_protocols/xdg-shell-private.c: $(wl_protocols)/stable/xdg-shell/xdg-shell.xml
|
||||
mkdir -p gen/l_wl_protocols
|
||||
wayland-scanner private-code $< $@
|
||||
|
||||
|
||||
|
||||
out/l2/r0: src/l2/tests/r0/r0.c $(HEADERS)
|
||||
mkdir -p out/l2
|
||||
$(cc) $(cflags) -o $@ $< -lvulkan -lX11 -lm
|
||||
|
||||
out/l2/r0: src/l2/tests/r0/r0_tex_init_prep.c $(HEADERS)
|
||||
mkdir -p out/l2
|
||||
$(cc) $(cflags) -o $@ $< -lm
|
||||
|
||||
out/l2/r1: src/l2/tests/r1/r1.c $(HEADERS)
|
||||
mkdir -p out/l2
|
||||
$(cc) $(cflags) -o $@ $< gen/l_wl_protocols/xdg-shell-private.c -lwayland-client -lrt -lxkbcommon
|
||||
#out/l2/codegen_l2: src/l2/codegen/codegen.c $(HEADERS_src_l2) $(HEADERS_gen_l1) $(HEADERS_src_l1)
|
||||
# mkdir -p out/l2
|
||||
# $(cc) $(cflags) -o $@ $<
|
||||
#
|
||||
#gen/l_wl_protocols/xdg-shell-client.h: $(wl_protocols)/stable/xdg-shell/xdg-shell.xml
|
||||
# mkdir -p gen/l_wl_protocols
|
||||
# wayland-scanner client-header $< $@
|
||||
#
|
||||
#gen/l_wl_protocols/xdg-shell-private.c: $(wl_protocols)/stable/xdg-shell/xdg-shell.xml
|
||||
# mkdir -p gen/l_wl_protocols
|
||||
# wayland-scanner private-code $< $@
|
||||
#
|
||||
#
|
||||
#
|
||||
#out/l2/r0: src/l2/tests/r0/r0.c $(HEADERS_gen_l2) $(HEADERS_src_l2) $(HEADERS_gen_l1) $(HEADERS_src_l1)
|
||||
# mkdir -p out/l2
|
||||
# $(cc) $(cflags) -o $@ $< -lvulkan -lX11 -lm
|
||||
#
|
||||
#out/l2/r0: src/l2/tests/r0/r0_tex_init_prep.c $(HEADERS_gen_l2) $(HEADERS_src_l2) $(HEADERS_gen_l1) $(HEADERS_src_l1)
|
||||
# mkdir -p out/l2
|
||||
# $(cc) $(cflags) -o $@ $< -lm
|
||||
#
|
||||
#out/l2/r1: src/l2/tests/r1/r1.c $(HEADERS_gen_l2) $(HEADERS_src_l2) $(HEADERS_gen_l1) $(HEADERS_src_l1)
|
||||
# mkdir -p out/l2
|
||||
# $(cc) $(cflags) -o $@ $< gen/l_wl_protocols/xdg-shell-private.c -lwayland-client -lrt -lxkbcommon
|
||||
|
||||
clean:
|
||||
rm -rf gen out
|
||||
|
||||
@ -2,40 +2,39 @@
|
||||
#include "../system/fsmanip.h"
|
||||
|
||||
int main() {
|
||||
VecU8 e = VecU8_fmt("%sA%%%s\n", cstr("AA"), cstr("BB"));
|
||||
SpanU8_print(VecU8_to_SpanU8(&e));
|
||||
VecU8_drop(e);
|
||||
return 0;
|
||||
make_dir_nofail("l1");
|
||||
{
|
||||
VecU8 head = begin_header(cstr("PROTOTYPE1_L1_VECANDSPANANDOPTION_INT_PRIMITIVES_H"));
|
||||
VecU8_append_span(&head, cstr("#include \"../../src/l1/core/util.h\"\n\n"));
|
||||
SpanU8 T[4] = {cstr("U8"), cstr("U16"), cstr("U32"), cstr("U64")};
|
||||
for (size_t i = 0; i < ARRAY_SIZE(T); i++) {
|
||||
VecU8_append_vec(&head, generate_util_templates_instantiation(T[i], (util_templates_instantiation_options){
|
||||
.t_integer = true, .t_primitive = true, .vec = true, .vec_equal = true, .span = true, .mut_span = true,
|
||||
.collab_vec_span = true, .option = true
|
||||
.t_integer = true, .t_primitive = true, .vec = true, .vec_extended = true,
|
||||
.vec_equal = true, .span = true, .span_extended = true, .mut_span = true,
|
||||
.collab_vec_span = true, .collab_vec_span_extended = true, .option = true
|
||||
}));
|
||||
}
|
||||
finish_header(head, "l1/VecAndSpanAndOption_int_primitives.h");
|
||||
}
|
||||
{
|
||||
VecU8 head = begin_header(cstr("PROTOTYPE1_L1_VECANDSPAN_VEC_INT_PRIMITIVES_H"));
|
||||
VecU8_append_span(&head, cstr("#include \"VecAndSpanAndOption_int_primitives.h\"\n\n"));
|
||||
SpanU8 T[4] = {cstr("VecU8"), cstr("VecU16"), cstr("VecU32"), cstr("VecU64")};
|
||||
for (size_t i = 0; i < ARRAY_SIZE(T); i++) {
|
||||
VecU8_append_vec(&head, generate_util_templates_instantiation(T[i], (util_templates_instantiation_options){
|
||||
.t_integer = true, .t_primitive = true, .vec = true, .vec_equal = true, .span = true, .mut_span = true,
|
||||
.collab_vec_span = true, .option = true
|
||||
.vec = true, .vec_extended = true, .span = true, .collab_vec_span = true, .vec_equal = true,
|
||||
}));
|
||||
}
|
||||
finish_header(head, "l1/VecAndSpan_Vec_int_primitives.h");
|
||||
}
|
||||
{
|
||||
VecU8 head = begin_header(cstr("PROTOTYPE1_L1_VECANDSPAN_SPAN_INT_PRIMITIVES_H"));
|
||||
VecU8_append_span(&head, cstr("#include \"VecAndSpanAndOption_int_primitives.h\"\n\n"));
|
||||
SpanU8 T[4] = {cstr("VecU8")};
|
||||
for (size_t i = 0; i < ARRAY_SIZE(T); i++) {
|
||||
VecU8_append_vec(&head, generate_util_templates_instantiation(T[i], (util_templates_instantiation_options){
|
||||
.t_integer = true, .t_primitive = true, .vec = true, .vec_equal = true, .span = true, .mut_span = true,
|
||||
.collab_vec_span = true, .option = true
|
||||
.t_primitive = true, .vec = true, .vec_equal = true, .span = true, .mut_span = true,
|
||||
.collab_vec_span = true,
|
||||
}));
|
||||
}
|
||||
finish_header(head, "l1/VecAndSpan_Span_int_primitives.h");
|
||||
|
||||
@ -9,10 +9,10 @@ NODISCARD VecU8 generate_VecT_struct_and_base_methods(SpanU8 T, bool primitive)
|
||||
SpanU8 VecT = VecU8_to_SpanU8(&g_VecT);
|
||||
VecU8 res = VecU8_fmt(
|
||||
"typedef struct {\n"
|
||||
SPACE4 "T* buf;\n"
|
||||
SPACE4 "%s* buf;\n"
|
||||
SPACE4 "size_t len;\n"
|
||||
SPACE4 "size_t capacity;\n"
|
||||
"} %s\n\n", VecT);
|
||||
"} %s;\n\n", T, VecT);
|
||||
|
||||
VecU8_append_vec(&res, VecU8_fmt("#define %s_new() (%s){ 0 }\n\n", VecT, VecT));
|
||||
|
||||
@ -23,11 +23,11 @@ NODISCARD VecU8 generate_VecT_struct_and_base_methods(SpanU8 T, bool primitive)
|
||||
SPACE4 SPACE4 "%s_drop(self.buf[i]);\n", T));
|
||||
}
|
||||
VecU8_append_vec(&res, VecU8_fmt(
|
||||
SPACE4 "free(self->buf);\n"
|
||||
SPACE4 "free(self.buf);\n"
|
||||
"}\n\n"));
|
||||
|
||||
VecU8_append_vec(&res, VecU8_fmt(
|
||||
"%s %s_new_reserved(size_t n) {\n"
|
||||
"NODISCARD %s %s_new_reserved(size_t n) {\n"
|
||||
SPACE4 "return (%s){ .buf = safe_calloc(n, sizeof(%s)), .len = 0, .capacity = n };\n"
|
||||
"}\n\n", VecT, VecT, VecT, T));
|
||||
|
||||
@ -44,30 +44,30 @@ NODISCARD VecU8 generate_VecT_struct_and_base_methods(SpanU8 T, bool primitive)
|
||||
"}\n\n", VecT, VecT, T, T));
|
||||
|
||||
VecU8_append_vec(&res, VecU8_fmt(
|
||||
"%s %s_mat(%s* self, size_t i) {\n"
|
||||
"%s* %s_mat(%s* self, size_t i) {\n"
|
||||
SPACE4 "assert(i < self->len);\n"
|
||||
SPACE4 "return &self->buf[i];\n"
|
||||
"}\n\n", T, VecT, VecT));
|
||||
|
||||
VecU8_append_vec(&res, VecU8_fmt(
|
||||
"%s %s_at(const %s* self, size_t i) {\n"
|
||||
"const %s* %s_at(const %s* self, size_t i) {\n"
|
||||
SPACE4 "assert(i < self->len);\n"
|
||||
SPACE4 "return &self->buf[i];\n"
|
||||
"}\n\n", T, VecT, VecT));
|
||||
|
||||
VecU8_append_vec(&res, VecU8_fmt(
|
||||
"%s %s_clone(const %s* self) {\n"
|
||||
SPACE4 "%s res = (%s){.buf = safe_calloc(self->len, sizeof(%s)), .len = self->len, .capacity = self->len};",
|
||||
"NODISCARD %s %s_clone(const %s* self) {\n"
|
||||
SPACE4 "%s res = (%s){.buf = safe_calloc(self->len, sizeof(%s)), .len = self->len, .capacity = self->len};\n",
|
||||
VecT, VecT, VecT, VecT, VecT, T));
|
||||
if (primitive) {
|
||||
VecU8_append_vec(&res, VecU8_fmt(
|
||||
SPACE4 "memcpy(res.buf, self->buf, self->len * sizeof(%s));", T));
|
||||
SPACE4 "memcpy(res.buf, self->buf, self->len * sizeof(%s));\n", T));
|
||||
} else {
|
||||
VecU8_append_vec(&res, VecU8_fmt(
|
||||
SPACE4 "for (size_t i = 0; i < self->len; i++)\n"
|
||||
SPACE4 SPACE4 "res.buf[i] = %s_clone(&self->buf[i]);\n", T));
|
||||
}
|
||||
VecU8_append_span(&res, cstr("}\n\n"));
|
||||
VecU8_append_span(&res, cstr(SPACE4 "return res;\n}\n\n"));
|
||||
|
||||
VecU8_append_vec(&res, VecU8_fmt(
|
||||
"void %s_append_vec(%s* self, %s b) {\n"
|
||||
@ -117,7 +117,7 @@ NODISCARD VecU8 generate_VecT_trivmove_extended_methods(SpanU8 T, bool primitive
|
||||
|
||||
VecU8_append_vec(&res, VecU8_fmt(
|
||||
"NODISCARD %s %s_swap_with_empty(%s* cell) {\n"
|
||||
SPACE4 "%s res = *cell;\n"
|
||||
SPACE4 "%s val = *cell;\n"
|
||||
SPACE4 "*cell = (%s){NULL, 0, 0};\n"
|
||||
SPACE4 "return val;\n"
|
||||
"}\n\n", VecT, VecT, VecT, VecT, VecT));
|
||||
@ -162,7 +162,8 @@ NODISCARD VecU8 generate_VecT_equal_method(SpanU8 T, bool integer) {
|
||||
SPACE4 SPACE4 SPACE4 "return false;\n"
|
||||
SPACE4 "}\n"
|
||||
SPACE4 "return true;\n"
|
||||
"}\n"));
|
||||
"}\n\n"
|
||||
));
|
||||
|
||||
VecU8_drop(g_VecT);
|
||||
return res;
|
||||
@ -198,7 +199,7 @@ void codegen_append_some_span_struct(VecU8* res, SpanU8 T, SpanU8 SpanT, SpanU8
|
||||
"typedef struct {\n"
|
||||
SPACE4 "%s%s* data;\n"
|
||||
SPACE4 "size_t len;\n"
|
||||
"} %s\n\n", mod, T, SpanT));
|
||||
"} %s;\n\n", mod, T, SpanT));
|
||||
}
|
||||
|
||||
/* helper function. (SpanT, mod) is either (SpanT "const ") or (MutSpanT, "") */
|
||||
@ -215,8 +216,8 @@ void codegen_append_some_span_at_method(VecU8* res, SpanU8 T, SpanU8 SpanT, Span
|
||||
void codegen_append_some_span_span_method(VecU8* res, SpanU8 SpanT) {
|
||||
VecU8_append_vec(res, VecU8_fmt(
|
||||
"%s %s_span(%s self, size_t start, size_t len){\n"
|
||||
"assert(start < SIZE_MAX - len && start + len <= self.len);\n"
|
||||
"return (%s){.data = self.data + start, .len = len};\n"
|
||||
SPACE4 "assert(start < SIZE_MAX - len && start + len <= self.len);\n"
|
||||
SPACE4 "return (%s){.data = self.data + start, .len = len};\n"
|
||||
"}\n\n", SpanT, SpanT, SpanT, SpanT));
|
||||
}
|
||||
|
||||
@ -225,7 +226,7 @@ void codegen_append_some_span_span_method(VecU8* res, SpanU8 SpanT) {
|
||||
* add_equal option generates equal method. add_extended option generated extended methods
|
||||
* add_sort option generates T_qcompare and MutSpanT_sort methods */
|
||||
NODISCARD VecU8 generate_SpanT_struct_and_methods(
|
||||
SpanU8 T, bool add_mutable, bool add_equal, bool add_extended, bool add_sort
|
||||
SpanU8 T, bool integer, bool add_mutable, bool add_equal, bool add_extended, bool add_sort
|
||||
) {
|
||||
VecU8 g_SpanT = VecU8_fmt("Span%s", T);
|
||||
VecU8 g_MutSpanT = VecU8_fmt("MutSpan%s", T);
|
||||
@ -261,10 +262,15 @@ NODISCARD VecU8 generate_SpanT_struct_and_methods(
|
||||
VecU8_append_vec(&res, VecU8_fmt(
|
||||
"int %s_qcompare(const void* a, const void* b) {\n"
|
||||
SPACE4 "const %s* A = a;\n"
|
||||
SPACE4 "const %s* B = b;\n"
|
||||
SPACE4 "return (int)%s_less_%s(B, A) - (int)%s_less_%s(A, B);\n"
|
||||
"}\n\n", T, T, T, T, T, T, T));
|
||||
SPACE4 "const %s* B = b;\n", T, T, T));
|
||||
if (integer) {
|
||||
VecU8_append_span(&res, cstr(SPACE4 "return (int)(B < A) - (int)(A < B);\n"));
|
||||
} else {
|
||||
VecU8_append_vec(&res, VecU8_fmt(
|
||||
SPACE4 "return (int)%s_less_%s(B, A) - (int)%s_less_%s(A, B);\n", T, T, T, T));
|
||||
}
|
||||
VecU8_append_vec(&res, VecU8_fmt(
|
||||
"}\n\n"
|
||||
"void %s_sort(%s self) {\n"
|
||||
SPACE4 "qsort(self.data, self.len, sizeof(%s), %s_qcompare);\n"
|
||||
"}\n\n", MutSpanT, MutSpanT, T, T));
|
||||
@ -322,7 +328,7 @@ NODISCARD VecU8 generate_SpanT_VecT_trivmove_collab(SpanU8 T, bool primitive, bo
|
||||
SPACE4 "}\n", VecT, VecT, SpanT, T));
|
||||
if (primitive) {
|
||||
VecU8_append_vec(&res, VecU8_fmt(
|
||||
SPACE4 "memcpy(self->buf + i, b.data, b.len * sizeof(%s));\n", T));
|
||||
SPACE4 "memcpy(self->buf + self->len, b.data, b.len * sizeof(%s));\n", T));
|
||||
} else {
|
||||
VecU8_append_vec(&res, VecU8_fmt(
|
||||
SPACE4 "for (size_t i = 0; i < b.len; i++)\n"
|
||||
@ -340,7 +346,7 @@ NODISCARD VecU8 generate_SpanT_VecT_trivmove_collab(SpanU8 T, bool primitive, bo
|
||||
"}\n\n", SpanT, VecT, VecT, SpanT));
|
||||
if (add_mutable) {
|
||||
VecU8_append_vec(&res, VecU8_fmt(
|
||||
"%s %s_span(%s* vec, size_t start, size_t len) {\n"
|
||||
"%s %s_mspan(%s* vec, size_t start, size_t len) {\n"
|
||||
SPACE4 "assert(start < SIZE_MAX - len && start + len <= vec->len);\n"
|
||||
SPACE4 "return (%s){.data = vec->buf + start, .len = len};\n"
|
||||
"}\n\n", MutSpanT, VecT, VecT, MutSpanT));
|
||||
@ -353,7 +359,7 @@ NODISCARD VecU8 generate_SpanT_VecT_trivmove_collab(SpanU8 T, bool primitive, bo
|
||||
return res;
|
||||
}
|
||||
|
||||
NODISCARD VecU8 generate_OptionT_struct_and_methods(SpanU8 T) {
|
||||
NODISCARD VecU8 generate_OptionT_struct_and_methods(SpanU8 T, bool primitive) {
|
||||
VecU8 g_OptionT = VecU8_fmt("Option%s", T);
|
||||
SpanU8 OptionT = VecU8_to_SpanU8(&g_OptionT);
|
||||
|
||||
@ -386,6 +392,19 @@ NODISCARD VecU8 generate_OptionT_struct_and_methods(SpanU8 T) {
|
||||
SPACE4 SPACE4 "abortf(\"Expected something in %s got None\\n\");\n"
|
||||
SPACE4 "return self.some;\n"
|
||||
"}\n\n", T, OptionT, OptionT, OptionT));
|
||||
if (!primitive) {
|
||||
VecU8_append_vec(&res, VecU8_fmt(
|
||||
"void %s_drop(%s self) {\n"
|
||||
SPACE4 "if (self.variant == Option_None)\n"
|
||||
SPACE4 SPACE4 "%s_drop(self.some);\n"
|
||||
"}\n\n", OptionT, OptionT, T));
|
||||
VecU8_append_vec(&res, VecU8_fmt(
|
||||
"NODISCARD %s %s_clone(const %s* self) {\n"
|
||||
SPACE4 "if (self->variant == Option_None)\n"
|
||||
SPACE4 SPACE4 "return (%s) { .variant = Option_None };\n"
|
||||
SPACE4 "return (%s){ .variant = Option_Some, .some = %s_clone(&self->some) };\n"
|
||||
"}\n\n", OptionT, OptionT, OptionT, OptionT, OptionT, T));
|
||||
}
|
||||
|
||||
VecU8_drop(g_OptionT);
|
||||
return res;
|
||||
@ -414,7 +433,7 @@ typedef struct {
|
||||
|
||||
NODISCARD VecU8 generate_util_templates_instantiation(SpanU8 T, util_templates_instantiation_options op) {
|
||||
VecU8 res = VecU8_new();
|
||||
assert(!op.t_primitive || op.t_integer);
|
||||
assert(op.t_primitive || !op.t_integer);
|
||||
if (op.vec) {
|
||||
VecU8_append_vec(&res, generate_VecT_struct_and_base_methods(T, op.t_primitive));
|
||||
}
|
||||
@ -431,19 +450,22 @@ NODISCARD VecU8 generate_util_templates_instantiation(SpanU8 T, util_templates_i
|
||||
VecU8_append_vec(&res, generate_VecT_new_of_size_method(T));
|
||||
}
|
||||
if (op.span) {
|
||||
VecU8_append_vec(&res, generate_SpanT_struct_and_methods(T, op.mut_span, false, op.span_extended, op.span_sort));
|
||||
VecU8_append_vec(&res, generate_SpanT_struct_and_methods(T, op.t_integer, op.mut_span, false, op.span_extended, op.span_sort));
|
||||
}
|
||||
if (op.collab_vec_span) {
|
||||
assert(op.vec && op.span);
|
||||
VecU8_append_vec(&res, generate_SpanT_VecT_trivmove_collab(T, op.t_primitive, op.mut_span, op.collab_vec_span_extended));
|
||||
}
|
||||
if (op.option) {
|
||||
VecU8_append_vec(&res, generate_OptionT_struct_and_methods(T));
|
||||
VecU8_append_vec(&res, generate_OptionT_struct_and_methods(T, op.t_primitive));
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
void generate_lynda_header(SpanU8 name_pref, SpanU8 T, util_templates_instantiation_options op) {
|
||||
/* You want bonus_ns to be cstr(""). But if it isn't, it should end with / */
|
||||
void generate_eve_header(SpanU8 layer, SpanU8 bonus_ns, SpanU8 T, util_templates_instantiation_options op) {
|
||||
if (op.t_integer)
|
||||
op.t_primitive = true;
|
||||
if (op.vec_extended)
|
||||
op.vec = true;
|
||||
if (op.vec_equal)
|
||||
@ -461,11 +483,16 @@ void generate_lynda_header(SpanU8 name_pref, SpanU8 T, util_templates_instantiat
|
||||
op.vec = true;
|
||||
}
|
||||
assert(op.vec || op.span || op.option);
|
||||
VecU8 text = generate_util_templates_instantiation(T, op);
|
||||
VecU8 filename = VecU8_fmt("lynda/%s/%s%s%s%s%s""%s%s.h", name_pref,
|
||||
VecU8 text = vcstr("/*Automatically generated file. Do not edit it */\n\n");
|
||||
VecU8_append_vec(&text, generate_util_templates_instantiation(T, op));
|
||||
VecU8 filename = VecU8_fmt("%s/eve/%s""%s%s%s%s%s""%s%s.h", layer, bonus_ns,
|
||||
cstr(op.vec ? "Vec" : ""), cstr(op.vec && op.span ? "And" : ""), cstr(op.span ? "Span" : ""),
|
||||
cstr(op.span && op.option ? "And" : ""), cstr(op.option ? "Option" : ""),
|
||||
cstr((int)op.vec + (int)op.span + (int)op.option > 1 ? "_" : ""), T);
|
||||
VecU8_append(&filename, 0);
|
||||
write_whole_file_or_abort((const char*)filename.buf, VecU8_to_SpanU8(&text));
|
||||
VecU8_drop(filename);
|
||||
VecU8_drop(text);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
#ifdef PROTOTYPE1_L1_CODEGEN_BOOTSTRAP_USE_CHICKEN_VECU8
|
||||
#include "chicken_VecU8.h"
|
||||
#else
|
||||
#include "../../../gen/l1/VecAndSpan_int_primitives.h"
|
||||
#include "../../../gen/l1/VecAndSpanAndOption_int_primitives.h"
|
||||
#endif
|
||||
|
||||
VecU8 VecU8_from_cstr(const char* dc) {
|
||||
|
||||
@ -3,8 +3,6 @@
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
// *Crosses-fingers* Please optimize this all out, please optimize this all out
|
||||
|
||||
typedef uint8_t U8;
|
||||
typedef uint16_t U16;
|
||||
typedef uint32_t U32;
|
||||
@ -14,15 +12,6 @@ typedef int16_t S16;
|
||||
typedef int32_t S32;
|
||||
typedef int64_t S64;
|
||||
|
||||
#define U8_less_U8(ap, bp) (*(ap) < *(bp))
|
||||
#define U16_less_U16(ap, bp) (*(ap) < *(bp))
|
||||
#define U32_less_U32(ap, bp) (*(ap) < *(bp))
|
||||
#define U64_less_U64(ap, bp) (*(ap) < *(bp))
|
||||
#define S8_less_S8(ap, bp) (*(ap) < *(bp))
|
||||
#define S16_less_S16(ap, bp) (*(ap) < *(bp))
|
||||
#define S32_less_S32(ap, bp) (*(ap) < *(bp))
|
||||
#define S64_less_S64(ap, bp) (*(ap) < *(bp))
|
||||
|
||||
// todo: move these to util (l1) template instantiation too
|
||||
#define int_minmax_function_Definition(T) \
|
||||
T MIN_##T (T a, T b){ return a < b ? a : b; } \
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#include "../core/VecSpan_int_primitives.h"
|
||||
#include "../../../gen/l1/VecAndSpanAndOption_int_primitives.h"
|
||||
|
||||
int main() {
|
||||
VecU8 a = VecU8_new();
|
||||
@ -17,15 +17,14 @@ int main() {
|
||||
VecU8_append(&a, 90);
|
||||
assert(a.len == 5);
|
||||
assert(a.capacity == 8);
|
||||
assert(*VecU8_cat(&a, 0) == 116);
|
||||
assert(*VecU8_at(&a, 0) == 116);
|
||||
assert(*VecU8_at(&a, 1) == 18);
|
||||
assert(*VecU8_cat(&a, 2) == 180);
|
||||
assert(*VecU8_at(&a, 2) == 180);
|
||||
assert(*VecU8_at(&a, 3) == 9);
|
||||
assert(*VecU8_cat(&a, 4) == 90);
|
||||
assert(*VecU8_at(&a, 4) == 90);
|
||||
VecU8_drop(a);
|
||||
|
||||
U32 five = 5;
|
||||
VecU32 b = VecU32_new_filled(3, &five);
|
||||
VecU32 b = VecU32_new_filled(3, 5);
|
||||
assert(b.len == 3);
|
||||
assert(b.capacity == 3);
|
||||
VecU32_append(&b, 41);
|
||||
@ -48,25 +47,25 @@ int main() {
|
||||
printf("%u %u\n", *VecU32_at(&b, i), *VecU32_at(&c, i));
|
||||
}
|
||||
|
||||
*VecU32_at(&b, 3) = 17;
|
||||
*VecU32_mat(&b, 3) = 17;
|
||||
assert(!VecU32_equal_VecU32(&b, &c));
|
||||
*VecU32_at(&c, 3) = 17;
|
||||
*VecU32_mat(&c, 3) = 17;
|
||||
assert(VecU32_equal_VecU32(&b, &c));
|
||||
|
||||
SpanU32 s0 = VecU32_span(&c, 4, 0);
|
||||
SpanU32 s1 = VecU32_span(&c, 3, 1);
|
||||
SpanU32 s2 = VecU32_span(&c, 2, 2);
|
||||
SpanU32 s3 = VecU32_span(&c, 1, 3);
|
||||
SpanU32 s4 = VecU32_span(&c, 0, 4);
|
||||
assert(*SpanU32_cat(s4, 3) == 17);
|
||||
MutSpanU32 s0 = VecU32_mspan(&c, 4, 0);
|
||||
MutSpanU32 s1 = VecU32_mspan(&c, 3, 1);
|
||||
MutSpanU32 s2 = VecU32_mspan(&c, 2, 2);
|
||||
MutSpanU32 s3 = VecU32_mspan(&c, 1, 3);
|
||||
MutSpanU32 s4 = VecU32_mspan(&c, 0, 4);
|
||||
assert(*MutSpanU32_at(s4, 3) == 17);
|
||||
for (size_t i = 0; i < 3; i++) {
|
||||
*VecU32_at(&c, i) = i;
|
||||
*VecU32_mat(&c, i) = i;
|
||||
}
|
||||
*SpanU32_at(s3, 2) = 3;
|
||||
assert(*SpanU32_at(s1, 0) == 3);
|
||||
assert(*SpanU32_at(s2, 0) == 2);
|
||||
assert(*SpanU32_at(s3, 0) == 1);
|
||||
assert(*SpanU32_at(s4, 0) == 0);
|
||||
*MutSpanU32_at(s3, 2) = 3;
|
||||
assert(*MutSpanU32_at(s1, 0) == 3);
|
||||
assert(*MutSpanU32_at(s2, 0) == 2);
|
||||
assert(*MutSpanU32_at(s3, 0) == 1);
|
||||
assert(*MutSpanU32_at(s4, 0) == 0);
|
||||
VecU32 d = VecU32_clone(&c);
|
||||
VecU32 e = VecU32_clone(&c);
|
||||
VecU32_append(&c, 50);
|
||||
@ -75,9 +74,9 @@ int main() {
|
||||
assert(d.capacity == 4);
|
||||
assert(c.len == 5);
|
||||
for (int i = 0; i < 4; i++) {
|
||||
VecU32_pop_and_drop(&d);
|
||||
VecU32_pop(&d);
|
||||
}
|
||||
assert(*VecU32_cat(&e, 4) == 500);
|
||||
assert(*VecU32_at(&e, 4) == 500);
|
||||
|
||||
VecU32_drop(e);
|
||||
VecU32_drop(d);
|
||||
|
||||
@ -1,15 +1,16 @@
|
||||
#include "../core/VecSpan_Vec_int_primitives.h"
|
||||
#include "../../../gen/l1/VecAndSpanAndOption_int_primitives.h"
|
||||
#include "../../../gen/l1/VecAndSpan_Vec_int_primitives.h"
|
||||
|
||||
int main() {
|
||||
VecU64 v = VecU64_new();
|
||||
for (int i = 0; i < 3; i++) {
|
||||
VecU64_append(&v, i);
|
||||
*VecU64_at(&v, i) = *VecU64_cat(&v, i) + 10;
|
||||
*VecU64_mat(&v, i) = *VecU64_at(&v, i) + 10;
|
||||
}
|
||||
VecVecU64 a = VecVecU64_new_filled(2, &v);
|
||||
VecU64_drop(v);
|
||||
assert(VecU64_equal_VecU64(VecVecU64_at(&a, 0), VecVecU64_at(&a, 1)));
|
||||
VecU64_pop_and_drop(VecVecU64_at(&a, 1));
|
||||
VecU64_pop(VecVecU64_mat(&a, 1));
|
||||
assert(!VecU64_equal_VecU64(VecVecU64_at(&a, 0), VecVecU64_at(&a, 1)));
|
||||
VecVecU64 b = VecVecU64_new();
|
||||
VecVecU64_append(&b, VecU64_new());
|
||||
@ -17,11 +18,11 @@ int main() {
|
||||
VecVecU64_append(&b, VecU64_new());
|
||||
assert(!VecVecU64_equal_VecVecU64(&a, &b));
|
||||
for (int i = 0; i < 3; i++) {
|
||||
VecU64_append(VecVecU64_at(&b, 0), 10 + i);
|
||||
VecU64_append(VecVecU64_mat(&b, 0), 10 + i);
|
||||
}
|
||||
assert(!VecVecU64_equal_VecVecU64(&a, &b));
|
||||
for (int i = 0; i < 2; i++) {
|
||||
VecU64_append(VecVecU64_at(&b, 1), 10 + i);
|
||||
VecU64_append(VecVecU64_mat(&b, 1), 10 + i);
|
||||
}
|
||||
assert(VecVecU64_equal_VecVecU64(&a, &b));
|
||||
VecVecU64 c = VecVecU64_clone(&a);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user