Simplify topo-sort logic
.. by not using quite so much indirection. This currently grows the "struct commit" a bit, which could be avoided by using a union for "util" and "indegree" (the topo-sort used to use "util" anyway, so you cannot use them together), but for now the goal of this was to simplify, not optimize. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Junio C Hamano

parent
140dd77a5c
commit
23c17d4a4a
20
commit.h
20
commit.h
@ -14,6 +14,7 @@ struct commit_list {
|
||||
struct commit {
|
||||
struct object object;
|
||||
void *util;
|
||||
unsigned int indegree;
|
||||
unsigned long date;
|
||||
struct commit_list *parents;
|
||||
struct tree *tree;
|
||||
@ -84,31 +85,12 @@ void clear_commit_marks(struct commit *commit, unsigned int mark);
|
||||
/*
|
||||
* Performs an in-place topological sort of list supplied.
|
||||
*
|
||||
* Pre-conditions for sort_in_topological_order:
|
||||
* all commits in input list and all parents of those
|
||||
* commits must have object.util == NULL
|
||||
*
|
||||
* Pre-conditions for sort_in_topological_order_fn:
|
||||
* all commits in input list and all parents of those
|
||||
* commits must have getter(commit) == NULL
|
||||
*
|
||||
* Post-conditions:
|
||||
* invariant of resulting list is:
|
||||
* a reachable from b => ord(b) < ord(a)
|
||||
* in addition, when lifo == 0, commits on parallel tracks are
|
||||
* sorted in the dates order.
|
||||
*/
|
||||
|
||||
typedef void (*topo_sort_set_fn_t)(struct commit*, void *data);
|
||||
typedef void* (*topo_sort_get_fn_t)(struct commit*);
|
||||
|
||||
void topo_sort_default_setter(struct commit *c, void *data);
|
||||
void *topo_sort_default_getter(struct commit *c);
|
||||
|
||||
void sort_in_topological_order(struct commit_list ** list, int lifo);
|
||||
void sort_in_topological_order_fn(struct commit_list ** list, int lifo,
|
||||
topo_sort_set_fn_t setter,
|
||||
topo_sort_get_fn_t getter);
|
||||
|
||||
struct commit_graft {
|
||||
unsigned char sha1[20];
|
||||
|
Reference in New Issue
Block a user