enum update_type genhash_fun_update(genhash_t* h, const void* k, size_t klen, void *(*upd)(const void *, const void *, size_t *, void *), void (*fr)(void*), void *arg, const void *def, size_t deflen) { struct genhash_entry_t *p; enum update_type rv=0; size_t newSize = 0; (void)deflen; p=genhash_find_entry(h, k, klen); if(p) { void *newValue=upd(k, p->value, &newSize, arg); free_value(h, p->value); p->value=dup_value(h, newValue, newSize); fr(newValue); rv=MODIFICATION; } else { void *newValue=upd(k, def, &newSize, arg); genhash_store(h, k, klen, newValue, newSize); fr(newValue); rv=NEW; } return rv; }
enum update_type genhash_fun_update(genhash_t* h, const void* k, void *(*upd)(const void *, const void *), void (*fr)(void*), const void *def) { struct genhash_entry_t *p; enum update_type rv=0; p=genhash_find_entry(h, k); if(p) { void *newValue=upd(k, p->value); void *k2=h->ops.dupKey(k); h->ops.freeKey(p->key); p->key=k2; void *v2=h->ops.dupValue(newValue); h->ops.freeValue(p->value); p->value=v2; fr(newValue); rv=MODIFICATION; } else { void *newValue=upd(k, def); genhash_store(h, k, newValue); fr(newValue); rv=NEW; } return rv; }
enum update_type genhash_update(genhash_t* h, const void* k, const void* v) { struct genhash_entry_t *p; enum update_type rv=0; p=genhash_find_entry(h, k); if(p) { void *k2=h->ops.dupKey(k); h->ops.freeKey(p->key); p->key=k2; void *v2=h->ops.dupValue(v); h->ops.freeValue(p->value); p->value=v2; rv=MODIFICATION; } else { genhash_store(h, k, v); rv=NEW; } return rv; }
static genhash_t* get_test_hash() { genhash_t* h=NULL; int i=0; h=genhash_init(26, get_string_hash_ops()); for(i=0; i<26; i++) { genhash_store(h, kvs[i], kvs[i]); assert_hash_val(kvs[i], h, kvs[i]); } return h; }
enum update_type genhash_update(genhash_t* h, const void* k, size_t klen, const void* v, size_t vlen) { struct genhash_entry_t *p; enum update_type rv=0; p=genhash_find_entry(h, k, klen); if(p) { free_value(h, p->value); p->value=dup_value(h, v, vlen); rv=MODIFICATION; } else { genhash_store(h, k, klen, v, vlen); rv=NEW; } return rv; }
static void test_multiple_keys() { genhash_t* h=genhash_init(1, get_string_hash_ops()); int deleted = 0, i = 0; /* Pollute the space to allow some hash collisions */ for(i=0; i<16000; i++) { char key[8]; snprintf(key, sizeof(key), "k%d", i); genhash_store(h, key, key); assert_hash_val(key, h, key); } assert_hash_val(NULL, h, "x"); genhash_store(h, "x", "a"); genhash_store(h, "x", "b"); assert_hash_val("b", h, "x"); deleted=genhash_delete(h, "x"); assert(deleted == 1); assert_hash_val("a", h, "x"); deleted=genhash_delete(h, "x"); assert(deleted == 1); assert_hash_val(NULL, h, "x"); deleted=genhash_delete(h, "x"); assert(deleted == 0); genhash_store(h, "x", "a"); genhash_store(h, "x", "b"); genhash_store(h, "y", "yz"); assert(genhash_size(h) == 16003); assert(genhash_size_for_key(h, "x") == 2); deleted=genhash_delete_all(h, "x"); assert(deleted == 2); genhash_free(h); }