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