basic/prioq: add prioq_peek_item()

This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2019-01-26 11:27:18 +01:00
parent c482724aa5
commit ef21b3b5bf
3 changed files with 26 additions and 5 deletions

View File

@ -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) {

View File

@ -19,8 +19,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_;

View File

@ -69,6 +69,11 @@ static void test_struct(void) {
assert_se(q = prioq_new((compare_func_t) test_compare));
assert_se(s = set_new(&test_hash_ops));
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++) {
assert_se(t = new0(struct test, 1));
t->value = (unsigned) rand();
@ -79,6 +84,17 @@ static void test_struct(void) {
assert_se(set_consume(s, t) >= 0);
}
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);
while ((t = set_steal_first(s))) {
assert_se(prioq_remove(q, t, &t->idx) == 1);
assert_se(prioq_remove(q, t, &t->idx) == 0);