+#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include "array.h"
+Array array_create(size_t membsiz)
+{
+ return (Array) {
+ .membsiz = membsiz,
+ .siz = 0,
+ .cap = 0,
+ .ptr = NULL,
+ .cmp = NULL,
+ };
+}
+
+
static void array_realloc(Array *array)
{
if (array->siz > array->cap) {
memcpy((char *) array->ptr + oldsiz * array->membsiz, elem, array->membsiz);
}
-Array array_create(size_t membsiz)
+ArraySearchResult array_search(Array *array, void *search)
{
- return (Array) {
- .membsiz = membsiz,
- .siz = 0,
- .cap = 0,
- .ptr = NULL,
- };
+ assert(array->cmp);
+ size_t low, high, index;
+
+ low = index = 0;
+ high = array->siz;
+
+ while (low < high) {
+ index = low;
+
+ size_t mid = (low + high) / 2;
+ s8 state = array->cmp(search, (char *) array->ptr + mid * array->membsiz);
+
+ if (state == 0)
+ return (ArraySearchResult) {true, mid};
+ else if (state > 0)
+ high = mid;
+ else
+ low = mid + 1;
+ }
+
+ return (ArraySearchResult) {false, index};
}