1
0
forked from GitHub/gf-core

gu_buf_binsearch -> gu_seq_binsearch. Improved API

This commit is contained in:
kr.angelov
2013-09-17 19:04:46 +00:00
parent 62019f0881
commit b6ba5e7493
2 changed files with 12 additions and 12 deletions

View File

@@ -3,7 +3,6 @@
#include <gu/fun.h> #include <gu/fun.h>
#include <gu/str.h> #include <gu/str.h>
#include <gu/assert.h> #include <gu/assert.h>
#include <string.h>
#include <stdlib.h> #include <stdlib.h>
struct GuSeq { struct GuSeq {
@@ -255,29 +254,27 @@ gu_buf_sort(GuBuf *buf, GuOrder *order)
gu_quick_sort(buf, order, 0, gu_buf_length(buf) - 1); gu_quick_sort(buf, order, 0, gu_buf_length(buf) - 1);
} }
bool void*
gu_buf_binsearch(GuBuf *buf, GuOrder *order, void *value) gu_seq_binsearch_(GuSeq *seq, GuOrder *order, size_t elem_size, size_t field_offset, void *key)
{ {
size_t i = 0; size_t i = 0;
size_t j = gu_buf_length(buf)-1; size_t j = seq->len-1;
while (i <= j) { while (i <= j) {
size_t k = (i+j) / 2; 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) { if (cmp < 0) {
j = k-1; j = k-1;
} else if (cmp > 0) { } else if (cmp > 0) {
i = k+1; i = k+1;
} else { } else {
memcpy(value, return elem_p;
&buf->seq->data[buf->elem_size * k],
buf->elem_size);
return true;
} }
} }
return false; return NULL;
} }
static void static void

View File

@@ -114,8 +114,11 @@ gu_seq_resize_tail(GuSeq seq, ptrdiff_t change);
void void
gu_buf_sort(GuBuf *buf, GuOrder *order); gu_buf_sort(GuBuf *buf, GuOrder *order);
bool #define gu_seq_binsearch(S, O, T, N, V) \
gu_buf_binsearch(GuBuf *buf, GuOrder *order, void *value); ((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 // Using a buffer as a heap
void void