You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.6 KiB
60 lines
1.6 KiB
#ifndef PRIO_QUEUE_H |
|
#define PRIO_QUEUE_H |
|
|
|
/* |
|
* A priority queue implementation, primarily for keeping track of |
|
* commits in the 'date-order' so that we process them from new to old |
|
* as they are discovered, but can be used to hold any pointer to |
|
* struct. The caller is responsible for supplying a function to |
|
* compare two "things". |
|
* |
|
* Alternatively, this data structure can also be used as a LIFO stack |
|
* by specifying NULL as the comparison function. |
|
*/ |
|
|
|
/* |
|
* Compare two "things", one and two; the third parameter is cb_data |
|
* in the prio_queue structure. The result is returned as a sign of |
|
* the return value, being the same as the sign of the result of |
|
* subtracting "two" from "one" (i.e. negative if "one" sorts earlier |
|
* than "two"). |
|
*/ |
|
typedef int (*prio_queue_compare_fn)(const void *one, const void *two, void *cb_data); |
|
|
|
struct prio_queue_entry { |
|
unsigned ctr; |
|
void *data; |
|
}; |
|
|
|
struct prio_queue { |
|
prio_queue_compare_fn compare; |
|
unsigned insertion_ctr; |
|
void *cb_data; |
|
int alloc, nr; |
|
struct prio_queue_entry *array; |
|
}; |
|
|
|
/* |
|
* Add the "thing" to the queue. |
|
*/ |
|
void prio_queue_put(struct prio_queue *, void *thing); |
|
|
|
/* |
|
* Extract the "thing" that compares the smallest out of the queue, |
|
* or NULL. If compare function is NULL, the queue acts as a LIFO |
|
* stack. |
|
*/ |
|
void *prio_queue_get(struct prio_queue *); |
|
|
|
/* |
|
* Gain access to the "thing" that would be returned by |
|
* prio_queue_get, but do not remove it from the queue. |
|
*/ |
|
void *prio_queue_peek(struct prio_queue *); |
|
|
|
void clear_prio_queue(struct prio_queue *); |
|
|
|
/* Reverse the LIFO elements */ |
|
void prio_queue_reverse(struct prio_queue *); |
|
|
|
#endif /* PRIO_QUEUE_H */
|
|
|