56 lines
1.2 KiB
C
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);
|
|
}
|