diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2013-09-17 19:04:46 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2013-09-17 19:04:46 +0000 |
| commit | 237c2af7fce29c9de48538eb18daf6ce582eda17 (patch) | |
| tree | 961c83388cda5a99ed67c90622879b64c3ab6e7b /src/runtime/c | |
| parent | d1e6a9c2ba8eafe7a08b81707dd2a3150dae8b7b (diff) | |
gu_buf_binsearch -> gu_seq_binsearch. Improved API
Diffstat (limited to 'src/runtime/c')
| -rw-r--r-- | src/runtime/c/gu/seq.c | 17 | ||||
| -rw-r--r-- | src/runtime/c/gu/seq.h | 7 |
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 |
