Files
frostbyte/src/prioq.c
T

56 lines
1.2 KiB
C

#include "prioq.h"
static int compareNodes(const RbtNode* a, const RbtNode* b)
{
const PrioQNode* pa = rbtEntry(a, PrioQNode, node);
const PrioQNode* pb = rbtEntry(b, PrioQNode, node);
if (pa->vruntime != pb->vruntime)
return pa->vruntime < pb->vruntime ? -1 : 1;
if (pa->id != pb->id)
return pa->id < pb->id ? -1 : 1;
return 0;
}
void prioqInit(PrioQueue* q)
{
rbtInit(&q->tree);
}
void prioqInsert(PrioQueue* q, PrioQNode* n, uint64 vruntime, uint32 id)
{
n->vruntime = vruntime;
n->id = id;
bool inserted = rbtInsert(&q->tree, &n->node, compareNodes);
(void)inserted; /* unique id guarantees the key can never already exist */
}
PrioQNode* prioqPeekMin(const PrioQueue* q)
{
RbtNode* n = rbtFirst(&q->tree);
return n ? rbtEntry(n, PrioQNode, node) : nullptr;
}
PrioQNode* prioqPopMin(PrioQueue* q)
{
PrioQNode* min = prioqPeekMin(q);
if (min)
rbtRemove(&q->tree, &min->node);
return min;
}
void prioqRemove(PrioQueue* q, PrioQNode* n)
{
rbtRemove(&q->tree, &n->node);
}
usize prioqCount(const PrioQueue* q)
{
return rbtCount(&q->tree);
}
bool prioqIsEmpty(const PrioQueue* q)
{
return rbtIsEmpty(&q->tree);
}