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 #include #include -#include #include 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