60 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
	
		
			1.6 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.
 | 
						|
 */
 | 
						|
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 */
 |