From a1862f54c177bbfbd3b413032dcd3402051dd211 Mon Sep 17 00:00:00 2001 From: Seoxi Ryouko Date: Tue, 18 Aug 2026 09:08:01 -0500 Subject: [PATCH] added find, more tests --- .gitignore | 1 + Makefile | 5 ----- justfile | 10 ++++++++++ libkeke_array.c | 12 +++++++++--- libkeke_array.h | 2 +- libkeke_utils.c | 17 +++++++++++++++++ libkeke_utils.h | 12 +++--------- test_array.c | 9 ++++++++- test_symbol.c | 20 ++++++++++++++++++++ 9 files changed, 69 insertions(+), 19 deletions(-) delete mode 100644 Makefile create mode 100644 justfile create mode 100644 libkeke_utils.c create mode 100644 test_symbol.c diff --git a/.gitignore b/.gitignore index deb6f3f..efef644 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ test_array +test_symbol diff --git a/Makefile b/Makefile deleted file mode 100644 index 85f4843..0000000 --- a/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -CC = zig cc -CFLAGS = -O2 -std=c23 #-Wall -Wextra -Wno-c2x-extensions -test_array: - $(CC) $(CFLAGS) -o test_array test_array.c libkeke_array.c - ./test_array diff --git a/justfile b/justfile new file mode 100644 index 0000000..790c303 --- /dev/null +++ b/justfile @@ -0,0 +1,10 @@ + +test_all: && test_array test_symbol + +test_array: + zig cc -o test_array -std=c23 test_array.c libkeke_array.c libkeke_utils.c + ./test_array + +test_symbol: + zig cc -o test_symbol -std=c23 test_symbol.c libkeke_symbol.c + ./test_symbol diff --git a/libkeke_array.c b/libkeke_array.c index 98b4e2f..d3fa6e5 100644 --- a/libkeke_array.c +++ b/libkeke_array.c @@ -19,11 +19,9 @@ typedef struct { #define ARRAY_GET(array, i) ((array)->content + (array)->type_size * (i)) KekeArray *keke_array_alloc(size_t initial_len, size_t type_size) { - //if(initial_len == 0) initial_len = 1; KekeArray *array = malloc(sizeof(*array)); array->len = initial_len; - size_t max_len = 1; - while(initial_len >>= 1) max_len <<= 1; + size_t max_len = next_power_of_two(initial_len); array->type_size = type_size; array->max_len = max_len; @@ -170,6 +168,14 @@ bool keke_array_all(KekeArray *array, Test_func test) { return ret; } +void *keke_array_find(KekeArray *array, Test_func test) { + for(size_t i = 0; i < array->len; i++) { + void *current = ARRAY_GET(array, i); + if(test(current, i, array)) return current; + } + return NULL; +} + KekeArray *keke_array_filter(KekeArray *array, Test_func test) { KekeArray *ret = keke_array_alloc(0, array->type_size); for(size_t i = 0; i < array->len; i++) { diff --git a/libkeke_array.h b/libkeke_array.h index d1c9069..24e9477 100644 --- a/libkeke_array.h +++ b/libkeke_array.h @@ -40,7 +40,7 @@ void keke_array_reverse(KekeArray *array); typedef bool (*Test_func)(void *, size_t, KekeArray *); bool keke_array_some(KekeArray *array, Test_func test); bool keke_array_all(KekeArray *array, Test_func test); - +void *keke_array_find(KekeArray *array, Test_func test); KekeArray *keke_array_filter(KekeArray *array, Test_func test); typedef void (*B_func)(void *, void *); diff --git a/libkeke_utils.c b/libkeke_utils.c new file mode 100644 index 0000000..009bd3b --- /dev/null +++ b/libkeke_utils.c @@ -0,0 +1,17 @@ +#include + +void keke_swap(void *a, void *b, size_t size) { + char *aa = a; + char *bb = b; + for(size_t i = 0; i < size; i++) { + aa[i] ^= bb[i]; + bb[i] ^= aa[i]; + aa[i] ^= bb[i]; + } +} + +size_t next_power_of_two(size_t s) { + size_t t = 1; + while(t < s) t <<= 1; + return t; +} diff --git a/libkeke_utils.h b/libkeke_utils.h index 7d44f30..05870fd 100644 --- a/libkeke_utils.h +++ b/libkeke_utils.h @@ -5,14 +5,8 @@ #define BOOL_PRETTY(b) (b ? "True" : "False") -static void keke_swap(void *a, void *b, size_t size) { - char *aa = a; - char *bb = b; - for(size_t i = 0; i < size; i++) { - aa[i] ^= bb[i]; - bb[i] ^= aa[i]; - aa[i] ^= bb[i]; - } -} +void keke_swap(void *, void *, size_t); +size_t next_power_of_two(size_t s); #endif + diff --git a/test_array.c b/test_array.c index 513a285..9b6b46f 100644 --- a/test_array.c +++ b/test_array.c @@ -22,6 +22,10 @@ void sub4(void *i, size_t, KekeArray *) { bool heart(void *i, size_t, KekeArray *) { return *(int *)i < 3; } +bool lt2(void *i, size_t, KekeArray *) { + return *(int *)i < 2; +} + void add(void *vx, void *vacc) { int *x = (int *)vx; @@ -120,6 +124,10 @@ int main(void) { keke_array_foreach(array4, output); puts("\n"); + int *l = keke_array_find(array2, lt2); + puts("Expected value:\n1"); + printf("%d\n\n", *l); + j = 0; keke_array_reduce(array4, add, &j); printf("Expected value:\n7\n%d\n\n", j); @@ -127,6 +135,5 @@ int main(void) { keke_array_free(array); keke_array_free(array2); keke_array_free(array4); - puts("\n"); return 0; } diff --git a/test_symbol.c b/test_symbol.c new file mode 100644 index 0000000..8b3e2a7 --- /dev/null +++ b/test_symbol.c @@ -0,0 +1,20 @@ +#include +#include "libkeke_symbol.h" + +int main(void) { + KekeSymbol s = keke_new_symbol(); + if(s == KEKE_NULL_SYMBOL) { + puts("s != KEKE_NULL_SYMBOL\nTEST FAILED"); + return 1; + } else { + puts("s != KEKE_NULL_SYMBOL\nTEST PASSED\n"); + } + + KekeSymbol t = keke_new_symbol(); + if(s == t) { + puts("s == t\nTEST FAILED"); + return 1; + } else { + puts("s != t\nTEST PASSED\n"); + } +}