예제 #1
0
int
main(void)
{
        int i;

	int *key = malloc(N * sizeof(int));
	if (key == NULL) {
		exit(-1);
        }

        struct skiplist *list = skiplist_new();
        if (list == NULL) {
                exit(-1);
        }

        printf("Test start!\n");
        printf("Add %d nodes...\n", N);

        /* Insert test */
        srandom(time(NULL));
        for (i = 0; i < N; i++) {
                int value = key[i] = (int)random();
                skiplist_add(list, key[i], value);
        }
#ifdef SKIPLIST_DEBUG
        skiplist_dump(list);
#endif

        /* Search test */
        printf("Now search each node...\n");
        for (i = 0; i < N; i++) {
                int value = skiplist_search(list, key[i]);
                if (value != -1) {
#ifdef SKIPLIST_DEBUG
                        printf("key:0x%08x value:0x%08x\n", key[i], value);
#endif
                } else {
                        printf("Not found:0x%08x\n", key[i]);
                }
        }

        /* Delete test */
        printf("Now remove all nodes...\n");
        for (i = 0; i < N; i++) {
                skiplist_remove(list, key[i]);
        }
#ifdef SKIPLIST_DEBUG
        skiplist_dump(list);
#endif

        printf("End of Test.\n");
        skiplist_delete(list);

        return 0;  
}
예제 #2
0
int map_add(map_t * map, hkey_t *key, hval_t val) {
#ifdef DEBUG
    if(unlikely(map == NULL || key == NULL)) {
        return EINVAL;
    }
#endif

    unsigned idx = hash(key);
    map->cache[idx].key.idx = key->idx;
    map->cache[idx].key.len = key->len;

    hval_t oldval;

    int err = skiplist_lookup_le(map->skiplist, key->idx, (val_t *)&oldval);
    if(unlikely(err && err != ENOKEY)) {
        return err;
    }

    if(!err && right_cmp(oldval, val) > -1) {
        map->cache[idx].val = oldval;
        map->cache[idx].valid = true;
        val->is_indexed = false;
        return EKEYREJECTED;
    }

    while(true) {
        err = skiplist_lookup_ge(map->skiplist, key->idx, (val_t *)&oldval);
        if(unlikely(err && err != ENOKEY)) {
            return err;
        }

        if(err == ENOKEY) {
            break;
        }

        if( right_cmp(oldval, val) < 1 ) {
            if(unlikely((err = skiplist_del(map->skiplist, oldval->key.idx)))) {
                return err;
            }
            oldval->is_indexed = false;
            map->cache[hash(&oldval->key)].valid = false;
        }
        else {
            break;
        }
    }

    val->is_indexed = true;
    map->cache[idx].val = val;
    map->cache[idx].valid = true;

    return skiplist_add(map->skiplist, key->idx, val);
}
예제 #3
0
/* Measure insertions. */
static void ins(void) {
    skiplist *sl = skiplist_new(intptr_cmp, NULL, NULL);

    TIME(pre);
    for (intptr_t i=0; i < lim; i++) {
        skiplist_add(sl, (void *) i, (void *) i);
    }
    TIME(post);

    TDIFF();
    skiplist_free(sl, NULL, NULL);
}
예제 #4
0
/* Measure getting _nonexistent_ values (lookup failure). */
static void get_nonexistent(void) {
    skiplist *sl = skiplist_new(intptr_cmp, NULL, NULL);

    for (intptr_t i=0; i < lim; i++) {
        skiplist_add(sl, (void *) i, (void *) i);
    }

    TIME(pre);
    for (intptr_t i=0; i < lim; i++) {
        intptr_t k = (i * largeish_prime) + lim;
        intptr_t v = 0;
        skiplist_get(sl, (void *) k, (void **)&v);
        assert(v == 0);
        if (0) { printf("%lu %lu\n", k, v); }
    }
    TIME(post);

    TDIFF();
    skiplist_free(sl, NULL, NULL);
}