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; }
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); }
/* 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); }
/* 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); }