+
+ll_iter_t *ll_iter_begin (list_t *ll, map_key_t key) {
+ ll_iter_t *iter = (ll_iter_t *)nbd_malloc(sizeof(ll_iter_t));
+ find_pred(NULL, &iter->next, ll, key, FALSE);
+ return iter;
+}
+
+map_val_t ll_iter_next (ll_iter_t *iter, map_key_t *key_ptr) {
+ assert(iter);
+ node_t *item = iter->next;
+ while (item != NULL && IS_TAGGED(item->next, TAG1)) {
+ item = (node_t *)(size_t)STRIP_TAG(item->next, TAG1);
+ }
+ if (item == NULL) {
+ iter->next = NULL;
+ return DOES_NOT_EXIST;
+ }
+ iter->next = (node_t *)(size_t)STRIP_TAG(item->next, TAG1);
+ if (key_ptr != NULL) {
+ *key_ptr = item->key;
+ }
+ return item->val;
+}
+
+void ll_iter_free (ll_iter_t *iter) {
+ nbd_free(iter);
+}