X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/efcb7beaff700ddcdca284436a934504be4d0b0b..54702ce88779779500025ff0ce2d66d70cbc9f7a:/src/xbt/dict.c diff --git a/src/xbt/dict.c b/src/xbt/dict.c index 2f6101b5ce..227347b76a 100644 --- a/src/xbt/dict.c +++ b/src/xbt/dict.c @@ -127,12 +127,25 @@ void xbt_dict_hashsize_set(xbt_dict_t dict, int hashsize) { /** * Returns the hash code of a string. */ -unsigned int xbt_dict_hash(const char *str) { +static unsigned int xbt_dict_hash_ext(const char *str, int str_len) { /* fast implementation of djb2 algorithm */ unsigned int hash = 5381; int c; - while ((c = *str++)) { + while (str_len--) { + c = *str++; + hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ + } + + return hash; +} + +static unsigned int xbt_dict_hash(const char *str) { + /* fast implementation of djb2 algorithm */ + unsigned int hash = 5381; + int c; + + while ( (c = *str++) ) { hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ } @@ -158,7 +171,7 @@ void xbt_dict_set_ext(xbt_dict_t dict, void_f_pvoid_t *free_ctn) { xbt_assert(dict); - unsigned int hash_code = xbt_dict_hash(key) % dict->table_size; + unsigned int hash_code = xbt_dict_hash_ext(key,key_len) % dict->table_size; xbt_dictelm_t current, previous = NULL; current = dict->table[hash_code]; @@ -226,7 +239,7 @@ void *xbt_dict_get_ext(xbt_dict_t dict, int key_len) { xbt_assert(dict); - unsigned int hash_code = xbt_dict_hash(key) % dict->table_size; + unsigned int hash_code = xbt_dict_hash_ext(key,key_len) % dict->table_size; xbt_dictelm_t current; current = dict->table[hash_code]; @@ -305,7 +318,7 @@ void xbt_dict_remove_ext(xbt_dict_t dict, int key_len) { xbt_assert(dict); - unsigned int hash_code = xbt_dict_hash(key) % dict->table_size; + unsigned int hash_code = xbt_dict_hash_ext(key,key_len) % dict->table_size; xbt_dictelm_t current, previous = NULL; current = dict->table[hash_code]; @@ -355,6 +368,10 @@ void xbt_dict_reset(xbt_dict_t dict) { int i; xbt_dictelm_t current, previous = NULL; + + if (dict->count == 0) + return; + for (i = 0; i < dict->table_size; i++) { current = dict->table[i]; while (current != NULL) { @@ -384,7 +401,7 @@ int xbt_dict_length(xbt_dict_t dict) { void xbt_dict_add_element(xbt_dict_t dict, xbt_dictelm_t element) { xbt_assert(dict); - int hashcode = xbt_dict_hash(element->key) % dict->table_size; + int hashcode = xbt_dict_hash_ext(element->key,element->key_len) % dict->table_size; element->next = dict->table[hashcode]; dict->table[hashcode] = element; } @@ -554,8 +571,20 @@ char *data; XBT_TEST_UNIT("basic",test_dict_basic,"Basic usage: change, retrieve, traverse"){ - xbt_test_add0("Traversal the empty dictionnary"); + xbt_test_add0("Traversal the null dictionnary"); + traverse(head); + + xbt_test_add0("Traversal and search the empty dictionnary"); + head = xbt_dict_new(); traverse(head); + TRY { + debuged_remove(head,"12346"); + } CATCH(e) { + if (e.category != not_found_error) + xbt_test_exception(e); + xbt_ex_free(e); + } + xbt_dict_free(&head); xbt_test_add0("Traverse the full dictionnary"); fill(&head); @@ -731,7 +760,7 @@ XBT_TEST_UNIT("crash",test_dict_crash,"Crash test"){ for (i=0;i<10;i++) { head=xbt_dict_new(); - // if (i%10) printf("."); else printf("%d",i/10); fflush(stdout); + /* if (i%10) printf("."); else printf("%d",i/10); fflush(stdout); */ nb=0; for (j=0;j<1000;j++) { key=xbt_malloc(SIZEOFKEY); @@ -754,7 +783,7 @@ XBT_TEST_UNIT("crash",test_dict_crash,"Crash test"){ head=xbt_dict_new(); xbt_test_add1("Fill %d elements, with keys being the number of element",NB_ELM); for (j=0;j