static int hashtable_do_rehash(hashtable_t *hashtable) { list_t *list, *next; pair_t *pair; size_t i, index, new_size; jsonp_free(hashtable->buckets); hashtable->num_buckets++; new_size = num_buckets(hashtable); hashtable->buckets = jsonp_malloc(new_size * sizeof(bucket_t)); if(!hashtable->buckets) return -1; for(i = 0; i < num_buckets(hashtable); i++) { hashtable->buckets[i].first = hashtable->buckets[i].last = &hashtable->list; } list = hashtable->list.next; list_init(&hashtable->list); for(; list != &hashtable->list; list = next) { next = list->next; pair = list_to_pair(list); index = pair->hash % new_size; insert_to_bucket(hashtable, &hashtable->buckets[index], &pair->list); } return 0; }
void hashtable_iter_set(void *iter, json_t *value) { pair_t *pair = list_to_pair((list_t *)iter); json_decref(pair->value); pair->value = 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; }
static void hashtable_do_clear(hashtable_t *hashtable) { list_t *list, *next; pair_t *pair; for(list = hashtable->list.next; list != &hashtable->list; list = next) { next = list->next; pair = list_to_pair(list); json_decref(pair->value); jsonp_free(pair); } }
static void hashtable_do_clear(hashtable_t *hashtable) { list_t *list, *next; pair_t *pair; for(list = hashtable->list.next; list != &hashtable->list; list = next) { next = list->next; pair = list_to_pair(list); if(hashtable->free_key) { // hashtable->free_key(pair->key); free(pair->key); } if(hashtable->free_value) hashtable->free_value(pair->value); free(pair); } }
static pair_t *hashtable_find_pair(hashtable_t *hashtable, bucket_t *bucket, const char *key, size_t hash) { list_t *list; pair_t *pair; if(bucket_is_empty(hashtable, bucket)) return NULL; list = bucket->first; while(1) { pair = list_to_pair(list); if(pair->hash == hash && strcmp(pair->key, key) == 0) return pair; if(list == bucket->last) break; list = list->next; } return NULL; }
static pair_t *hashtable_find_pair(hashtable_t *hashtable, bucket_t *bucket, const void *key, unsigned int hash) { list_t *list; pair_t *pair; if(bucket_is_empty(hashtable, bucket)) return NULL; list = bucket->first; while(1) { pair = list_to_pair(list); if(pair->hash == hash && hashtable->cmp_keys(pair->key, key)) return pair; if(list == bucket->last) break; list = list->next; } return NULL; }
void *hashtable_iter_value(void *iter) { pair_t *pair = list_to_pair((list_t *)iter); return pair->value; }
size_t hashtable_iter_serial(void *iter) { pair_t *pair = list_to_pair((list_t *)iter); return pair->serial; }
void *hashtable_iter_key(void *iter) { pair_t *pair = list_to_pair((list_t *)iter); return pair->key; }