summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
Diffstat (limited to 'utils')
-rw-r--r--utils/ring.h28
1 files changed, 28 insertions, 0 deletions
diff --git a/utils/ring.h b/utils/ring.h
index d6258c240..1dfd23603 100644
--- a/utils/ring.h
+++ b/utils/ring.h
@@ -106,4 +106,32 @@
} while (p != ring); \
} else sizevar = 0
+/*
+ * Ring iteration works as follows:
+ *
+ * RING_ITERATE_START(ringtype, ring, iteratorptr) {
+ * code_using(iteratorptr);
+ * } RING_ITERATE_END(ring, iteratorptr);
+ *
+ * If you want to stop iterating (e.g. you found your answer)
+ * RING_ITERATE_STOP(ring, iteratorptr);
+ * You *MUST* abort the iteration if you do something to modify
+ * the ring such as deleting or adding an element.
+ */
+
+#define RING_ITERATE_START(ringtype, ring, iteratorptr) \
+ if (ring != NULL) { \
+ ringtype *iteratorptr = ring; \
+ do { \
+ do { \
+
+#define RING_ITERATE_STOP(ring, iteratorptr) \
+ goto iteration_end_##ring##_##iteratorptr
+
+#define RING_ITERATE_END(ring, iteratorptr) \
+ } while (false); \
+ } while (iteratorptr != ring); \
+ } \
+ iteration_end_##ring##_##iteratorptr:
+
#endif