diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2019-01-26 11:27:18 +0100 |
---|---|---|
committer | Lukáš Nykrýn <lnykryn@redhat.com> | 2019-02-07 12:57:43 +0100 |
commit | ee14a2bd3d95b5d15e4d72ee2582b366e5009a86 (patch) | |
tree | 88c82f05ed7c1c253f0103774a5eea3c42e1db65 /src | |
parent | 60b831ef50e435b66ddd99e635a5112e121c7cb3 (diff) | |
download | systemd-ee14a2bd3d95b5d15e4d72ee2582b366e5009a86.tar.gz |
basic/prioq: add prioq_peek_item()
(cherry-picked from commit ef21b3b5bf824e652addf850bcfd9374c7b33ce8)
Related: #1664976
Diffstat (limited to 'src')
-rw-r--r-- | src/basic/prioq.c | 7 | ||||
-rw-r--r-- | src/basic/prioq.h | 8 | ||||
-rw-r--r-- | src/test/test-prioq.c | 23 |
3 files changed, 27 insertions, 11 deletions
diff --git a/src/basic/prioq.c b/src/basic/prioq.c index ef28a086d1..0bf58c1f16 100644 --- a/src/basic/prioq.c +++ b/src/basic/prioq.c @@ -259,15 +259,14 @@ int prioq_reshuffle(Prioq *q, void *data, unsigned *idx) { return 1; } -void *prioq_peek(Prioq *q) { - +void *prioq_peek_by_index(Prioq *q, unsigned idx) { if (!q) return NULL; - if (q->n_items <= 0) + if (idx >= q->n_items) return NULL; - return q->items[0].data; + return q->items[idx].data; } void *prioq_pop(Prioq *q) { diff --git a/src/basic/prioq.h b/src/basic/prioq.h index e036175260..c381523525 100644 --- a/src/basic/prioq.h +++ b/src/basic/prioq.h @@ -18,8 +18,14 @@ int prioq_put(Prioq *q, void *data, unsigned *idx); int prioq_remove(Prioq *q, void *data, unsigned *idx); int prioq_reshuffle(Prioq *q, void *data, unsigned *idx); -void *prioq_peek(Prioq *q) _pure_; +void *prioq_peek_by_index(Prioq *q, unsigned idx) _pure_; +static inline void *prioq_peek(Prioq *q) { + return prioq_peek_by_index(q, 0); +} void *prioq_pop(Prioq *q); +#define PRIOQ_FOREACH_ITEM(q, p) \ + for (unsigned _i = 0; (p = prioq_peek_by_index(q, _i)); _i++) + unsigned prioq_size(Prioq *q) _pure_; bool prioq_isempty(Prioq *q) _pure_; diff --git a/src/test/test-prioq.c b/src/test/test-prioq.c index 89c41d8ce7..ece13808ed 100644 --- a/src/test/test-prioq.c +++ b/src/test/test-prioq.c @@ -87,6 +87,7 @@ static void test_struct(void) { Set *s; unsigned previous = 0, i; int r; + struct test *t; srand(0); @@ -96,9 +97,12 @@ static void test_struct(void) { s = set_new(&test_hash_ops); assert_se(s); - for (i = 0; i < SET_SIZE; i++) { - struct test *t; + assert_se(prioq_peek(q) == NULL); + assert_se(prioq_peek_by_index(q, 0) == NULL); + assert_se(prioq_peek_by_index(q, 1) == NULL); + assert_se(prioq_peek_by_index(q, (unsigned) -1) == NULL); + for (i = 0; i < SET_SIZE; i++) { t = new0(struct test, 1); assert_se(t); t->value = (unsigned) rand(); @@ -112,9 +116,18 @@ static void test_struct(void) { } } - for (;;) { - struct test *t; + for (i = 0; i < SET_SIZE; i++) + assert_se(prioq_peek_by_index(q, i)); + assert_se(prioq_peek_by_index(q, SET_SIZE) == NULL); + + unsigned count = 0; + PRIOQ_FOREACH_ITEM(q, t) { + assert_se(t); + count++; + } + assert_se(count == SET_SIZE); + for (;;) { t = set_steal_first(s); if (!t) break; @@ -126,8 +139,6 @@ static void test_struct(void) { } for (i = 0; i < SET_SIZE * 3 / 4; i++) { - struct test *t; - assert_se(prioq_size(q) == (SET_SIZE * 3 / 4) - i); t = prioq_pop(q); |