forked from enlightenment/efl
evas/cserve2: binary search in Shared_Array
This commit is contained in:
parent
d0e647fee3
commit
315c2fd161
|
@ -38,9 +38,9 @@ struct _Shared_Array_Header
|
||||||
int32_t count;
|
int32_t count;
|
||||||
int32_t generation_id;
|
int32_t generation_id;
|
||||||
int32_t emptyidx;
|
int32_t emptyidx;
|
||||||
|
int32_t sortedidx;
|
||||||
int32_t _reserved1;
|
int32_t _reserved1;
|
||||||
int32_t _reserved2;
|
int32_t _reserved2;
|
||||||
int32_t _reserved3;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _Shared_Array
|
struct _Shared_Array
|
||||||
|
@ -280,8 +280,9 @@ cserve2_shared_array_new(int tag, int elemsize, int initcount)
|
||||||
sa->header->elemsize = elemsize;
|
sa->header->elemsize = elemsize;
|
||||||
sa->header->generation_id = 1;
|
sa->header->generation_id = 1;
|
||||||
sa->header->emptyidx = 0;
|
sa->header->emptyidx = 0;
|
||||||
|
sa->header->sortedidx = 0;
|
||||||
sa->header->tag = tag;
|
sa->header->tag = tag;
|
||||||
memset(&sa->header->_reserved1, 0, sizeof(int32_t) * 3);
|
memset(&sa->header->_reserved1, 0, sizeof(int32_t) * 2);
|
||||||
|
|
||||||
return sa;
|
return sa;
|
||||||
}
|
}
|
||||||
|
@ -449,6 +450,7 @@ cserve2_shared_array_repack(Shared_Array *sa,
|
||||||
|
|
||||||
// Finalize & return
|
// Finalize & return
|
||||||
sa2->header->emptyidx = newcount;
|
sa2->header->emptyidx = newcount;
|
||||||
|
sa2->header->sortedidx = newcount;
|
||||||
sa2->header->tag = sa->header->tag;
|
sa2->header->tag = sa->header->tag;
|
||||||
return sa2;
|
return sa2;
|
||||||
}
|
}
|
||||||
|
@ -462,12 +464,33 @@ cserve2_shared_array_item_find(Shared_Array *sa, void *data,
|
||||||
|
|
||||||
if (!sa || !cmp) return -1;
|
if (!sa || !cmp) return -1;
|
||||||
|
|
||||||
// TODO: Fast search in the sorted zone
|
// Binary search
|
||||||
|
if (sa->header->sortedidx > 0)
|
||||||
ptr = sa->ds->data + sizeof(Shared_Array_Header);
|
{
|
||||||
|
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)
|
// 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))
|
if (!cmp(ptr, data))
|
||||||
return k;
|
return k;
|
||||||
|
|
Loading…
Reference in New Issue