From 19f7e364119605de47f3aa47d44ac2b27deaa56b Mon Sep 17 00:00:00 2001 From: cedric Date: Mon, 20 Oct 2008 16:12:47 +0000 Subject: [PATCH] Remove evas hash. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@36862 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/lib/Evas_Data.h | 60 ++-- src/lib/data/Makefile.am | 1 - src/lib/data/evas_hash.c | 474 -------------------------------- src/lib/engines/common/evas_font_load.c | 2 +- 4 files changed, 44 insertions(+), 493 deletions(-) delete mode 100644 src/lib/data/evas_hash.c diff --git a/src/lib/Evas_Data.h b/src/lib/Evas_Data.h index e994ad0..a7418b8 100644 --- a/src/lib/Evas_Data.h +++ b/src/lib/Evas_Data.h @@ -37,15 +37,9 @@ typedef unsigned char Evas_Bool; #define Evas_List Eina_List +#define Evas_Hash Eina_Hash typedef struct _Evas_Array_Hash Evas_Array_Hash; -typedef struct _Evas_Hash Evas_Hash; /**< A Hash table handle */ - -struct _Evas_Hash -{ - int population; - Eina_Inlist *buckets[256]; -}; #ifdef __cplusplus extern "C" { @@ -71,16 +65,48 @@ extern "C" { * * do we really need this? hmmm - let me think... there may be a better way */ - EAPI Evas_Hash *evas_hash_add (Evas_Hash *hash, const char *key, const void *data); - EAPI Evas_Hash *evas_hash_direct_add (Evas_Hash *hash, const char *key, const void *data); - EAPI Evas_Hash *evas_hash_del (Evas_Hash *hash, const char *key, const void *data); - EAPI void *evas_hash_find (const Evas_Hash *hash, const char *key); - EAPI void *evas_hash_modify (Evas_Hash *hash, const char *key, const void *data); - EAPI int evas_hash_size (const Evas_Hash *hash); - EAPI void evas_hash_free (Evas_Hash *hash); - EAPI void evas_hash_foreach (const Evas_Hash *hash, Evas_Bool (*func) (const Evas_Hash *hash, const char *key, void *data, void *fdata), const void *fdata); - EAPI int evas_hash_alloc_error (void); - + static inline Eina_Hash *evas_hash_add(Eina_Hash *hash, const char *key, const void *data) + { + if (!hash) hash = eina_hash_string_superfast_new(NULL); + if (!hash) return NULL; + + eina_hash_add(hash, key, data); + return hash; + } + + static inline Eina_Hash *evas_hash_direct_add(Eina_Hash *hash, const char *key, const void *data) + { + if (!hash) hash = eina_hash_string_superfast_new(NULL); + if (!hash) return NULL; + + eina_hash_direct_add(hash, key, data); + return hash; + } + + static inline Eina_Hash *evas_hash_del(Eina_Hash *hash, const char *key, const void *data) + { + if (!hash) return NULL; + eina_hash_del(hash, key, data); + + if (eina_hash_population(hash) == 0) + { + eina_hash_free(hash); + return NULL; + } + + return hash; + } + static inline int evas_hash_size(const Eina_Hash *hash) + { + if (!hash) return 0; + return 255; + } + + #define evas_hash_find eina_hash_find + #define evas_hash_modify eina_hash_modify + #define evas_hash_free eina_hash_free + #define evas_hash_foreach eina_hash_foreach + #define evas_hash_alloc_error eina_error_get /* * Evas List functions diff --git a/src/lib/data/Makefile.am b/src/lib/data/Makefile.am index cf666a9..b5cb04b 100644 --- a/src/lib/data/Makefile.am +++ b/src/lib/data/Makefile.am @@ -11,7 +11,6 @@ AM_CPPFLAGS = -I. \ noinst_LTLIBRARIES = libevas_data.la libevas_data_la_SOURCES = \ -evas_hash.c \ evas_array_hash.c \ evas_mempool.c diff --git a/src/lib/data/evas_hash.c b/src/lib/data/evas_hash.c deleted file mode 100644 index 8e0f795..0000000 --- a/src/lib/data/evas_hash.c +++ /dev/null @@ -1,474 +0,0 @@ -/* - * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include - -#include "Evas_Data.h" - -typedef struct _Evas_Hash_El Evas_Hash_El; - -struct _Evas_Hash_El -{ - EINA_INLIST; - const char *key; - void *data; -}; - -static inline int _evas_hash_gen(const char *key); - -static int _evas_hash_alloc_error = 0; - -static inline int -_evas_hash_gen(const char *key) -{ - unsigned int hash_num = 5381; - const unsigned char *ptr; - - if (!key) return 0; - for (ptr = (unsigned char *)key; *ptr; ptr++) - hash_num = (hash_num * 33) ^ *ptr; - - hash_num &= 0xff; - return (int)hash_num; -} - -/** - * @defgroup Evas_Hash_Data Hash Data Functions - * - * Functions that add, access or remove data from hashes. - * - * The following example shows how to add and then access data in a - * hash table: - * @code - * Evas_Hash *hash = NULL; - * extern void *my_data; - * - * hash = evas_hash_add(hash, "My Data", my_data); - * if (evas_hash_alloc_error()) - * { - * fprintf(stderr, "ERROR: Memory is low. Hash allocation failed.\n"); - * exit(-1); - * } - * if (evas_hash_find(hash, "My Data") == my_data) - * { - * printf("My Data inserted and successfully found.\n"); - * } - * @endcode - * - * What follows is another example, showing how the @ref evas_hash_del - * function is used: - * @code - * extern Evas_Hash *hash; - * extern void *data; - * - * printf("Insert some data...\n"); - * hash = evas_hash_add(hash, "My Data", my_data); - * printf("Removing by key...\n"); - * hash = evas_hash_del(hash, "My Data", NULL); - * printf("Insert some more data as a NULL key...\n"); - * hash = evas_hash_add(hash, NULL, my_data); - * printf("Removing by data as a NULL key...\n"); - * hash = evas_hash_del(hash, NULL, my_data); - * @endcode - */ - -/** - * Adds an entry to the given hash table. - * - * @p key is expected to be a unique string within the hash table. - * Otherwise, you cannot be sure which inserted data pointer will be - * accessed with @ref evas_hash_find , and removed with - * @ref evas_hash_del . - * - * Key strings are case sensitive. - * - * @ref evas_hash_alloc_error should be used to determine if an - * allocation error occurred during this function. - * - * @param hash The given hash table. Can be @c NULL, in which case a - * new hash table is allocated and returned. - * @param key A unique string. Can be @c NULL. - * @param data Data to associate with the string given by @p key. - * @return Either the given hash table, or if the given value for @p - * hash is @c NULL, then a new one. @c NULL will be returned - * if memory could not be allocated for a new table. - * @ingroup Evas_Hash_Data - */ -EAPI Evas_Hash * -evas_hash_add(Evas_Hash *hash, const char *key, const void *data) -{ - int hash_num; - Evas_Hash_El *el; - - if ((!key) || (!data)) return hash; - _evas_hash_alloc_error = 0; - if (!hash) - { - hash = calloc(1, sizeof(struct _Evas_Hash)); - if (!hash) - { - _evas_hash_alloc_error = 1; - return NULL; - } - } - if (!(el = malloc(sizeof(struct _Evas_Hash_El) + strlen(key) + 1))) - { - if (hash->population <= 0) - { - free(hash); - hash = NULL; - } - _evas_hash_alloc_error = 1; - return hash; - }; - el->key = ((char *)el) + sizeof(struct _Evas_Hash_El); - strcpy((char *) el->key, key); - el->data = (void *)data; - hash_num = _evas_hash_gen(key); - hash->buckets[hash_num] = eina_inlist_prepend(hash->buckets[hash_num], EINA_INLIST_GET(el)); - hash->population++; - return hash; -} - -/** - * Adds an entry to the given hash table and does not duplicate the string key. - * - * @p key is expected to be a unique string within the hash table. - * Otherwise, you cannot be sure which inserted data pointer will be - * accessed with @ref evas_hash_find , and removed with - * @ref evas_hash_del . This call does not make a copy of the key so it must - * be a string constant or stored elsewhere (in the object being added) etc. - * - * Key strings are case sensitive. - * - * @ref evas_hash_alloc_error should be used to determine if an - * allocation error occurred during this function. - * - * @param hash The given hash table. Can be @c NULL, in which case a - * new hash table is allocated and returned. - * @param key A unique string. Can be @c NULL. - * @param data Data to associate with the string given by @p key. - * @return Either the given hash table, or if the given value for @p - * hash is @c NULL, then a new one. @c NULL will be returned - * if memory could not be allocated for a new table. - * @ingroup Evas_Hash_Data - */ -EAPI Evas_Hash * -evas_hash_direct_add(Evas_Hash *hash, const char *key, const void *data) -{ - int hash_num; - Evas_Hash_El *el; - - if ((!key) || (!data)) return hash; - _evas_hash_alloc_error = 0; - if (!hash) - { - hash = calloc(1, sizeof(struct _Evas_Hash)); - if (!hash) - { - _evas_hash_alloc_error = 1; - return NULL; - } - } - if (!(el = malloc(sizeof(struct _Evas_Hash_El)))) - { - if (hash->population <= 0) - { - free(hash); - hash = NULL; - } - _evas_hash_alloc_error = 1; - return hash; - }; - el->key = key; - el->data = (void *)data; - hash_num = _evas_hash_gen(key); - hash->buckets[hash_num] = eina_inlist_prepend(hash->buckets[hash_num], EINA_INLIST_GET(el)); - hash->population++; - return hash; -} - -/** - * Removes the entry identified by @p key or @p data from the given - * hash table. - * - * If @p key is @c NULL, then @p data is used to find a match to - * remove. - * - * @param hash The given hash table. - * @param key The key string. Can be @c NULL. - * @param data The data pointer to remove if @p key is @c NULL. - * Otherwise, not required and can be @c NULL. - * @return The modified hash table. If there are no entries left, the - * hash table will be freed and @c NULL will be returned. - * @ingroup Evas_Hash_Data - */ -EAPI Evas_Hash * -evas_hash_del(Evas_Hash *hash, const char *key, const void *data) -{ - int hash_num; - Evas_Hash_El *el; - - if (!hash) return NULL; - if (!key) - { - int hash_num; - - for (hash_num = 0; hash_num < 256; hash_num++) - { - EINA_INLIST_ITER_NEXT(hash->buckets[hash_num], el) - if (el->data == data) - { - hash->buckets[hash_num] = eina_inlist_remove(hash->buckets[hash_num], EINA_INLIST_GET(el)); - free(el); - hash->population--; - if (hash->population <= 0) - { - free(hash); - hash = NULL; - } - return hash; - } - } - } - else - { - hash_num = _evas_hash_gen(key); - EINA_INLIST_ITER_NEXT(hash->buckets[hash_num], el) - if (!strcmp(el->key, key)) - { - if ((!data) || (el->data == data)) - { - hash->buckets[hash_num] = eina_inlist_remove(hash->buckets[hash_num], EINA_INLIST_GET(el)); - free(el); - hash->population--; - if (hash->population <= 0) - { - free(hash); - hash = NULL; - } - return hash; - } - } - } - return hash; -} - -/** - * Retrieves a specific entry in the given hash table. - * @param hash The given hash table. - * @param key The key string of the entry to find. - * @return The data pointer for the stored entry, or @c NULL if not - * found. - * @ingroup Evas_Hash_Data - */ -EAPI void * -evas_hash_find(const Evas_Hash *hash, const char *key) -{ - int hash_num; - Evas_Hash_El *el; - - _evas_hash_alloc_error = 0; - if ((!hash) || (!key)) return NULL; - hash_num = _evas_hash_gen(key); - EINA_INLIST_ITER_NEXT(hash->buckets[hash_num], el) - if (!strcmp(el->key, key)) - { - ((Evas_Hash *)hash)->buckets[hash_num] = eina_inlist_promote(((Evas_Hash *)hash)->buckets[hash_num], EINA_INLIST_GET(el)); - return el->data; - } - return NULL; -} - -/** - * Modifies the entry pointer at the specified key and returns the old entry - * @param hash The given hash table. - * @param key The key string of the entry to modify. - * @param data The data to replace the old entry, if it exists. - * @return The data pointer for the old stored entry, or @c NULL if not - * found. If an existing entry is not found, nothing is added to the - * hash. - * @ingroup Evas_Hash_Data - */ -EAPI void * -evas_hash_modify(Evas_Hash *hash, const char *key, const void *data) -{ - int hash_num; - Evas_Hash_El *el; - - _evas_hash_alloc_error = 0; - if (!hash) return NULL; - hash_num = _evas_hash_gen(key); - EINA_INLIST_ITER_NEXT(hash->buckets[hash_num], el) - if ((key) && (!strcmp(el->key, key))) - { - void *old_data; - - hash->buckets[hash_num] = eina_inlist_promote(hash->buckets[hash_num], EINA_INLIST_GET(el)); - - old_data = el->data; - el->data = (void *) data; - return old_data; - } - return NULL; -} - -/** - * @defgroup Evas_Hash_General_Group Hash General Functions - * - * Miscellaneous functions that operate on hash objects. - */ - -/** - * Retrieves the number of buckets available in the given hash table. - * @param hash The given hash table. - * @return @c 256 if @p hash is not @c NULL. @c 0 otherwise. - * @ingroup Evas_Hash_General_Group - */ -EAPI int -evas_hash_size(const Evas_Hash *hash) -{ - if (!hash) return 0; - return 256; -} - -/** - * @todo Complete polishing documentation for evas_hash.c. The - * functions' docs may be grouped, but they need some simplification. - */ - -/** - * Free an entire hash table - * @param hash The hash table to be freed - * - * This function frees up all the memory allocated to storing the specified - * hash tale pointed to by @p hash. Any entries in the table that the program - * has no more pointers for elsewhere may now be lost, so this should only be - * called if the program has lready freed any allocated data in the hash table - * or has the pointers for data in teh table stored elswehere as well. - * - * Example: - * @code - * extern Evas_Hash *hash; - * - * evas_hash_free(hash); - * hash = NULL; - * @endcode - * @ingroup Evas_Hash_General_Group - */ -EAPI void -evas_hash_free(Evas_Hash *hash) -{ - int i, size; - - if (!hash) return; - size = evas_hash_size(hash); - for (i = 0; i < size; i++) - { - while (hash->buckets[i]) - { - Evas_Hash_El *el; - - el = (Evas_Hash_El *)hash->buckets[i]; - hash->buckets[i] = eina_inlist_remove(hash->buckets[i], EINA_INLIST_GET(el)); - free(el); - } - } - free(hash); -} - -/** - * Call a function on every member stored in the hash table - * @param hash The hash table whose members will be walked - * @param func The function to call on each parameter - * @param fdata The data pointer to pass to the function being called - * - * This function goes through every entry in the hash table @p hash and calls - * the function @p func on each member. The function should NOT modify the - * hash table contents if it returns 1. IF the hash table contents are - * modified by this function or the function wishes to stop processing it must - * return 0, otherwise return 1 to keep processing. - * - * Example: - * @code - * extern Evas_Hash *hash; - * - * Evas_Bool hash_fn(Evas_Hash *hash, const char *key, void *data, void *fdata) - * { - * printf("Func data: %s, Hash entry: %s / %p\n", fdata, key, data); - * return 1; - * } - * - * int main(int argc, char **argv) - * { - * char *hash_fn_data; - * - * hash_fn_data = strdup("Hello World"); - * evas_hash_foreach(hash, hash_fn, hash_fn_data); - * free(hash_fn_data); - * } - * @endcode - * @ingroup Evas_Hash_General_Group - */ -EAPI void -evas_hash_foreach(const Evas_Hash *hash, Evas_Bool (*func) (const Evas_Hash *hash, const char *key, void *data, void *fdata), const void *fdata) -{ - int i, size; - - if (!hash) return; - size = evas_hash_size(hash); - for (i = 0; i < size; i++) - { - Eina_Inlist *l, *next_l; - - for (l = hash->buckets[i]; l;) - { - Evas_Hash_El *el; - - next_l = l->next; - el = (Evas_Hash_El *)l; - if (!func(hash, el->key, el->data, (void *)fdata)) return; - l = next_l; - } - } -} - -/** - * Return memory allocation failure flag after an function requiring allocation - * @return The state of the allocation flag - * - * This function returns the state of the memory allocation flag. This flag is - * set if memory allocations fail during evas_hash_add() calls. If they do, 1 - * will be returned, otherwise 0 will be returned. The flag will remain in its - * current state until the next call that requires allocation is called, and - * is then reset. - * - * Example: - * @code - * Evas_Hash *hash = NULL; - * extern void *my_data; - * - * hash = evas_hash_add(hash, "My Data", my_data); - * if (evas_hash_alloc_error()) - * { - * fprintf(stderr, "ERROR: Memory is low. Hash allocation failed.\n"); - * exit(-1); - * } - * if (evas_hash_find(hash, "My Data") == my_data) - * { - * printf("My Data inserted and successfully found.\n"); - * } - * @endcode - * @ingroup Evas_Hash_General_Group - */ -EAPI int -evas_hash_alloc_error(void) -{ - return _evas_hash_alloc_error; -} diff --git a/src/lib/engines/common/evas_font_load.c b/src/lib/engines/common/evas_font_load.c index 01ca4af..12b7895 100644 --- a/src/lib/engines/common/evas_font_load.c +++ b/src/lib/engines/common/evas_font_load.c @@ -498,7 +498,7 @@ evas_common_font_int_modify_cache_by(RGBA_Font_Int *fi, int dir) { int sz_hash = 0; - if (fi->glyphs) sz_hash = sizeof(Evas_Hash); + if (fi->glyphs) sz_hash = evas_hash_size(fi->glyphs); evas_hash_foreach(fi->glyphs, font_modify_cache_cb, &dir); font_cache_usage += dir * (sizeof(RGBA_Font) + sz_hash + sizeof(FT_FaceRec) + 16384); /* fudge values */ -- 2.7.4