Junio C Hamano | b4b594a | 2013-06-06 19:13:50 -0700 | [diff] [blame] | 1 | #ifndef PRIO_QUEUE_H |
| 2 | #define PRIO_QUEUE_H |
| 3 | |
| 4 | /* |
| 5 | * A priority queue implementation, primarily for keeping track of |
| 6 | * commits in the 'date-order' so that we process them from new to old |
| 7 | * as they are discovered, but can be used to hold any pointer to |
| 8 | * struct. The caller is responsible for supplying a function to |
| 9 | * compare two "things". |
| 10 | * |
| 11 | * Alternatively, this data structure can also be used as a LIFO stack |
| 12 | * by specifying NULL as the comparison function. |
| 13 | */ |
| 14 | |
| 15 | /* |
| 16 | * Compare two "things", one and two; the third parameter is cb_data |
| 17 | * in the prio_queue structure. The result is returned as a sign of |
| 18 | * the return value, being the same as the sign of the result of |
| 19 | * subtracting "two" from "one" (i.e. negative if "one" sorts earlier |
| 20 | * than "two"). |
| 21 | */ |
| 22 | typedef int (*prio_queue_compare_fn)(const void *one, const void *two, void *cb_data); |
| 23 | |
Jeff King | e8f91e3 | 2014-07-14 01:51:59 -0400 | [diff] [blame] | 24 | struct prio_queue_entry { |
| 25 | unsigned ctr; |
| 26 | void *data; |
| 27 | }; |
| 28 | |
Junio C Hamano | b4b594a | 2013-06-06 19:13:50 -0700 | [diff] [blame] | 29 | struct prio_queue { |
| 30 | prio_queue_compare_fn compare; |
Jeff King | e8f91e3 | 2014-07-14 01:51:59 -0400 | [diff] [blame] | 31 | unsigned insertion_ctr; |
Junio C Hamano | b4b594a | 2013-06-06 19:13:50 -0700 | [diff] [blame] | 32 | void *cb_data; |
| 33 | int alloc, nr; |
Jeff King | e8f91e3 | 2014-07-14 01:51:59 -0400 | [diff] [blame] | 34 | struct prio_queue_entry *array; |
Junio C Hamano | b4b594a | 2013-06-06 19:13:50 -0700 | [diff] [blame] | 35 | }; |
| 36 | |
| 37 | /* |
| 38 | * Add the "thing" to the queue. |
| 39 | */ |
| 40 | extern void prio_queue_put(struct prio_queue *, void *thing); |
| 41 | |
| 42 | /* |
| 43 | * Extract the "thing" that compares the smallest out of the queue, |
| 44 | * or NULL. If compare function is NULL, the queue acts as a LIFO |
| 45 | * stack. |
| 46 | */ |
| 47 | extern void *prio_queue_get(struct prio_queue *); |
| 48 | |
| 49 | extern void clear_prio_queue(struct prio_queue *); |
| 50 | |
Junio C Hamano | da24b10 | 2013-06-06 21:58:12 -0700 | [diff] [blame] | 51 | /* Reverse the LIFO elements */ |
| 52 | extern void prio_queue_reverse(struct prio_queue *); |
| 53 | |
Junio C Hamano | b4b594a | 2013-06-06 19:13:50 -0700 | [diff] [blame] | 54 | #endif /* PRIO_QUEUE_H */ |