Files
quark-kernel/include/priorityqueue.h
2022-08-15 20:20:31 -05:00

93 lines
2.2 KiB
C

#pragma once
/**
* @brief An pair consisting of a priority and a pointer to be stored in
* a priority queue.
*
*/
struct priority_queue_node_t
{
/**
* @brief A pointer to some user-defined object.
*
*/
void *value;
/**
* @brief The priority of the associated object. Only the object with the
* lowest priority is directly accessible from a priority queue.
*
*/
int priority;
};
/**
* @brief A priority queue. Each object in the queue contains a priority and
* a pointer to some user-defined value, and a priority. Operations on the
* queue consist of insertion and deletion of objects, and extraction of the
* object with the lowest priority.
*
*/
struct priority_queue_t
{
/**
* @brief A pointer to the heap described by this structure.
*
*/
struct priority_queue_node_t *heap;
/**
* @brief The current number of elements stored in the heap.
*
*/
int size;
/**
* @brief The maximum number of elements that the heap can currently hold.
*
*/
int capacity;
};
/**
* @brief Initializes the given queue struct.
*
* The queue's underlying heap is allocated
*
* @param queue
* @return int
*/
int construct_priority_queue(struct priority_queue_t *queue, int capacity);
/**
* @brief Extracts the object with the lowest priority off the given queue.
*
* The object is removed from the queue, and a pointer to its userdata is
* returned. If the queue is empty, this function returns NULL and the queue
* is unaffected. If multiple objects with the same priority are stored on the
* queue, this function will extract the object lest-recently inserted.
*
* @param queue
* @return void*
*/
void *priorityqueue_extract_min(struct priority_queue_t *queue);
/**
* @brief Inserts a new object onto the queue.
*
* @param queue
* @param value
* @param priority
* @return int
*/
int priorityqueue_insert(struct priority_queue_t *queue, void *value, int priority);
/**
* @brief Removes the object with a matching value from the queue.
*
* @param queue
* @param value
* @return int
*/
int priorityqueue_remove(struct priority_queue_t *queue, void *value);