12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- #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 */
|