Added merge
This commit is contained in:
+46
-1
@@ -6,6 +6,7 @@
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include "libkeke_utils.h"
|
||||
#include "libkeke_array.h"
|
||||
|
||||
@@ -81,8 +82,8 @@ void keke_array_insert(KekeArray *array, size_t index, const void *value) {
|
||||
}
|
||||
|
||||
void keke_array_remove(KekeArray *array, size_t index, void *value) {
|
||||
keke_array_set_len(array, array->len - 1);
|
||||
memcpy(value, array->content + index * array->type_size, array->type_size);
|
||||
keke_array_set_len(array, array->len - 1);
|
||||
memmove(array->content + (index * array->type_size), array->content + ((index + 1) * array->type_size), (array->len - index + 1) * array->type_size);
|
||||
}
|
||||
|
||||
@@ -184,6 +185,50 @@ void *keke_array_find_start(KekeArray *array, void *start, size_t size) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int compar(const void *a, const void *b, void *size_v) {
|
||||
size_t *size = size_v;
|
||||
return memcmp(a, b, *size);
|
||||
}
|
||||
|
||||
void keke_array_qsort(KekeArray *array) {
|
||||
qsort_r(array->content, array->len, array->type_size, compar, &array->type_size);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
// requires pre-sorted arrays
|
||||
KekeArray *keke_array_merge(KekeArray *a, KekeArray *b) {
|
||||
if(a->len == 0) return keke_array_clone(b);
|
||||
if(b->len == 0) return keke_array_clone(a);
|
||||
keke_array_reverse(a);
|
||||
keke_array_reverse(b);
|
||||
if(a->type_size != b->type_size) return NULL;
|
||||
KekeArray *c = keke_array_alloc(a->len + b->len, a->type_size);
|
||||
keke_array_set_len(c, 0);
|
||||
void *s = malloc(a->type_size);
|
||||
while(!!(a->len) && !!(b->len)) {
|
||||
if(memcmp(ARRAY_GET(a, a->len - 1), ARRAY_GET(b, b->len - 1), a->type_size) <= 0) {
|
||||
keke_array_pop(a, s) ;
|
||||
keke_array_push(c, s);
|
||||
} else {
|
||||
keke_array_pop(b, s);
|
||||
keke_array_push(c, s);
|
||||
}
|
||||
}
|
||||
while(a->len) {
|
||||
keke_array_pop(a, s);
|
||||
keke_array_push(c, s);
|
||||
}
|
||||
while(b->len) {
|
||||
keke_array_pop(b, s);
|
||||
keke_array_push(c, s);
|
||||
}
|
||||
free(s);
|
||||
return c;
|
||||
}
|
||||
|
||||
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++) {
|
||||
|
||||
Reference in New Issue
Block a user