diff --git a/include/core/containers/queue.h b/include/core/containers/queue.h index d0dcb87b..766b4bf4 100644 --- a/include/core/containers/queue.h +++ b/include/core/containers/queue.h @@ -16,6 +16,20 @@ struct _q_iter { }; +/* Called to initialize a queue iterator. */ +static inline void _q_iter_init(const struct _queue *queue, struct _q_iter *it) +{ + it->it_iter = g_list_first(queue->_queue.head); + it->it_pos = 0; +} + +/* Called to advance a queue iterator by one step. */ +static inline void _q_iter_next(struct _q_iter *it) +{ + it->it_iter = g_list_next(it->it_iter); + it->it_pos++; +} + /* Called to set a queue iterator to a specific position. */ static inline void _q_iter_set(struct _queue *queue, struct _q_iter *it, unsigned int pos) @@ -30,6 +44,9 @@ static inline gpointer _q_iter_val(struct _q_iter *it) return (it->it_iter) ? it->it_iter->data : NULL; } +#define _q_for_each(queue, it) \ + for (_q_iter_init(queue, it); (it)->it_iter; _q_iter_next(it)) + #define _Q_INIT() \ { \ @@ -62,5 +79,4 @@ static inline guint _q_add_tail(struct _queue *queue, gpointer data) return _q_size(queue) - 1; } - #endif /* OCARINA_CORE_CONTAINERS_QUEUE_H */ diff --git a/tests/core/containers/queue.c b/tests/core/containers/queue.c index 4cc38e4e..72aa00b0 100644 --- a/tests/core/containers/queue.c +++ b/tests/core/containers/queue.c @@ -57,6 +57,19 @@ static void test_stress(unsigned int N) test_loop_equal(test_q_iter_val(&it), N - 1, i); } } test_loop_passed(); + + /* _q_for_each() */ + i = 0; + _q_for_each(&queue, &it) { + test_loop_not_equal((void *)it.it_iter, NULL, i); + test_loop_equal(it.it_pos, i, i); + if (i < N) { + test_loop_equal(test_q_iter_val(&it), N - (i + 1), i); + } else { + test_loop_equal(test_q_iter_val(&it), i - N, i); + } + i++; + } test_loop_passed(); } static void test_basics() { test_stress(10); }