added find, more tests
This commit is contained in:
@@ -1 +1,2 @@
|
||||
test_array
|
||||
test_symbol
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
+9
-3
@@ -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++) {
|
||||
|
||||
+1
-1
@@ -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 *);
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
#include <stddef.h>
|
||||
|
||||
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;
|
||||
}
|
||||
+3
-9
@@ -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
|
||||
|
||||
|
||||
+8
-1
@@ -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;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
#include <stdio.h>
|
||||
#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");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user