better optimize small stringshare comparison

SVN revision: 37251
This commit is contained in:
Gustavo Sverzut Barbieri 2008-10-27 20:16:52 +00:00
parent c311dd99a2
commit db296d3d3c
1 changed files with 41 additions and 19 deletions

View File

@ -248,6 +248,35 @@ _eina_stringshare_head_free(Eina_Stringshare_Head *ed, __UNUSED__ void *data)
static Eina_Stringshare_Small _eina_small_share;
static inline int
_eina_stringshare_small_cmp(const Eina_Stringshare_Small_Bucket *bucket, int i, const char *pstr, unsigned char plength)
{
const unsigned char cur_plength = bucket->lengths[i] - 1;
const char *cur_pstr;
if (cur_plength > plength)
return 1;
else if (cur_plength < plength)
return -1;
cur_pstr = bucket->strings[i] + 1;
if (cur_pstr[0] > pstr[0])
return 1;
else if (cur_pstr[0] < pstr[0])
return -1;
if (plength == 1)
return 0;
if (cur_pstr[1] > pstr[1])
return 1;
else if (cur_pstr[1] < pstr[1])
return -1;
return 0;
}
static const char *
_eina_stringshare_small_bucket_find(const Eina_Stringshare_Small_Bucket *bucket, const char *str, unsigned char length, int *index)
{
@ -266,30 +295,23 @@ _eina_stringshare_small_bucket_find(const Eina_Stringshare_Small_Bucket *bucket,
while (low < high)
{
unsigned char cur_length;
int r;
i = (low + high - 1) / 2;
cur_length = bucket->lengths[i];
if (cur_length > length)
high = i;
else if (cur_length < length)
low = i + 1;
r = _eina_stringshare_small_cmp(bucket, i, pstr, plength);
if (r > 0)
{
high = i;
}
else if (r < 0)
{
low = i + 1;
}
else
{
const char *cur_pstr = bucket->strings[i] + 1;
int r;
r = memcmp(cur_pstr, pstr, plength);
if (r > 0)
high = i;
else if (r < 0)
low = i + 1;
else
{
*index = i;
return bucket->strings[i];
}
*index = i;
return bucket->strings[i];
}
}