dbghelp: Sparse array speed up.
This commit is contained in:
parent
5c06093457
commit
9a41a4e984
|
@ -244,22 +244,55 @@ void sparse_array_init(struct sparse_array* sa, unsigned elt_sz, unsigned bucket
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
* spare_array_lookup
|
* sparse_array_lookup
|
||||||
*
|
*
|
||||||
* Returns the first index which key is >= at passed key
|
* Returns the first index which key is >= at passed key
|
||||||
*/
|
*/
|
||||||
static struct key2index* spare_array_lookup(const struct sparse_array* sa,
|
static struct key2index* sparse_array_lookup(const struct sparse_array* sa,
|
||||||
unsigned long key, unsigned* idx)
|
unsigned long key, unsigned* idx)
|
||||||
{
|
{
|
||||||
struct key2index* pk2i;
|
struct key2index* pk2i;
|
||||||
|
unsigned low, high;
|
||||||
|
|
||||||
/* FIXME: should use bsearch here */
|
if (!sa->elements.num_elts)
|
||||||
for (*idx = 0; *idx < sa->elements.num_elts; (*idx)++)
|
|
||||||
{
|
{
|
||||||
pk2i = vector_at(&sa->key2index, *idx);
|
*idx = 0;
|
||||||
if (pk2i && pk2i->key >= key) return pk2i;
|
return NULL;
|
||||||
}
|
}
|
||||||
return NULL;
|
high = sa->elements.num_elts;
|
||||||
|
pk2i = vector_at(&sa->key2index, high - 1);
|
||||||
|
if (pk2i->key < key)
|
||||||
|
{
|
||||||
|
*idx = high;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (pk2i->key == key)
|
||||||
|
{
|
||||||
|
*idx = high - 1;
|
||||||
|
return pk2i;
|
||||||
|
}
|
||||||
|
low = 0;
|
||||||
|
pk2i = vector_at(&sa->key2index, low);
|
||||||
|
if (pk2i->key >= key)
|
||||||
|
{
|
||||||
|
*idx = 0;
|
||||||
|
return pk2i;
|
||||||
|
}
|
||||||
|
/* now we have: sa(lowest key) < key < sa(highest key) */
|
||||||
|
while (low < high)
|
||||||
|
{
|
||||||
|
*idx = (low + high) / 2;
|
||||||
|
pk2i = vector_at(&sa->key2index, *idx);
|
||||||
|
if (pk2i->key > key) high = *idx;
|
||||||
|
else if (pk2i->key < key) low = *idx + 1;
|
||||||
|
else return pk2i;
|
||||||
|
}
|
||||||
|
/* binary search could return exact item, we search for highest one
|
||||||
|
* below the key
|
||||||
|
*/
|
||||||
|
if (pk2i->key < key)
|
||||||
|
pk2i = vector_at(&sa->key2index, ++(*idx));
|
||||||
|
return pk2i;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* sparse_array_find(const struct sparse_array* sa, unsigned long key)
|
void* sparse_array_find(const struct sparse_array* sa, unsigned long key)
|
||||||
|
@ -267,7 +300,7 @@ void* sparse_array_find(const struct sparse_array* sa, unsigned long key)
|
||||||
unsigned idx;
|
unsigned idx;
|
||||||
struct key2index* pk2i;
|
struct key2index* pk2i;
|
||||||
|
|
||||||
if ((pk2i = spare_array_lookup(sa, key, &idx)) && pk2i->key == key)
|
if ((pk2i = sparse_array_lookup(sa, key, &idx)) && pk2i->key == key)
|
||||||
return vector_at(&sa->elements, pk2i->index);
|
return vector_at(&sa->elements, pk2i->index);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -279,7 +312,7 @@ void* sparse_array_add(struct sparse_array* sa, unsigned long key,
|
||||||
struct key2index* pk2i;
|
struct key2index* pk2i;
|
||||||
struct key2index* to;
|
struct key2index* to;
|
||||||
|
|
||||||
pk2i = spare_array_lookup(sa, key, &idx);
|
pk2i = sparse_array_lookup(sa, key, &idx);
|
||||||
if (pk2i && pk2i->key == key)
|
if (pk2i && pk2i->key == key)
|
||||||
{
|
{
|
||||||
FIXME("re adding an existing key\n");
|
FIXME("re adding an existing key\n");
|
||||||
|
|
Loading…
Reference in New Issue