// 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;
}
}
}
+
+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);
+}