and a few less allocs to improve evas_hash

SVN revision: 18245
This commit is contained in:
Carsten Haitzler 2005-11-03 12:13:09 +00:00
parent f9a5f37623
commit ab61f6e24e
1 changed files with 15 additions and 30 deletions

View File

@ -1,12 +1,12 @@
#include "evas_common.h" #include "evas_common.h"
#include "evas_private.h" #include "evas_private.h"
static int evas_hash_gen(const char *key); static inline int _evas_hash_gen(const char *key);
static int _evas_hash_alloc_error = 0; static int _evas_hash_alloc_error = 0;
static int static inline int
evas_hash_gen(const char *key) _evas_hash_gen(const char *key)
{ {
unsigned int hash_num = 0, i; unsigned int hash_num = 0, i;
const unsigned char *ptr; const unsigned char *ptr;
@ -88,6 +88,7 @@ evas_hash_add(Evas_Hash *hash, const char *key, const void *data)
int hash_num; int hash_num;
Evas_Hash_El *el; Evas_Hash_El *el;
if ((!key) || (!data)) return hash;
_evas_hash_alloc_error = 0; _evas_hash_alloc_error = 0;
if (!hash) if (!hash)
{ {
@ -98,7 +99,7 @@ evas_hash_add(Evas_Hash *hash, const char *key, const void *data)
return NULL; return NULL;
} }
} }
if (!(el = malloc(sizeof(struct _Evas_Hash_El)))) if (!(el = malloc(sizeof(struct _Evas_Hash_El) + strlen(key) + 1)))
{ {
if (hash->population <= 0) if (hash->population <= 0)
{ {
@ -108,23 +109,10 @@ evas_hash_add(Evas_Hash *hash, const char *key, const void *data)
_evas_hash_alloc_error = 1; _evas_hash_alloc_error = 1;
return hash; return hash;
}; };
if (key) el->key = ((unsigned char *)el) + sizeof(struct _Evas_Hash_El);
{ strcpy(el->key, key);
el->key = strdup(key);
if (!el->key)
{
free(el);
_evas_hash_alloc_error = 1;
return hash;
}
hash_num = evas_hash_gen(key);
}
else
{
el->key = NULL;
hash_num = 0;
}
el->data = (void *)data; el->data = (void *)data;
hash_num = _evas_hash_gen(key);
hash->buckets[hash_num] = evas_object_list_prepend(hash->buckets[hash_num], el); hash->buckets[hash_num] = evas_object_list_prepend(hash->buckets[hash_num], el);
if (evas_list_alloc_error()) if (evas_list_alloc_error())
{ {
@ -160,15 +148,14 @@ evas_hash_del(Evas_Hash *hash, const char *key, const void *data)
Evas_Object_List *l; Evas_Object_List *l;
if (!hash) return NULL; if (!hash) return NULL;
hash_num = evas_hash_gen(key); hash_num = _evas_hash_gen(key);
for (l = hash->buckets[hash_num]; l; l = l->next) for (l = hash->buckets[hash_num]; l; l = l->next)
{ {
el = (Evas_Hash_El *)l; el = (Evas_Hash_El *)l;
if (((el->key) && (key) && (!strcmp(el->key, key))) || if (((key) && (!strcmp(el->key, key))) ||
((!key) && (el->data == data))) ((!key) && (el->data == data)))
{ {
hash->buckets[hash_num] = evas_object_list_remove(hash->buckets[hash_num], el); hash->buckets[hash_num] = evas_object_list_remove(hash->buckets[hash_num], el);
if (el->key) free(el->key);
free(el); free(el);
hash->population--; hash->population--;
if (hash->population <= 0) if (hash->population <= 0)
@ -198,13 +185,12 @@ evas_hash_find(Evas_Hash *hash, const char *key)
Evas_Object_List *l; Evas_Object_List *l;
_evas_hash_alloc_error = 0; _evas_hash_alloc_error = 0;
if (!hash) return NULL; if ((!hash) || (!key)) return NULL;
hash_num = evas_hash_gen(key); hash_num = _evas_hash_gen(key);
for (l = hash->buckets[hash_num]; l; l = l->next) for (l = hash->buckets[hash_num]; l; l = l->next)
{ {
el = (Evas_Hash_El *)l; el = (Evas_Hash_El *)l;
if (((el->key) && (key) && (!strcmp(el->key, key))) || if (!strcmp(el->key, key))
((!el->key) && (!key)))
{ {
if (l != hash->buckets[hash_num]) if (l != hash->buckets[hash_num])
{ {
@ -236,11 +222,11 @@ evas_hash_modify(Evas_Hash *hash, const char *key, const void *data)
_evas_hash_alloc_error = 0; _evas_hash_alloc_error = 0;
if (!hash) return NULL; if (!hash) return NULL;
hash_num = evas_hash_gen(key); hash_num = _evas_hash_gen(key);
for (l = hash->buckets[hash_num]; l; l = l->next) for (l = hash->buckets[hash_num]; l; l = l->next)
{ {
el = (Evas_Hash_El *)l; el = (Evas_Hash_El *)l;
if ((el->key) && (key) && (!strcmp(el->key, key))) if ((key) && (!strcmp(el->key, key)))
{ {
void *old_data; void *old_data;
@ -314,7 +300,6 @@ evas_hash_free(Evas_Hash *hash)
Evas_Hash_El *el; Evas_Hash_El *el;
el = (Evas_Hash_El *)hash->buckets[i]; el = (Evas_Hash_El *)hash->buckets[i];
if (el->key) free(el->key);
hash->buckets[i] = evas_object_list_remove(hash->buckets[i], el); hash->buckets[i] = evas_object_list_remove(hash->buckets[i], el);
free(el); free(el);
} }