summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/runtime/c/gu/seq.c17
-rw-r--r--src/runtime/c/gu/seq.h7
2 files changed, 12 insertions, 12 deletions
diff --git a/src/runtime/c/gu/seq.c b/src/runtime/c/gu/seq.c
index cb6de42c9..538ce0762 100644
--- a/src/runtime/c/gu/seq.c
+++ b/src/runtime/c/gu/seq.c
@@ -3,7 +3,6 @@
#include <gu/fun.h>
#include <gu/str.h>
#include <gu/assert.h>
-#include <string.h>
#include <stdlib.h>
struct GuSeq {
@@ -255,29 +254,27 @@ gu_buf_sort(GuBuf *buf, GuOrder *order)
gu_quick_sort(buf, order, 0, gu_buf_length(buf) - 1);
}
-bool
-gu_buf_binsearch(GuBuf *buf, GuOrder *order, void *value)
+void*
+gu_seq_binsearch_(GuSeq *seq, GuOrder *order, size_t elem_size, size_t field_offset, void *key)
{
size_t i = 0;
- size_t j = gu_buf_length(buf)-1;
+ size_t j = seq->len-1;
while (i <= j) {
size_t k = (i+j) / 2;
- int cmp = order->compare(order, value, &buf->seq->data[buf->elem_size * k]);
+ uint8_t* elem_p = &seq->data[elem_size * k];
+ int cmp = order->compare(order, key, elem_p + field_offset);
if (cmp < 0) {
j = k-1;
} else if (cmp > 0) {
i = k+1;
} else {
- memcpy(value,
- &buf->seq->data[buf->elem_size * k],
- buf->elem_size);
- return true;
+ return elem_p;
}
}
- return false;
+ return NULL;
}
static void
diff --git a/src/runtime/c/gu/seq.h b/src/runtime/c/gu/seq.h
index 9af95bed8..6bc050088 100644
--- a/src/runtime/c/gu/seq.h
+++ b/src/runtime/c/gu/seq.h
@@ -114,8 +114,11 @@ gu_seq_resize_tail(GuSeq seq, ptrdiff_t change);
void
gu_buf_sort(GuBuf *buf, GuOrder *order);
-bool
-gu_buf_binsearch(GuBuf *buf, GuOrder *order, void *value);
+#define gu_seq_binsearch(S, O, T, N, V) \
+ ((T*) gu_seq_binsearch_(S, O, sizeof(T), offsetof(T,N), V))
+
+void*
+gu_seq_binsearch_(GuSeq *seq, GuOrder *order, size_t elem_size, size_t field_offset, void *key);
// Using a buffer as a heap
void