X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=src%2Fhashtable.c;h=a31204792da0703d57eefc94f1da0f60dc188b9d;hb=782acfe378b8d6dddb307029ba97688943312340;hp=05dc16794a2eb7ddba7fe3fc1e9f94e76ad07e2c;hpb=2ad4634de51bd06c03d1ba5831247ed865c03506;p=jansson.git diff --git a/src/hashtable.c b/src/hashtable.c index 05dc167..a312047 100644 --- a/src/hashtable.c +++ b/src/hashtable.c @@ -1,10 +1,12 @@ /* - * Copyright (c) 2009 Petri Lehtinen + * Copyright (c) 2009, 2010 Petri Lehtinen * * This library is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. */ +#include + #include #include "hashtable.h" @@ -247,31 +249,39 @@ int hashtable_set(hashtable_t *hashtable, void *key, void *value) bucket_t *bucket; unsigned int hash, index; - hash = hashtable->hash_key(key); - - /* if the key already exists, delete it */ - hashtable_do_del(hashtable, key, hash); - /* rehash if the load ratio exceeds 1 */ if(hashtable->size >= num_buckets(hashtable)) if(hashtable_do_rehash(hashtable)) return -1; - pair = malloc(sizeof(pair_t)); - if(!pair) - return -1; - - pair->key = key; - pair->value = value; - pair->hash = hash; - list_init(&pair->list); - + hash = hashtable->hash_key(key); index = hash % num_buckets(hashtable); bucket = &hashtable->buckets[index]; + pair = hashtable_find_pair(hashtable, bucket, key, hash); - insert_to_bucket(hashtable, bucket, &pair->list); + if(pair) + { + if(hashtable->free_key) + hashtable->free_key(key); + if(hashtable->free_value) + hashtable->free_value(pair->value); + pair->value = value; + } + else + { + pair = malloc(sizeof(pair_t)); + if(!pair) + return -1; + + pair->key = key; + pair->value = value; + pair->hash = hash; + list_init(&pair->list); + + insert_to_bucket(hashtable, bucket, &pair->list); - hashtable->size++; + hashtable->size++; + } return 0; } @@ -318,6 +328,22 @@ void *hashtable_iter(hashtable_t *hashtable) return hashtable_iter_next(hashtable, &hashtable->list); } +void *hashtable_iter_at(hashtable_t *hashtable, const void *key) +{ + pair_t *pair; + unsigned int hash; + bucket_t *bucket; + + hash = hashtable->hash_key(key); + bucket = &hashtable->buckets[hash % num_buckets(hashtable)]; + + pair = hashtable_find_pair(hashtable, bucket, key, hash); + if(!pair) + return NULL; + + return &pair->list; +} + void *hashtable_iter_next(hashtable_t *hashtable, void *iter) { list_t *list = (list_t *)iter; @@ -337,3 +363,13 @@ void *hashtable_iter_value(void *iter) pair_t *pair = list_to_pair((list_t *)iter); return pair->value; } + +void hashtable_iter_set(hashtable_t *hashtable, void *iter, void *value) +{ + pair_t *pair = list_to_pair((list_t *)iter); + + if(hashtable->free_value) + hashtable->free_value(pair->value); + + pair->value = value; +}