evas/cserve2: binary search in Shared_Array

This commit is contained in:
Jean-Philippe Andre 2013-07-24 10:59:51 +09:00
parent d0e647fee3
commit 315c2fd161
1 changed files with 29 additions and 6 deletions

View File

@ -38,9 +38,9 @@ struct _Shared_Array_Header
int32_t count;
int32_t generation_id;
int32_t emptyidx;
int32_t sortedidx;
int32_t _reserved1;
int32_t _reserved2;
int32_t _reserved3;
};
struct _Shared_Array
@ -280,8 +280,9 @@ cserve2_shared_array_new(int tag, int elemsize, int initcount)
sa->header->elemsize = elemsize;
sa->header->generation_id = 1;
sa->header->emptyidx = 0;
sa->header->sortedidx = 0;
sa->header->tag = tag;
memset(&sa->header->_reserved1, 0, sizeof(int32_t) * 3);
memset(&sa->header->_reserved1, 0, sizeof(int32_t) * 2);
return sa;
}
@ -449,6 +450,7 @@ cserve2_shared_array_repack(Shared_Array *sa,
// Finalize & return
sa2->header->emptyidx = newcount;
sa2->header->sortedidx = newcount;
sa2->header->tag = sa->header->tag;
return sa2;
}
@ -462,12 +464,33 @@ cserve2_shared_array_item_find(Shared_Array *sa, void *data,
if (!sa || !cmp) return -1;
// TODO: Fast search in the sorted zone
ptr = sa->ds->data + sizeof(Shared_Array_Header);
// Binary search
if (sa->header->sortedidx > 0)
{
int low = 0;
int high = sa->header->sortedidx;
int prev = -1;
int r;
k = high / 2;
while (prev != k)
{
ptr = cserve2_shared_array_item_data_get(sa, k);
r = cmp(ptr, data);
if (!r)
return k;
else if (r > 0)
high = k;
else
low = k;
prev = k;
k = low + (high - low) / 2;
}
}
// Linear search O(n)
for (k = 0; k < sa->header->emptyidx; k++)
k = sa->header->sortedidx;
ptr = sa->ds->data + sizeof(Shared_Array_Header) + k * sa->header->elemsize;
for (; k < sa->header->emptyidx; k++)
{
if (!cmp(ptr, data))
return k;