glib-aux/prioq: rework asserts in NMPrioq

This commit is contained in:
Thomas Haller 2023-03-10 17:46:34 +01:00
parent f701ff28e8
commit cf1963a379
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728

View file

@ -28,6 +28,32 @@ typedef struct _NMPrioqItem {
/*****************************************************************************/ /*****************************************************************************/
#define _nm_assert_q(q) \
G_STMT_START \
{ \
const NMPrioq *const _q2 = (q); \
\
nm_assert(_q2); \
nm_assert(_q2->_priv.n_items == 0 || _q2->_priv.items); \
nm_assert(_q2->_priv.compare_func); \
} \
G_STMT_END
#define _nm_assert_item(q, item) \
G_STMT_START \
{ \
const NMPrioq *const _q = (q); \
const PrioqItem *const _item = (item); \
\
_nm_assert_q(_q); \
\
nm_assert(_item >= _q->_priv.items); \
nm_assert(_item < &_q->_priv.items[_q->_priv.n_items]); \
} \
G_STMT_END
/*****************************************************************************/
void void
nm_prioq_init(NMPrioq *q, GCompareFunc compare_func) nm_prioq_init(NMPrioq *q, GCompareFunc compare_func)
{ {
@ -72,6 +98,8 @@ nm_prioq_destroy(NMPrioq *q)
if (!q || !q->_priv.compare_func) if (!q || !q->_priv.compare_func)
return; return;
_nm_assert_q(q);
free(q->_priv.items); free(q->_priv.items);
q->_priv.compare_func = NULL; q->_priv.compare_func = NULL;
} }
@ -81,8 +109,7 @@ nm_prioq_destroy(NMPrioq *q)
static int static int
compare(NMPrioq *q, unsigned a, unsigned b) compare(NMPrioq *q, unsigned a, unsigned b)
{ {
nm_assert(q); _nm_assert_q(q);
nm_assert(q->_priv.compare_func);
nm_assert(a != b); nm_assert(a != b);
nm_assert(a < q->_priv.n_items); nm_assert(a < q->_priv.n_items);
nm_assert(b < q->_priv.n_items); nm_assert(b < q->_priv.n_items);
@ -99,10 +126,9 @@ compare(NMPrioq *q, unsigned a, unsigned b)
static void static void
swap(NMPrioq *q, unsigned j, unsigned k) swap(NMPrioq *q, unsigned j, unsigned k)
{ {
nm_assert(q); _nm_assert_q(q);
nm_assert(j < q->_priv.n_items); nm_assert(j < q->_priv.n_items);
nm_assert(k < q->_priv.n_items); nm_assert(k < q->_priv.n_items);
nm_assert(!q->_priv.items[j].idx || *(q->_priv.items[j].idx) == j); nm_assert(!q->_priv.items[j].idx || *(q->_priv.items[j].idx) == j);
nm_assert(!q->_priv.items[k].idx || *(q->_priv.items[k].idx) == k); nm_assert(!q->_priv.items[k].idx || *(q->_priv.items[k].idx) == k);
@ -119,7 +145,7 @@ swap(NMPrioq *q, unsigned j, unsigned k)
static unsigned static unsigned
shuffle_up(NMPrioq *q, unsigned idx) shuffle_up(NMPrioq *q, unsigned idx)
{ {
nm_assert(q); _nm_assert_q(q);
nm_assert(idx < q->_priv.n_items); nm_assert(idx < q->_priv.n_items);
while (idx > 0) { while (idx > 0) {
@ -140,7 +166,7 @@ shuffle_up(NMPrioq *q, unsigned idx)
static unsigned static unsigned
shuffle_down(NMPrioq *q, unsigned idx) shuffle_down(NMPrioq *q, unsigned idx)
{ {
nm_assert(q); _nm_assert_q(q);
for (;;) { for (;;) {
unsigned j; unsigned j;
@ -184,7 +210,8 @@ nm_prioq_put(NMPrioq *q, void *data, unsigned *idx)
{ {
unsigned k; unsigned k;
nm_assert(q); _nm_assert_q(q);
nm_assert(q->_priv.n_items < G_MAXUINT);
if (q->_priv.n_items >= q->_priv.n_allocated) { if (q->_priv.n_items >= q->_priv.n_allocated) {
q->_priv.n_allocated = NM_MAX((q->_priv.n_items + 1u) * 2u, 16u); q->_priv.n_allocated = NM_MAX((q->_priv.n_items + 1u) * 2u, 16u);
@ -209,11 +236,7 @@ remove_item(NMPrioq *q, PrioqItem *i)
PrioqItem *l; PrioqItem *l;
unsigned k; unsigned k;
nm_assert(q); _nm_assert_item(q, i);
nm_assert(i);
nm_assert(q->_priv.n_items > 0);
nm_assert(i >= q->_priv.items);
nm_assert(i < &q->_priv.items[q->_priv.n_items]);
l = &q->_priv.items[q->_priv.n_items - 1u]; l = &q->_priv.items[q->_priv.n_items - 1u];
@ -241,7 +264,7 @@ find_item(NMPrioq *q, void *data, unsigned *idx)
{ {
PrioqItem *i; PrioqItem *i;
nm_assert(q); _nm_assert_q(q);
if (q->_priv.n_items <= 0) if (q->_priv.n_items <= 0)
return NULL; return NULL;
@ -268,7 +291,7 @@ nm_prioq_remove(NMPrioq *q, void *data, unsigned *idx)
{ {
PrioqItem *i; PrioqItem *i;
nm_assert(q); _nm_assert_q(q);
i = find_item(q, data, idx); i = find_item(q, data, idx);
if (!i) if (!i)
@ -283,6 +306,8 @@ reshuffle_item(NMPrioq *q, PrioqItem *i)
{ {
unsigned k; unsigned k;
_nm_assert_item(q, i);
k = i - q->_priv.items; k = i - q->_priv.items;
k = shuffle_down(q, k); k = shuffle_down(q, k);
shuffle_up(q, k); shuffle_up(q, k);
@ -293,7 +318,7 @@ nm_prioq_reshuffle(NMPrioq *q, void *data, unsigned *idx)
{ {
PrioqItem *i; PrioqItem *i;
nm_assert(q); _nm_assert_q(q);
i = find_item(q, data, idx); i = find_item(q, data, idx);
if (!i) if (!i)
@ -308,7 +333,7 @@ nm_prioq_update(NMPrioq *q, void *data, unsigned *idx, bool queued /* or else re
{ {
PrioqItem *i; PrioqItem *i;
nm_assert(q); _nm_assert_q(q);
i = find_item(q, data, idx); i = find_item(q, data, idx);
@ -329,7 +354,7 @@ nm_prioq_update(NMPrioq *q, void *data, unsigned *idx, bool queued /* or else re
void * void *
nm_prioq_peek_by_index(NMPrioq *q, unsigned idx) nm_prioq_peek_by_index(NMPrioq *q, unsigned idx)
{ {
nm_assert(q); _nm_assert_q(q);
if (idx >= q->_priv.n_items) if (idx >= q->_priv.n_items)
return NULL; return NULL;
@ -342,7 +367,7 @@ nm_prioq_pop(NMPrioq *q)
{ {
void *data; void *data;
nm_assert(q); _nm_assert_q(q);
if (q->_priv.n_items <= 0) if (q->_priv.n_items <= 0)
return NULL; return NULL;