mirror of
https://github.com/git/git.git
synced 2024-12-05 07:53:59 +08:00
b4b594a315
Traditionally we used a singly linked list of commits to hold a set of in-flight commits while traversing history. The most typical use of the list is to add commits that are newly discovered to it, keep the list sorted by commit timestamp, pick up the newest one from the list, and keep digging. The cost of keeping the singly linked list sorted is nontrivial, and this typical use pattern better matches a priority queue. Introduce a prio-queue structure, that can be used either as a LIFO stack, or a priority queue. This will be used in the next patch to hold in-flight commits during sort-in-topological-order. Tests and the idea to make it usable for any "void *" pointers to "things" are by Jeff King. Bugs are mine. Signed-off-by: Junio C Hamano <gitster@pobox.com>
40 lines
621 B
C
40 lines
621 B
C
#include "cache.h"
|
|
#include "prio-queue.h"
|
|
|
|
static int intcmp(const void *va, const void *vb, void *data)
|
|
{
|
|
const int *a = va, *b = vb;
|
|
return *a - *b;
|
|
}
|
|
|
|
static void show(int *v)
|
|
{
|
|
if (!v)
|
|
printf("NULL\n");
|
|
else
|
|
printf("%d\n", *v);
|
|
free(v);
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
struct prio_queue pq = { intcmp };
|
|
|
|
while (*++argv) {
|
|
if (!strcmp(*argv, "get"))
|
|
show(prio_queue_get(&pq));
|
|
else if (!strcmp(*argv, "dump")) {
|
|
int *v;
|
|
while ((v = prio_queue_get(&pq)))
|
|
show(v);
|
|
}
|
|
else {
|
|
int *v = malloc(sizeof(*v));
|
|
*v = atoi(*argv);
|
|
prio_queue_put(&pq, v);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|