forked from GitHub/gf-core
gu_buf_binsearch -> gu_seq_binsearch. Improved API
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user