add iterators to hashtable, skiplist, and list
[nbds] / map / skiplist.c
index 62506e146e88aa5a5d58665d7524890fa3357ed5..16f7538b9d3f3304d885bf1fb944bea6b2129bb9 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_start (skiplist_t *sl, void *key) {
+    node_t *item;
+    find_preds(NULL, &item, 0, sl, key, FALSE);
+    return item;
+}
+
+sl_iter_t *sl_iter_next (sl_iter_t *iter) {
+    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);
+    }
+
+    return next;
+}
+
+uint64_t sl_iter_val (sl_iter_t *iter) {
+    return iter->val;
+}
+
+void *sl_iter_key (sl_iter_t *iter) {
+    return iter->key;
+}