1
0
forked from GitHub/gf-core

fix the handling of 'pre' in the C runtime

This commit is contained in:
kr.angelov
2013-10-28 12:35:37 +00:00
parent cd5a0de253
commit 151f86c1e9
5 changed files with 130 additions and 12 deletions

View File

@@ -255,7 +255,7 @@ gu_buf_sort(GuBuf *buf, GuOrder *order)
}
void*
gu_seq_binsearch_(GuSeq *seq, GuOrder *order, size_t elem_size, size_t field_offset, void *key)
gu_seq_binsearch_(GuSeq *seq, GuOrder *order, size_t elem_size, void *key)
{
size_t i = 0;
size_t j = seq->len-1;
@@ -263,8 +263,8 @@ gu_seq_binsearch_(GuSeq *seq, GuOrder *order, size_t elem_size, size_t field_off
while (i <= j) {
size_t k = (i+j) / 2;
uint8_t* elem_p = &seq->data[elem_size * k];
int cmp = order->compare(order, key, elem_p + field_offset);
int cmp = order->compare(order, key, elem_p);
if (cmp < 0) {
j = k-1;
} else if (cmp > 0) {
@@ -273,10 +273,36 @@ gu_seq_binsearch_(GuSeq *seq, GuOrder *order, size_t elem_size, size_t field_off
return elem_p;
}
}
return NULL;
}
bool
gu_seq_binsearch_index_(GuSeq *seq, GuOrder *order, size_t elem_size,
void *key, size_t *pindex)
{
size_t i = 0;
size_t j = seq->len-1;
while (i <= j) {
size_t k = (i+j) / 2;
uint8_t* elem_p = &seq->data[elem_size * k];
int cmp = order->compare(order, key, elem_p);
if (cmp < 0) {
j = k-1;
} else if (cmp > 0) {
i = k+1;
} else {
*pindex = k;
return true;
}
}
*pindex = j;
return false;
}
static void
gu_heap_siftdown(GuBuf *buf, GuOrder *order,
const void *value, int startpos, int pos)