1 #include <stdlib.h> // for malloc, realloc, free, qsort
2 #include <string.h> // for memmove, memcpy, memcmp
4 #include "bits/callback.h" // for Comparator
6 void array_ini(Array *array, size_t mbs, size_t ext)
15 void array_rlc(Array *array)
17 array->ptr = realloc(array->ptr, array->cap * array->mbs);
20 void array_grw(Array *array, size_t n)
24 if (array->siz > array->cap) {
25 array->cap = array->siz + array->ext;
30 void array_shr(Array *array, size_t n)
34 if (array->cap > array->siz) {
35 array->cap = array->siz;
40 void array_put(Array *array, const void *ptr, size_t n)
42 size_t oldsiz = array->siz;
45 char *iptr = array->ptr + n * array->mbs;
46 memmove(iptr + array->mbs, iptr, (oldsiz - n) * array->mbs);
47 memcpy(iptr, ptr, array->mbs);
50 void array_apd(Array *array, const void *ptr)
52 size_t oldsiz = array->siz;
55 memcpy(array->ptr + oldsiz * array->mbs, ptr, array->mbs);
58 ssize_t array_idx(Array *array, const void *ptr)
60 for (size_t i = 0; i < array->siz; i++)
61 if (memcmp(array->ptr + i * array->mbs, ptr, array->mbs) == 0)
67 void array_cpy(Array *array, void **ptr, size_t *n)
70 size_t size = array->siz * array->mbs;
72 memcpy(*ptr, array->ptr, size);
75 void array_cln(Array *dst, Array *src)
77 array_ini(dst, src->mbs, src->ext);
78 array_cpy(src, &dst->ptr, &dst->siz);
82 void array_rcy(Array *array)
87 void array_clr(Array *array)
91 array_ini(array, array->mbs, array->ext);
94 void array_srt(Array *array, void *cmp)
96 qsort(array->ptr, array->siz, array->mbs, cmp);
99 ssize_t array_fnd(Array *array, const void *ptr, size_t *idx, void *cmp)
101 size_t low, high, mid;
107 mid = (low + high) / 2;
109 int rel = ((Comparator) cmp)(ptr, array->ptr + mid * array->mbs);
112 return idx ? (*idx = mid) : mid;
125 size_t array_ins(Array *array, const void *ptr, void *cmp)
129 array_fnd(array, ptr, &n, cmp);
130 array_put(array, ptr, n);