Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
}
Beispiel #6
0
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);
}