X-Git-Url: https://pd.if.org/git/?p=nbds;a=blobdiff_plain;f=map%2Flist.c;h=f2e9c82c0e65fe85888721bed1145947af79ef73;hp=9e66787c2be4ef54c4c9b043b691b203d71d820f;hb=329b5ab58cde015f4faec1879d3106f635294dd6;hpb=f3a053a46bbb4ba460bcff0920b93dfc8263e02e diff --git a/map/list.c b/map/list.c index 9e66787..f2e9c82 100644 --- a/map/list.c +++ b/map/list.c @@ -307,29 +307,29 @@ void ll_print (list_t *ll) { printf("\n"); } -ll_iter_t *ll_iter_start (list_t *ll, void *key) { - node_t *item; - find_pred(NULL, &item, ll, key, FALSE); - return item; +ll_iter_t *ll_iter_begin (list_t *ll, void *key) { + node_t *iter = node_alloc(0,0); + find_pred(NULL, &iter->next, ll, key, FALSE); + return iter; } -ll_iter_t *ll_iter_next (ll_iter_t *iter) { +uint64_t ll_iter_next (ll_iter_t *iter, void **key_ptr) { assert(iter); - if (EXPECT_FALSE(!iter)) - return NULL; - - node_t *next = iter->next; - while (next != NULL && IS_TAGGED(next->next, TAG1)) { - next = (node_t *)STRIP_TAG(next->next, TAG1); + node_t *item = iter->next; + while (item != NULL && IS_TAGGED(item->next, TAG1)) { + item = (node_t *)STRIP_TAG(item->next, TAG1); } - - return next; -} - -uint64_t ll_iter_val (ll_iter_t *iter) { - return iter->val; + if (item == NULL) { + iter->next = NULL; + return DOES_NOT_EXIST; + } + iter->next = item->next; + if (key_ptr != NULL) { + *key_ptr = item->key; + } + return item->val; } -void *ll_iter_key (ll_iter_t *iter) { - return iter->key; +void ll_iter_free (ll_iter_t *iter) { + nbd_free(iter); }