56 lines
1.9 KiB
C
56 lines
1.9 KiB
C
#ifndef __PRIORITY_QUEUE_H__
|
|
#define __PRIORITY_QUEUE_H__
|
|
|
|
#include "vector.h"
|
|
|
|
/* Priority queue
|
|
* Priority queues are designed such that its first element is always the greatest of the elements it contains.
|
|
* This context is similar to a heap, where elements can be inserted at any moment, and only the max heap element can be
|
|
* retrieved (the one at the top in the priority queue).
|
|
* Priority queues are implemented as Vectors. Elements are popped from the "back" of Vector, which is known as the top
|
|
* of the priority queue.
|
|
*/
|
|
typedef struct {
|
|
Vector *v;
|
|
|
|
int (*cmp)(void *, void *);
|
|
} PriorityQueue;
|
|
|
|
/* Construct priority queue
|
|
* Constructs a priority_queue container adaptor object.
|
|
*/
|
|
PriorityQueue *__newPriorityQueueSize(size_t elemSize, size_t cap, int (*cmp)(void *, void *));
|
|
|
|
#define NewPriorityQueue(type, cap, cmp) __newPriorityQueueSize(sizeof(type), cap, cmp)
|
|
|
|
/* Return size
|
|
* Returns the number of elements in the priority_queue.
|
|
*/
|
|
size_t Priority_Queue_Size(PriorityQueue *pq);
|
|
|
|
/* Access top element
|
|
* Copy the top element in the priority_queue to ptr.
|
|
* The top element is the element that compares higher in the priority_queue.
|
|
*/
|
|
int Priority_Queue_Top(PriorityQueue *pq, void *ptr);
|
|
|
|
/* Insert element
|
|
* Inserts a new element in the priority_queue.
|
|
*/
|
|
size_t __priority_Queue_PushPtr(PriorityQueue *pq, void *elem);
|
|
|
|
#define Priority_Queue_Push(pq, elem) __priority_Queue_PushPtr(pq, &(typeof(elem)){elem})
|
|
|
|
/* Remove top element
|
|
* Removes the element on top of the priority_queue, effectively reducing its size by one. The element removed is the
|
|
* one with the highest value.
|
|
* The value of this element can be retrieved before being popped by calling Priority_Queue_Top.
|
|
*/
|
|
void Priority_Queue_Pop(PriorityQueue *pq);
|
|
|
|
/* free the priority queue and the underlying data. Does not release its elements if
|
|
* they are pointers */
|
|
void Priority_Queue_Free(PriorityQueue *pq);
|
|
|
|
#endif //__PRIORITY_QUEUE_H__
|