Added dependency-injected shuffle function

This commit is contained in:
2026-08-21 01:01:11 -05:00
parent d3aafcbee0
commit 5f92d24de0
5 changed files with 40 additions and 14 deletions
+10 -1
View File
@@ -22,7 +22,7 @@ typedef struct {
KekeArray *keke_array_alloc(size_t initial_len, size_t type_size) { KekeArray *keke_array_alloc(size_t initial_len, size_t type_size) {
KekeArray *array = malloc(sizeof(*array)); KekeArray *array = malloc(sizeof(*array));
array->len = initial_len; array->len = initial_len;
size_t max_len = next_power_of_two(initial_len); size_t max_len = bit_ceil(initial_len);
array->type_size = type_size; array->type_size = type_size;
array->max_len = max_len; array->max_len = max_len;
@@ -198,6 +198,15 @@ void keke_array_qsort_header(KekeArray *array, size_t start_header_size) {
qsort_r(array->content, array->len, array->type_size, compar, &start_header_size); qsort_r(array->content, array->len, array->type_size, compar, &start_header_size);
} }
typedef int (*Rng_fun)(int);
void keke_array_shuffle(KekeArray *array, Rng_fun rng) {
for(size_t i = 0; i < array->len; ++i) {
size_t j = rng(i + 1);
keke_swap(ARRAY_GET(array, i), ARRAY_GET(array, j), array->type_size);
}
}
// requires pre-sorted arrays // requires pre-sorted arrays
KekeArray *keke_array_merge(KekeArray *a, KekeArray *b) { KekeArray *keke_array_merge(KekeArray *a, KekeArray *b) {
if(a->len == 0) { if(a->len == 0) {
+3 -1
View File
@@ -40,13 +40,15 @@ void keke_array_reverse(KekeArray *array);
void keke_array_qsort(KekeArray *array); void keke_array_qsort(KekeArray *array);
void keke_array_qsort_header(KekeArray *array, size_t start_header_size); void keke_array_qsort_header(KekeArray *array, size_t start_header_size);
KekeArray *keke_array_merge(KekeArray *a, KekeArray *b); KekeArray *keke_array_merge(KekeArray *a, KekeArray *b);
typedef int (*Rng_fun)(int);
void keke_array_shuffle(KekeArray *array, Rng_fun rng);
typedef bool (*Test_func)(void *, size_t, KekeArray *); typedef bool (*Test_func)(void *, size_t, KekeArray *);
bool keke_array_some(KekeArray *array, Test_func test); bool keke_array_some(KekeArray *array, Test_func test);
bool keke_array_all(KekeArray *array, Test_func test); bool keke_array_all(KekeArray *array, Test_func test);
void *keke_array_find_start(KekeArray *array, void *start, size_t size);
void *keke_array_find(KekeArray *array, Test_func test); void *keke_array_find(KekeArray *array, Test_func test);
void *keke_array_find_start(KekeArray *array, void *start, size_t size);
KekeArray *keke_array_filter(KekeArray *array, Test_func test); KekeArray *keke_array_filter(KekeArray *array, Test_func test);
+14 -4
View File
@@ -1,16 +1,26 @@
#include <stddef.h> #include <stddef.h>
void keke_swap(void *a, void *b, size_t size) { void keke_swap(void *a, void *b, size_t size) {
char *aa = a; if(a == b) return;
char *bb = b; size_t i = 0;
for(size_t i = 0; i < size; i++) { int *ia = a;
int *ib = b;
for(i = 0; i < (size / sizeof(int)); ++i) {
ia[i] ^= ib[i];
ib[i] ^= ia[i];
ia[i] ^= ib[i];
}
size %= sizeof(int);
char *aa = a + (i * sizeof(int));
char *bb = b + (i * sizeof(int));
for(i = 0; i < size; i++) {
aa[i] ^= bb[i]; aa[i] ^= bb[i];
bb[i] ^= aa[i]; bb[i] ^= aa[i];
aa[i] ^= bb[i]; aa[i] ^= bb[i];
} }
} }
size_t next_power_of_two(size_t s) { size_t bit_ceil(size_t s) {
size_t t = 1; size_t t = 1;
while(t < s) t <<= 1; while(t < s) t <<= 1;
return t; return t;
+1 -1
View File
@@ -6,7 +6,7 @@
#define BOOL_PRETTY(b) (b ? "True" : "False") #define BOOL_PRETTY(b) (b ? "True" : "False")
void keke_swap(void *, void *, size_t); void keke_swap(void *, void *, size_t);
size_t next_power_of_two(size_t s); size_t bit_ceil(size_t s);
#endif #endif
+9 -4
View File
@@ -33,6 +33,10 @@ void add(void *vx, void *vacc) {
*acc += *x; *acc += *x;
} }
int rng(int x) {
return rand() % x;
}
int main(void) { int main(void) {
KekeArray *array = keke_array_alloc(ARRAY_LEN, sizeof(int)); KekeArray *array = keke_array_alloc(ARRAY_LEN, sizeof(int));
@@ -78,7 +82,7 @@ int main(void) {
puts("\n"); puts("\n");
keke_array_pop(array2, &j); keke_array_pop(array2, &j);
puts("Expected value:\n7, 7, 6, 5, 6,\t0"); puts("Expected value:\n7, 7, 6, 5, 6,\t5");
keke_array_foreach(array2, output); keke_array_foreach(array2, output);
printf("\t%d", j); printf("\t%d", j);
puts("\n"); puts("\n");
@@ -147,9 +151,10 @@ int main(void) {
printf("Expected value:\n0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 5, 6, 7, 8, 9,\n"); printf("Expected value:\n0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 5, 6, 7, 8, 9,\n");
keke_array_foreach(array5, output); keke_array_foreach(array5, output);
puts("\n"); puts("\n");
keke_array_foreach(array, output);
puts("\n"); keke_array_shuffle(array5, rng);
keke_array_foreach(array2, output); printf("Expected value:\n2, 0, 3, 7, 3, 1, 8, 2, 2, 1, 3, 5, 6, 2, 9, 4,\n");
keke_array_foreach(array5, output);
puts("\n"); puts("\n");
keke_array_free(array); keke_array_free(array);