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 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 * static const char *
_eina_stringshare_small_bucket_find(const Eina_Stringshare_Small_Bucket *bucket, const char *str, unsigned char length, int *index) _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) while (low < high)
{ {
unsigned char cur_length; int r;
i = (low + high - 1) / 2; i = (low + high - 1) / 2;
cur_length = bucket->lengths[i];
if (cur_length > length) r = _eina_stringshare_small_cmp(bucket, i, pstr, plength);
high = i; if (r > 0)
else if (cur_length < length) {
low = i + 1; high = i;
}
else if (r < 0)
{
low = i + 1;
}
else else
{ {
const char *cur_pstr = bucket->strings[i] + 1; *index = i;
int r; return bucket->strings[i];
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];
}
} }
} }