util,test: introduce cleanup function prioq_freep()
This also simplifies test-prioq.c.
This commit is contained in:
parent
bbddd2b8d9
commit
d13b5f5a85
|
@ -12,6 +12,7 @@ typedef struct Prioq Prioq;
|
||||||
|
|
||||||
Prioq *prioq_new(compare_func_t compare);
|
Prioq *prioq_new(compare_func_t compare);
|
||||||
Prioq *prioq_free(Prioq *q);
|
Prioq *prioq_free(Prioq *q);
|
||||||
|
DEFINE_TRIVIAL_CLEANUP_FUNC(Prioq*, prioq_free);
|
||||||
int prioq_ensure_allocated(Prioq **q, compare_func_t compare_func);
|
int prioq_ensure_allocated(Prioq **q, compare_func_t compare_func);
|
||||||
|
|
||||||
int prioq_put(Prioq *q, void *data, unsigned *idx);
|
int prioq_put(Prioq *q, void *data, unsigned *idx);
|
||||||
|
|
|
@ -15,17 +15,14 @@ static int unsigned_compare(const unsigned *a, const unsigned *b) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_unsigned(void) {
|
static void test_unsigned(void) {
|
||||||
unsigned buffer[SET_SIZE], i;
|
_cleanup_(prioq_freep) Prioq *q = NULL;
|
||||||
Prioq *q;
|
unsigned buffer[SET_SIZE], i, u;
|
||||||
|
|
||||||
srand(0);
|
srand(0);
|
||||||
|
|
||||||
q = prioq_new(trivial_compare_func);
|
assert_se(q = prioq_new(trivial_compare_func));
|
||||||
assert_se(q);
|
|
||||||
|
|
||||||
for (i = 0; i < ELEMENTSOF(buffer); i++) {
|
for (i = 0; i < ELEMENTSOF(buffer); i++) {
|
||||||
unsigned u;
|
|
||||||
|
|
||||||
u = (unsigned) rand();
|
u = (unsigned) rand();
|
||||||
buffer[i] = u;
|
buffer[i] = u;
|
||||||
assert_se(prioq_put(q, UINT_TO_PTR(u), NULL) >= 0);
|
assert_se(prioq_put(q, UINT_TO_PTR(u), NULL) >= 0);
|
||||||
|
@ -34,8 +31,6 @@ static void test_unsigned(void) {
|
||||||
typesafe_qsort(buffer, ELEMENTSOF(buffer), unsigned_compare);
|
typesafe_qsort(buffer, ELEMENTSOF(buffer), unsigned_compare);
|
||||||
|
|
||||||
for (i = 0; i < ELEMENTSOF(buffer); i++) {
|
for (i = 0; i < ELEMENTSOF(buffer); i++) {
|
||||||
unsigned u;
|
|
||||||
|
|
||||||
assert_se(prioq_size(q) == ELEMENTSOF(buffer) - i);
|
assert_se(prioq_size(q) == ELEMENTSOF(buffer) - i);
|
||||||
|
|
||||||
u = PTR_TO_UINT(prioq_pop(q));
|
u = PTR_TO_UINT(prioq_pop(q));
|
||||||
|
@ -43,7 +38,6 @@ static void test_unsigned(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
assert_se(prioq_isempty(q));
|
assert_se(prioq_isempty(q));
|
||||||
prioq_free(q);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct test {
|
struct test {
|
||||||
|
@ -69,66 +63,45 @@ static const struct hash_ops test_hash_ops = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static void test_struct(void) {
|
static void test_struct(void) {
|
||||||
Prioq *q;
|
_cleanup_(prioq_freep) Prioq *q = NULL;
|
||||||
Set *s;
|
_cleanup_(set_freep) Set *s = NULL;
|
||||||
unsigned previous = 0, i;
|
unsigned previous = 0, i;
|
||||||
int r;
|
struct test *t;
|
||||||
|
|
||||||
srand(0);
|
srand(0);
|
||||||
|
|
||||||
q = prioq_new(test_compare);
|
assert_se(q = prioq_new(test_compare));
|
||||||
assert_se(q);
|
assert_se(s = set_new(&test_hash_ops));
|
||||||
|
|
||||||
s = set_new(&test_hash_ops);
|
|
||||||
assert_se(s);
|
|
||||||
|
|
||||||
for (i = 0; i < SET_SIZE; i++) {
|
for (i = 0; i < SET_SIZE; i++) {
|
||||||
struct test *t;
|
assert_se(t = new0(struct test, 1));
|
||||||
|
|
||||||
t = new0(struct test, 1);
|
|
||||||
assert_se(t);
|
|
||||||
t->value = (unsigned) rand();
|
t->value = (unsigned) rand();
|
||||||
|
|
||||||
r = prioq_put(q, t, &t->idx);
|
assert_se(prioq_put(q, t, &t->idx) >= 0);
|
||||||
assert_se(r >= 0);
|
|
||||||
|
|
||||||
if (i % 4 == 0) {
|
if (i % 4 == 0)
|
||||||
r = set_consume(s, t);
|
assert_se(set_consume(s, t) >= 0);
|
||||||
assert_se(r >= 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (;;) {
|
while ((t = set_steal_first(s))) {
|
||||||
struct test *t;
|
assert_se(prioq_remove(q, t, &t->idx) == 1);
|
||||||
|
assert_se(prioq_remove(q, t, &t->idx) == 0);
|
||||||
t = set_steal_first(s);
|
|
||||||
if (!t)
|
|
||||||
break;
|
|
||||||
|
|
||||||
r = prioq_remove(q, t, &t->idx);
|
|
||||||
assert_se(r > 0);
|
|
||||||
|
|
||||||
free(t);
|
free(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < SET_SIZE * 3 / 4; i++) {
|
for (i = 0; i < SET_SIZE * 3 / 4; i++) {
|
||||||
struct test *t;
|
|
||||||
|
|
||||||
assert_se(prioq_size(q) == (SET_SIZE * 3 / 4) - i);
|
assert_se(prioq_size(q) == (SET_SIZE * 3 / 4) - i);
|
||||||
|
|
||||||
t = prioq_pop(q);
|
assert_se(t = prioq_pop(q));
|
||||||
assert_se(t);
|
|
||||||
|
|
||||||
assert_se(previous <= t->value);
|
assert_se(previous <= t->value);
|
||||||
|
|
||||||
previous = t->value;
|
previous = t->value;
|
||||||
free(t);
|
free(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert_se(prioq_isempty(q));
|
assert_se(prioq_isempty(q));
|
||||||
prioq_free(q);
|
|
||||||
|
|
||||||
assert_se(set_isempty(s));
|
assert_se(set_isempty(s));
|
||||||
set_free(s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
|
|
Loading…
Reference in a new issue