diff options
Diffstat (limited to 'utils')
-rw-r--r-- | utils/ring.h | 28 |
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 |