X-Git-Url: https://pd.if.org/git/?p=nbds;a=blobdiff_plain;f=map%2Fskiplist.c;h=1f608b47700d2352faaf57acbb094bd70f4e2bb0;hp=16f7538b9d3f3304d885bf1fb944bea6b2129bb9;hb=329b5ab58cde015f4faec1879d3106f635294dd6;hpb=f3a053a46bbb4ba460bcff0920b93dfc8263e02e diff --git a/map/skiplist.c b/map/skiplist.c index 16f7538..1f608b4 100644 --- a/map/skiplist.c +++ b/map/skiplist.c @@ -475,29 +475,29 @@ 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_begin (skiplist_t *sl, void *key) { + node_t *iter = node_alloc(0, 0, 0); + find_preds(NULL, &iter->next[0], 0, sl, key, FALSE); + return iter; } -sl_iter_t *sl_iter_next (sl_iter_t *iter) { +uint64_t sl_iter_next (sl_iter_t *iter, void **key_ptr) { 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); + node_t *item = iter->next[0]; + while (item != NULL && IS_TAGGED(item->next[0], TAG1)) { + item = (node_t *)STRIP_TAG(item->next[0], TAG1); } - - return next; -} - -uint64_t sl_iter_val (sl_iter_t *iter) { - return iter->val; + if (item == NULL) { + iter->next[0] = NULL; + return DOES_NOT_EXIST; + } + iter->next[0] = item->next[0]; + if (key_ptr != NULL) { + *key_ptr = item->key; + } + return item->val; } -void *sl_iter_key (sl_iter_t *iter) { - return iter->key; +void sl_iter_free (sl_iter_t *iter) { + nbd_free(iter); }