]> pd.if.org Git - nbds/blobdiff - map/skiplist.c
generic map iterator interface
[nbds] / map / skiplist.c
index 62506e146e88aa5a5d58665d7524890fa3357ed5..1f608b47700d2352faaf57acbb094bd70f4e2bb0 100644 (file)
 // 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_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;
+}
+
+uint64_t sl_iter_next (sl_iter_t *iter, void **key_ptr) {
+    assert(iter);
+    node_t *item = iter->next[0];
+    while (item != NULL && IS_TAGGED(item->next[0], TAG1)) {
+        item = (node_t *)STRIP_TAG(item->next[0], TAG1);
+    }
+    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_free (sl_iter_t *iter) {
+    nbd_free(iter);
+}