X-Git-Url: https://pd.if.org/git/?p=nbds;a=blobdiff_plain;f=map%2Fskiplist.c;h=16f7538b9d3f3304d885bf1fb944bea6b2129bb9;hp=62506e146e88aa5a5d58665d7524890fa3357ed5;hb=f3a053a46bbb4ba460bcff0920b93dfc8263e02e;hpb=dbcd4739e02b8e774e28b752c412d7e2f242cd47 diff --git a/map/skiplist.c b/map/skiplist.c index 62506e1..16f7538 100644 --- a/map/skiplist.c +++ b/map/skiplist.c @@ -28,12 +28,14 @@ // Setting MAX_LEVEL to 0 essentially makes this data structure the Harris-Michael lock-free list (in list.c). #define MAX_LEVEL 31 -typedef struct node { +typedef struct sl_iter node_t; + +struct sl_iter { void *key; uint64_t val; int top_level; - struct node *next[]; -} node_t; + node_t *next[]; +}; struct sl { node_t *head; @@ -472,3 +474,30 @@ void sl_print (skiplist_t *sl) { } } } + +sl_iter_t *sl_iter_start (skiplist_t *sl, void *key) { + node_t *item; + find_preds(NULL, &item, 0, sl, key, FALSE); + return item; +} + +sl_iter_t *sl_iter_next (sl_iter_t *iter) { + assert(iter); + if (EXPECT_FALSE(!iter)) + return NULL; + + node_t *next = iter->next[0]; + while (next != NULL && IS_TAGGED(next->next[0], TAG1)) { + next = (node_t *)STRIP_TAG(next->next[0], TAG1); + } + + return next; +} + +uint64_t sl_iter_val (sl_iter_t *iter) { + return iter->val; +} + +void *sl_iter_key (sl_iter_t *iter) { + return iter->key; +}