aca4240f6a
When consuming a priority queue, it can be convenient to inspect the next object that will be dequeued without actually dequeueing it. Our existing library did not have such a 'peek' operation, so add it as prio_queue_peek(). Add a reference-level comparison in t/helper/test-prio-queue.c so this method is exercised by t0009-prio-queue.sh. Further, add a test that checks the behavior when the compare function is NULL (i.e. the queue becomes a stack). Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
61 lines
1.7 KiB
C
61 lines
1.7 KiB
C
#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.
|
|
*/
|
|
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 *);
|
|
|
|
/*
|
|
* 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 *);
|
|
|
|
extern void clear_prio_queue(struct prio_queue *);
|
|
|
|
/* Reverse the LIFO elements */
|
|
extern void prio_queue_reverse(struct prio_queue *);
|
|
|
|
#endif /* PRIO_QUEUE_H */
|