prio-queue.hon commit Merge branch 'jk/avoid-unbounded-alloca' into maint (1f5d429)
   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 */
  22typedef int (*prio_queue_compare_fn)(const void *one, const void *two, void *cb_data);
  23
  24struct prio_queue_entry {
  25        unsigned ctr;
  26        void *data;
  27};
  28
  29struct prio_queue {
  30        prio_queue_compare_fn compare;
  31        unsigned insertion_ctr;
  32        void *cb_data;
  33        int alloc, nr;
  34        struct prio_queue_entry *array;
  35};
  36
  37/*
  38 * Add the "thing" to the queue.
  39 */
  40extern 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 */
  47extern void *prio_queue_get(struct prio_queue *);
  48
  49extern void clear_prio_queue(struct prio_queue *);
  50
  51/* Reverse the LIFO elements */
  52extern void prio_queue_reverse(struct prio_queue *);
  53
  54#endif /* PRIO_QUEUE_H */