]> pd.if.org Git - nbds/blobdiff - map/list.c
generic map iterator interface
[nbds] / map / list.c
index a94d2d00594274b2e2b7b661b697667ab8802d26..f2e9c82c0e65fe85888721bed1145947af79ef73 100644 (file)
 #include "list.h"
 #include "mem.h"
 
-typedef struct node {
+typedef struct ll_iter node_t;
+
+struct ll_iter {
     void *key;
     uint64_t val;
-    struct node *next;
-} node_t;
+    node_t *next;
+};
 
 struct ll {
     node_t *head;
@@ -304,3 +306,30 @@ void ll_print (list_t *ll) {
     }
     printf("\n");
 }
+
+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;
+}
+
+uint64_t ll_iter_next (ll_iter_t *iter, void **key_ptr) {
+    assert(iter);
+    node_t *item = iter->next;
+    while (item != NULL && IS_TAGGED(item->next, TAG1)) {
+        item = (node_t *)STRIP_TAG(item->next, TAG1);
+    }
+    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_free (ll_iter_t *iter) {
+    nbd_free(iter);
+}