return true;
 }
+
+/* Returns the next node in 'set' in hash order, or NULL if no nodes remain in
+ * 'set'.  Uses '*bucketp' and '*offsetp' to determine where to begin
+ * iteration, and stores new values to pass on the next iteration into them
+ * before returning.
+ *
+ * It's better to use plain SSET_FOR_EACH and related functions, since they are
+ * faster and better at dealing with ssets that change during iteration.
+ *
+ * Before beginning iteration, store 0 into '*bucketp' and '*offsetp'.
+ */
+struct sset_node *
+sset_at_position(const struct sset *set, uint32_t *bucketp, uint32_t *offsetp)
+{
+    struct hmap_node *hmap_node;
+
+    hmap_node = hmap_at_position(&set->map, bucketp, offsetp);
+    return SSET_NODE_FROM_HMAP_NODE(hmap_node);
+}
 
 struct sset_node *sset_find(const struct sset *, const char *);
 bool sset_contains(const struct sset *, const char *);
 bool sset_equals(const struct sset *, const struct sset *);
+struct sset_node *sset_at_position(const struct sset *,
+                                   uint32_t *bucketp, uint32_t *offsetp);
 
 /* Iteration macros. */
 #define SSET_FOR_EACH(NAME, SSET)               \