2013-06-07 10:13:50 +08:00
|
|
|
#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);
|
|
|
|
|
2014-07-14 13:51:59 +08:00
|
|
|
struct prio_queue_entry {
|
|
|
|
unsigned ctr;
|
|
|
|
void *data;
|
|
|
|
};
|
|
|
|
|
2013-06-07 10:13:50 +08:00
|
|
|
struct prio_queue {
|
|
|
|
prio_queue_compare_fn compare;
|
2014-07-14 13:51:59 +08:00
|
|
|
unsigned insertion_ctr;
|
2013-06-07 10:13:50 +08:00
|
|
|
void *cb_data;
|
|
|
|
int alloc, nr;
|
2014-07-14 13:51:59 +08:00
|
|
|
struct prio_queue_entry *array;
|
2013-06-07 10:13:50 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Add the "thing" to the queue.
|
|
|
|
*/
|
|
|
|
extern 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.
|
|
|
|
*/
|
|
|
|
extern void *prio_queue_get(struct prio_queue *);
|
|
|
|
|
2018-11-01 21:46:17 +08:00
|
|
|
/*
|
|
|
|
* Gain access to the "thing" that would be returned by
|
|
|
|
* prio_queue_get, but do not remove it from the queue.
|
|
|
|
*/
|
|
|
|
extern void *prio_queue_peek(struct prio_queue *);
|
|
|
|
|
2013-06-07 10:13:50 +08:00
|
|
|
extern void clear_prio_queue(struct prio_queue *);
|
|
|
|
|
2013-06-07 12:58:12 +08:00
|
|
|
/* Reverse the LIFO elements */
|
|
|
|
extern void prio_queue_reverse(struct prio_queue *);
|
|
|
|
|
2013-06-07 10:13:50 +08:00
|
|
|
#endif /* PRIO_QUEUE_H */
|