Line | Count | Source |
1 | | #ifndef OIDSET_H |
2 | | #define OIDSET_H |
3 | | |
4 | | #include "khash.h" |
5 | | |
6 | | /** |
7 | | * This API is similar to oid-array, in that it maintains a set of object ids |
8 | | * in a memory-efficient way. The major differences are: |
9 | | * |
10 | | * 1. It uses a hash, so we can do online duplicate removal, rather than |
11 | | * sort-and-uniq at the end. This can reduce memory footprint if you have |
12 | | * a large list of oids with many duplicates. |
13 | | * |
14 | | * 2. The per-unique-oid memory footprint is slightly higher due to hash |
15 | | * table overhead. |
16 | | */ |
17 | | |
18 | | /** |
19 | | * A single oidset; should be zero-initialized (or use OIDSET_INIT). |
20 | | */ |
21 | | struct oidset { |
22 | | kh_oid_set_t set; |
23 | | }; |
24 | | |
25 | 0 | #define OIDSET_INIT { { 0 } } |
26 | | |
27 | | |
28 | | /** |
29 | | * Initialize the oidset structure `set`. |
30 | | * |
31 | | * If `initial_size` is bigger than 0 then preallocate to allow inserting |
32 | | * the specified number of elements without further allocations. |
33 | | */ |
34 | | void oidset_init(struct oidset *set, size_t initial_size); |
35 | | |
36 | | /** |
37 | | * Returns true iff `set` contains `oid`. |
38 | | */ |
39 | | int oidset_contains(const struct oidset *set, const struct object_id *oid); |
40 | | |
41 | | /** |
42 | | * Returns true iff `a` and `b` contain the exact same OIDs. |
43 | | */ |
44 | | bool oidset_equal(const struct oidset *a, const struct oidset *b); |
45 | | |
46 | | /** |
47 | | * Insert the oid into the set; a copy is made, so "oid" does not need |
48 | | * to persist after this function is called. |
49 | | * |
50 | | * Returns 1 if the oid was already in the set, 0 otherwise. This can be used |
51 | | * to perform an efficient check-and-add. |
52 | | */ |
53 | | int oidset_insert(struct oidset *set, const struct object_id *oid); |
54 | | |
55 | | /** |
56 | | * Insert all the oids that are in set 'src' into set 'dest'; a copy |
57 | | * is made of each oid inserted into set 'dest'. |
58 | | */ |
59 | | void oidset_insert_from_set(struct oidset *dest, struct oidset *src); |
60 | | |
61 | | /** |
62 | | * Remove the oid from the set. |
63 | | * |
64 | | * Returns 1 if the oid was present in the set, 0 otherwise. |
65 | | */ |
66 | | int oidset_remove(struct oidset *set, const struct object_id *oid); |
67 | | |
68 | | /** |
69 | | * Returns the number of oids in the set. |
70 | | */ |
71 | | static inline int oidset_size(const struct oidset *set) |
72 | 0 | { |
73 | 0 | return kh_size(&set->set); |
74 | 0 | } Unexecuted instantiation: config.c:oidset_size Unexecuted instantiation: dir.c:oidset_size Unexecuted instantiation: mailmap.c:oidset_size Unexecuted instantiation: object-file.c:oidset_size Unexecuted instantiation: object-name.c:oidset_size Unexecuted instantiation: object.c:oidset_size Unexecuted instantiation: odb.c:oidset_size Unexecuted instantiation: streaming.c:oidset_size Unexecuted instantiation: pack-write.c:oidset_size Unexecuted instantiation: packfile.c:oidset_size Unexecuted instantiation: path.c:oidset_size Unexecuted instantiation: pretty.c:oidset_size Unexecuted instantiation: promisor-remote.c:oidset_size Unexecuted instantiation: read-cache.c:oidset_size Unexecuted instantiation: reflog-walk.c:oidset_size Unexecuted instantiation: refs.c:oidset_size Unexecuted instantiation: files-backend.c:oidset_size Unexecuted instantiation: reftable-backend.c:oidset_size Unexecuted instantiation: packed-backend.c:oidset_size Unexecuted instantiation: remote.c:oidset_size Unexecuted instantiation: replace-object.c:oidset_size Unexecuted instantiation: repo-settings.c:oidset_size Unexecuted instantiation: repository.c:oidset_size Unexecuted instantiation: revision.c:oidset_size Unexecuted instantiation: run-command.c:oidset_size Unexecuted instantiation: setup.c:oidset_size Unexecuted instantiation: shallow.c:oidset_size Unexecuted instantiation: submodule-config.c:oidset_size Unexecuted instantiation: submodule.c:oidset_size Unexecuted instantiation: tag.c:oidset_size Unexecuted instantiation: tmp-objdir.c:oidset_size Unexecuted instantiation: transport.c:oidset_size Unexecuted instantiation: tree-walk.c:oidset_size Unexecuted instantiation: tree.c:oidset_size Unexecuted instantiation: wt-status.c:oidset_size Unexecuted instantiation: attr.c:oidset_size Unexecuted instantiation: bisect.c:oidset_size Unexecuted instantiation: bloom.c:oidset_size Unexecuted instantiation: bundle-uri.c:oidset_size Unexecuted instantiation: bundle.c:oidset_size Unexecuted instantiation: cache-tree.c:oidset_size Unexecuted instantiation: combine-diff.c:oidset_size Unexecuted instantiation: commit-graph.c:oidset_size Unexecuted instantiation: commit-reach.c:oidset_size Unexecuted instantiation: commit.c:oidset_size Unexecuted instantiation: connected.c:oidset_size Unexecuted instantiation: convert.c:oidset_size Unexecuted instantiation: diff-merges.c:oidset_size Unexecuted instantiation: diff-lib.c:oidset_size Unexecuted instantiation: diff.c:oidset_size Unexecuted instantiation: diffcore-pickaxe.c:oidset_size Unexecuted instantiation: diffcore-rename.c:oidset_size Unexecuted instantiation: fetch-pack.c:oidset_size Unexecuted instantiation: fsck.c:oidset_size Unexecuted instantiation: graph.c:oidset_size Unexecuted instantiation: grep.c:oidset_size Unexecuted instantiation: line-log.c:oidset_size Unexecuted instantiation: list-objects.c:oidset_size Unexecuted instantiation: log-tree.c:oidset_size Unexecuted instantiation: loose.c:oidset_size Unexecuted instantiation: merge-ort.c:oidset_size Unexecuted instantiation: midx.c:oidset_size Unexecuted instantiation: notes-cache.c:oidset_size Unexecuted instantiation: notes.c:oidset_size Unexecuted instantiation: oidset.c:oidset_size Unexecuted instantiation: pack-check.c:oidset_size Unexecuted instantiation: pack-revindex.c:oidset_size Unexecuted instantiation: range-diff.c:oidset_size Unexecuted instantiation: send-pack.c:oidset_size Unexecuted instantiation: sequencer.c:oidset_size Unexecuted instantiation: transport-helper.c:oidset_size Unexecuted instantiation: unpack-trees.c:oidset_size Unexecuted instantiation: xdiff-interface.c:oidset_size Unexecuted instantiation: apply.c:oidset_size Unexecuted instantiation: entry.c:oidset_size Unexecuted instantiation: list-objects-filter.c:oidset_size Unexecuted instantiation: match-trees.c:oidset_size Unexecuted instantiation: rerere.c:oidset_size |
75 | | |
76 | | /** |
77 | | * Remove all entries from the oidset, freeing any resources associated with |
78 | | * it. |
79 | | */ |
80 | | void oidset_clear(struct oidset *set); |
81 | | |
82 | | /** |
83 | | * Add the contents of the file 'path' to an initialized oidset. Each line is |
84 | | * an unabbreviated object name. Comments begin with '#', and trailing comments |
85 | | * are allowed. Leading whitespace and empty or white-space only lines are |
86 | | * ignored. |
87 | | */ |
88 | | void oidset_parse_file(struct oidset *set, const char *path, |
89 | | const struct git_hash_algo *algop); |
90 | | |
91 | | /* |
92 | | * Similar to the above, but with a callback which can (1) return non-zero to |
93 | | * signal displeasure with the object and (2) replace object ID with something |
94 | | * else (meant to be used to "peel"). |
95 | | */ |
96 | | typedef int (*oidset_parse_tweak_fn)(struct object_id *, void *); |
97 | | void oidset_parse_file_carefully(struct oidset *set, const char *path, |
98 | | const struct git_hash_algo *algop, |
99 | | oidset_parse_tweak_fn fn, void *cbdata); |
100 | | |
101 | | struct oidset_iter { |
102 | | const kh_oid_set_t *set; |
103 | | khiter_t iter; |
104 | | }; |
105 | | |
106 | | static inline void oidset_iter_init(const struct oidset *set, |
107 | | struct oidset_iter *iter) |
108 | 0 | { |
109 | 0 | iter->set = &set->set; |
110 | 0 | iter->iter = kh_begin(iter->set); |
111 | 0 | } Unexecuted instantiation: config.c:oidset_iter_init Unexecuted instantiation: dir.c:oidset_iter_init Unexecuted instantiation: mailmap.c:oidset_iter_init Unexecuted instantiation: object-file.c:oidset_iter_init Unexecuted instantiation: object-name.c:oidset_iter_init Unexecuted instantiation: object.c:oidset_iter_init Unexecuted instantiation: odb.c:oidset_iter_init Unexecuted instantiation: streaming.c:oidset_iter_init Unexecuted instantiation: pack-write.c:oidset_iter_init Unexecuted instantiation: packfile.c:oidset_iter_init Unexecuted instantiation: path.c:oidset_iter_init Unexecuted instantiation: pretty.c:oidset_iter_init Unexecuted instantiation: promisor-remote.c:oidset_iter_init Unexecuted instantiation: read-cache.c:oidset_iter_init Unexecuted instantiation: reflog-walk.c:oidset_iter_init Unexecuted instantiation: refs.c:oidset_iter_init Unexecuted instantiation: files-backend.c:oidset_iter_init Unexecuted instantiation: reftable-backend.c:oidset_iter_init Unexecuted instantiation: packed-backend.c:oidset_iter_init Unexecuted instantiation: remote.c:oidset_iter_init Unexecuted instantiation: replace-object.c:oidset_iter_init Unexecuted instantiation: repo-settings.c:oidset_iter_init Unexecuted instantiation: repository.c:oidset_iter_init Unexecuted instantiation: revision.c:oidset_iter_init Unexecuted instantiation: run-command.c:oidset_iter_init Unexecuted instantiation: setup.c:oidset_iter_init Unexecuted instantiation: shallow.c:oidset_iter_init Unexecuted instantiation: submodule-config.c:oidset_iter_init Unexecuted instantiation: submodule.c:oidset_iter_init Unexecuted instantiation: tag.c:oidset_iter_init Unexecuted instantiation: tmp-objdir.c:oidset_iter_init Unexecuted instantiation: transport.c:oidset_iter_init Unexecuted instantiation: tree-walk.c:oidset_iter_init Unexecuted instantiation: tree.c:oidset_iter_init Unexecuted instantiation: wt-status.c:oidset_iter_init Unexecuted instantiation: attr.c:oidset_iter_init Unexecuted instantiation: bisect.c:oidset_iter_init Unexecuted instantiation: bloom.c:oidset_iter_init Unexecuted instantiation: bundle-uri.c:oidset_iter_init Unexecuted instantiation: bundle.c:oidset_iter_init Unexecuted instantiation: cache-tree.c:oidset_iter_init Unexecuted instantiation: combine-diff.c:oidset_iter_init Unexecuted instantiation: commit-graph.c:oidset_iter_init Unexecuted instantiation: commit-reach.c:oidset_iter_init Unexecuted instantiation: commit.c:oidset_iter_init Unexecuted instantiation: connected.c:oidset_iter_init Unexecuted instantiation: convert.c:oidset_iter_init Unexecuted instantiation: diff-merges.c:oidset_iter_init Unexecuted instantiation: diff-lib.c:oidset_iter_init Unexecuted instantiation: diff.c:oidset_iter_init Unexecuted instantiation: diffcore-pickaxe.c:oidset_iter_init Unexecuted instantiation: diffcore-rename.c:oidset_iter_init Unexecuted instantiation: fetch-pack.c:oidset_iter_init Unexecuted instantiation: fsck.c:oidset_iter_init Unexecuted instantiation: graph.c:oidset_iter_init Unexecuted instantiation: grep.c:oidset_iter_init Unexecuted instantiation: line-log.c:oidset_iter_init Unexecuted instantiation: list-objects.c:oidset_iter_init Unexecuted instantiation: log-tree.c:oidset_iter_init Unexecuted instantiation: loose.c:oidset_iter_init Unexecuted instantiation: merge-ort.c:oidset_iter_init Unexecuted instantiation: midx.c:oidset_iter_init Unexecuted instantiation: notes-cache.c:oidset_iter_init Unexecuted instantiation: notes.c:oidset_iter_init Unexecuted instantiation: oidset.c:oidset_iter_init Unexecuted instantiation: pack-check.c:oidset_iter_init Unexecuted instantiation: pack-revindex.c:oidset_iter_init Unexecuted instantiation: range-diff.c:oidset_iter_init Unexecuted instantiation: send-pack.c:oidset_iter_init Unexecuted instantiation: sequencer.c:oidset_iter_init Unexecuted instantiation: transport-helper.c:oidset_iter_init Unexecuted instantiation: unpack-trees.c:oidset_iter_init Unexecuted instantiation: xdiff-interface.c:oidset_iter_init Unexecuted instantiation: apply.c:oidset_iter_init Unexecuted instantiation: entry.c:oidset_iter_init Unexecuted instantiation: list-objects-filter.c:oidset_iter_init Unexecuted instantiation: match-trees.c:oidset_iter_init Unexecuted instantiation: rerere.c:oidset_iter_init |
112 | | |
113 | | static inline struct object_id *oidset_iter_next(struct oidset_iter *iter) |
114 | 0 | { |
115 | 0 | for (; iter->iter != kh_end(iter->set); iter->iter++) { |
116 | 0 | if (kh_exist(iter->set, iter->iter)) |
117 | 0 | return &kh_key(iter->set, iter->iter++); |
118 | 0 | } |
119 | 0 | return NULL; |
120 | 0 | } Unexecuted instantiation: config.c:oidset_iter_next Unexecuted instantiation: dir.c:oidset_iter_next Unexecuted instantiation: mailmap.c:oidset_iter_next Unexecuted instantiation: object-file.c:oidset_iter_next Unexecuted instantiation: object-name.c:oidset_iter_next Unexecuted instantiation: object.c:oidset_iter_next Unexecuted instantiation: odb.c:oidset_iter_next Unexecuted instantiation: streaming.c:oidset_iter_next Unexecuted instantiation: pack-write.c:oidset_iter_next Unexecuted instantiation: packfile.c:oidset_iter_next Unexecuted instantiation: path.c:oidset_iter_next Unexecuted instantiation: pretty.c:oidset_iter_next Unexecuted instantiation: promisor-remote.c:oidset_iter_next Unexecuted instantiation: read-cache.c:oidset_iter_next Unexecuted instantiation: reflog-walk.c:oidset_iter_next Unexecuted instantiation: refs.c:oidset_iter_next Unexecuted instantiation: files-backend.c:oidset_iter_next Unexecuted instantiation: reftable-backend.c:oidset_iter_next Unexecuted instantiation: packed-backend.c:oidset_iter_next Unexecuted instantiation: remote.c:oidset_iter_next Unexecuted instantiation: replace-object.c:oidset_iter_next Unexecuted instantiation: repo-settings.c:oidset_iter_next Unexecuted instantiation: repository.c:oidset_iter_next Unexecuted instantiation: revision.c:oidset_iter_next Unexecuted instantiation: run-command.c:oidset_iter_next Unexecuted instantiation: setup.c:oidset_iter_next Unexecuted instantiation: shallow.c:oidset_iter_next Unexecuted instantiation: submodule-config.c:oidset_iter_next Unexecuted instantiation: submodule.c:oidset_iter_next Unexecuted instantiation: tag.c:oidset_iter_next Unexecuted instantiation: tmp-objdir.c:oidset_iter_next Unexecuted instantiation: transport.c:oidset_iter_next Unexecuted instantiation: tree-walk.c:oidset_iter_next Unexecuted instantiation: tree.c:oidset_iter_next Unexecuted instantiation: wt-status.c:oidset_iter_next Unexecuted instantiation: attr.c:oidset_iter_next Unexecuted instantiation: bisect.c:oidset_iter_next Unexecuted instantiation: bloom.c:oidset_iter_next Unexecuted instantiation: bundle-uri.c:oidset_iter_next Unexecuted instantiation: bundle.c:oidset_iter_next Unexecuted instantiation: cache-tree.c:oidset_iter_next Unexecuted instantiation: combine-diff.c:oidset_iter_next Unexecuted instantiation: commit-graph.c:oidset_iter_next Unexecuted instantiation: commit-reach.c:oidset_iter_next Unexecuted instantiation: commit.c:oidset_iter_next Unexecuted instantiation: connected.c:oidset_iter_next Unexecuted instantiation: convert.c:oidset_iter_next Unexecuted instantiation: diff-merges.c:oidset_iter_next Unexecuted instantiation: diff-lib.c:oidset_iter_next Unexecuted instantiation: diff.c:oidset_iter_next Unexecuted instantiation: diffcore-pickaxe.c:oidset_iter_next Unexecuted instantiation: diffcore-rename.c:oidset_iter_next Unexecuted instantiation: fetch-pack.c:oidset_iter_next Unexecuted instantiation: fsck.c:oidset_iter_next Unexecuted instantiation: graph.c:oidset_iter_next Unexecuted instantiation: grep.c:oidset_iter_next Unexecuted instantiation: line-log.c:oidset_iter_next Unexecuted instantiation: list-objects.c:oidset_iter_next Unexecuted instantiation: log-tree.c:oidset_iter_next Unexecuted instantiation: loose.c:oidset_iter_next Unexecuted instantiation: merge-ort.c:oidset_iter_next Unexecuted instantiation: midx.c:oidset_iter_next Unexecuted instantiation: notes-cache.c:oidset_iter_next Unexecuted instantiation: notes.c:oidset_iter_next Unexecuted instantiation: oidset.c:oidset_iter_next Unexecuted instantiation: pack-check.c:oidset_iter_next Unexecuted instantiation: pack-revindex.c:oidset_iter_next Unexecuted instantiation: range-diff.c:oidset_iter_next Unexecuted instantiation: send-pack.c:oidset_iter_next Unexecuted instantiation: sequencer.c:oidset_iter_next Unexecuted instantiation: transport-helper.c:oidset_iter_next Unexecuted instantiation: unpack-trees.c:oidset_iter_next Unexecuted instantiation: xdiff-interface.c:oidset_iter_next Unexecuted instantiation: apply.c:oidset_iter_next Unexecuted instantiation: entry.c:oidset_iter_next Unexecuted instantiation: list-objects-filter.c:oidset_iter_next Unexecuted instantiation: match-trees.c:oidset_iter_next Unexecuted instantiation: rerere.c:oidset_iter_next |
121 | | |
122 | | static inline struct object_id *oidset_iter_first(struct oidset *set, |
123 | | struct oidset_iter *iter) |
124 | 0 | { |
125 | 0 | oidset_iter_init(set, iter); |
126 | 0 | return oidset_iter_next(iter); |
127 | 0 | } Unexecuted instantiation: config.c:oidset_iter_first Unexecuted instantiation: dir.c:oidset_iter_first Unexecuted instantiation: mailmap.c:oidset_iter_first Unexecuted instantiation: object-file.c:oidset_iter_first Unexecuted instantiation: object-name.c:oidset_iter_first Unexecuted instantiation: object.c:oidset_iter_first Unexecuted instantiation: odb.c:oidset_iter_first Unexecuted instantiation: streaming.c:oidset_iter_first Unexecuted instantiation: pack-write.c:oidset_iter_first Unexecuted instantiation: packfile.c:oidset_iter_first Unexecuted instantiation: path.c:oidset_iter_first Unexecuted instantiation: pretty.c:oidset_iter_first Unexecuted instantiation: promisor-remote.c:oidset_iter_first Unexecuted instantiation: read-cache.c:oidset_iter_first Unexecuted instantiation: reflog-walk.c:oidset_iter_first Unexecuted instantiation: refs.c:oidset_iter_first Unexecuted instantiation: files-backend.c:oidset_iter_first Unexecuted instantiation: reftable-backend.c:oidset_iter_first Unexecuted instantiation: packed-backend.c:oidset_iter_first Unexecuted instantiation: remote.c:oidset_iter_first Unexecuted instantiation: replace-object.c:oidset_iter_first Unexecuted instantiation: repo-settings.c:oidset_iter_first Unexecuted instantiation: repository.c:oidset_iter_first Unexecuted instantiation: revision.c:oidset_iter_first Unexecuted instantiation: run-command.c:oidset_iter_first Unexecuted instantiation: setup.c:oidset_iter_first Unexecuted instantiation: shallow.c:oidset_iter_first Unexecuted instantiation: submodule-config.c:oidset_iter_first Unexecuted instantiation: submodule.c:oidset_iter_first Unexecuted instantiation: tag.c:oidset_iter_first Unexecuted instantiation: tmp-objdir.c:oidset_iter_first Unexecuted instantiation: transport.c:oidset_iter_first Unexecuted instantiation: tree-walk.c:oidset_iter_first Unexecuted instantiation: tree.c:oidset_iter_first Unexecuted instantiation: wt-status.c:oidset_iter_first Unexecuted instantiation: attr.c:oidset_iter_first Unexecuted instantiation: bisect.c:oidset_iter_first Unexecuted instantiation: bloom.c:oidset_iter_first Unexecuted instantiation: bundle-uri.c:oidset_iter_first Unexecuted instantiation: bundle.c:oidset_iter_first Unexecuted instantiation: cache-tree.c:oidset_iter_first Unexecuted instantiation: combine-diff.c:oidset_iter_first Unexecuted instantiation: commit-graph.c:oidset_iter_first Unexecuted instantiation: commit-reach.c:oidset_iter_first Unexecuted instantiation: commit.c:oidset_iter_first Unexecuted instantiation: connected.c:oidset_iter_first Unexecuted instantiation: convert.c:oidset_iter_first Unexecuted instantiation: diff-merges.c:oidset_iter_first Unexecuted instantiation: diff-lib.c:oidset_iter_first Unexecuted instantiation: diff.c:oidset_iter_first Unexecuted instantiation: diffcore-pickaxe.c:oidset_iter_first Unexecuted instantiation: diffcore-rename.c:oidset_iter_first Unexecuted instantiation: fetch-pack.c:oidset_iter_first Unexecuted instantiation: fsck.c:oidset_iter_first Unexecuted instantiation: graph.c:oidset_iter_first Unexecuted instantiation: grep.c:oidset_iter_first Unexecuted instantiation: line-log.c:oidset_iter_first Unexecuted instantiation: list-objects.c:oidset_iter_first Unexecuted instantiation: log-tree.c:oidset_iter_first Unexecuted instantiation: loose.c:oidset_iter_first Unexecuted instantiation: merge-ort.c:oidset_iter_first Unexecuted instantiation: midx.c:oidset_iter_first Unexecuted instantiation: notes-cache.c:oidset_iter_first Unexecuted instantiation: notes.c:oidset_iter_first Unexecuted instantiation: oidset.c:oidset_iter_first Unexecuted instantiation: pack-check.c:oidset_iter_first Unexecuted instantiation: pack-revindex.c:oidset_iter_first Unexecuted instantiation: range-diff.c:oidset_iter_first Unexecuted instantiation: send-pack.c:oidset_iter_first Unexecuted instantiation: sequencer.c:oidset_iter_first Unexecuted instantiation: transport-helper.c:oidset_iter_first Unexecuted instantiation: unpack-trees.c:oidset_iter_first Unexecuted instantiation: xdiff-interface.c:oidset_iter_first Unexecuted instantiation: apply.c:oidset_iter_first Unexecuted instantiation: entry.c:oidset_iter_first Unexecuted instantiation: list-objects-filter.c:oidset_iter_first Unexecuted instantiation: match-trees.c:oidset_iter_first Unexecuted instantiation: rerere.c:oidset_iter_first |
128 | | |
129 | | #endif /* OIDSET_H */ |