1 /*
2  * Copyright (C) the libgit2 contributors. All rights reserved.
3  *
4  * This file is part of libgit2, distributed under the GNU GPL v2 with
5  * a Linking Exception. For full terms see the included COPYING file.
6  */
7 #ifndef INCLUDE_commit_list_h__
8 #define INCLUDE_commit_list_h__
9 
10 #include "common.h"
11 
12 #include "git2/oid.h"
13 
14 #define PARENT1  (1 << 0)
15 #define PARENT2  (1 << 1)
16 #define RESULT   (1 << 2)
17 #define STALE    (1 << 3)
18 #define ALL_FLAGS (PARENT1 | PARENT2 | STALE | RESULT)
19 
20 #define PARENTS_PER_COMMIT	2
21 #define COMMIT_ALLOC \
22 	(sizeof(git_commit_list_node) + PARENTS_PER_COMMIT * sizeof(git_commit_list_node *))
23 
24 #define FLAG_BITS 4
25 
26 typedef struct git_commit_list_node {
27 	git_oid oid;
28 	int64_t time;
29 	unsigned int seen:1,
30 			 uninteresting:1,
31 			 topo_delay:1,
32 			 parsed:1,
33 			 added:1,
34 			 flags : FLAG_BITS;
35 
36 	uint16_t in_degree;
37 	uint16_t out_degree;
38 
39 	struct git_commit_list_node **parents;
40 } git_commit_list_node;
41 
42 typedef struct git_commit_list {
43 	git_commit_list_node *item;
44 	struct git_commit_list *next;
45 } git_commit_list;
46 
47 git_commit_list_node *git_commit_list_alloc_node(git_revwalk *walk);
48 int git_commit_list_time_cmp(const void *a, const void *b);
49 void git_commit_list_free(git_commit_list **list_p);
50 git_commit_list *git_commit_list_insert(git_commit_list_node *item, git_commit_list **list_p);
51 git_commit_list *git_commit_list_insert_by_date(git_commit_list_node *item, git_commit_list **list_p);
52 int git_commit_list_parse(git_revwalk *walk, git_commit_list_node *commit);
53 git_commit_list_node *git_commit_list_pop(git_commit_list **stack);
54 
55 #endif
56