oidset: add iterator methods to oidset

Add the usual iterator methods to oidset. Add oidset_remove(). Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com> Reviewed-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff Hostetler committed Nov 21, 2017 at 20:58 UTC c3a9ad311793e16f6f5c5dcc3559133700c70288
2 files changed +46
oidset.c
+10
@@ -24,6 +24,16 @@ int oidset_insert(struct oidset *set, const struct object_id *oid)
24 return 0;
25 }
26
27 +int oidset_remove(struct oidset *set, const struct object_id *oid)
28 +{
29 + struct oidmap_entry *entry;
30 +
31 + entry = oidmap_remove(&set->map, oid);
32 + free(entry);
33 +
34 + return (entry != NULL);
35 +}
36 +
37 void oidset_clear(struct oidset *set)
38 {
39 oidmap_free(&set->map, 1);
oidset.h
+36
@@ -24,6 +24,12 @@ struct oidset {
24
25 #define OIDSET_INIT { OIDMAP_INIT }
26
27 +
28 +static inline void oidset_init(struct oidset *set, size_t initial_size)
29 +{
30 + return oidmap_init(&set->map, initial_size);
31 +}
32 +
33 /**
34 * Returns true iff `set` contains `oid`.
35 */
@@ -38,10 +44,40 @@ int oidset_contains(const struct oidset *set, const struct object_id *oid);
44 */
45 int oidset_insert(struct oidset *set, const struct object_id *oid);
46
47 +/**
48 + * Remove the oid from the set.
49 + *
50 + * Returns 1 if the oid was present in the set, 0 otherwise.
51 + */
52 +int oidset_remove(struct oidset *set, const struct object_id *oid);
53 +
54 /**
55 * Remove all entries from the oidset, freeing any resources associated with
56 * it.
57 */
58 void oidset_clear(struct oidset *set);
59
60 +struct oidset_iter {
61 + struct oidmap_iter m_iter;
62 +};
63 +
64 +static inline void oidset_iter_init(struct oidset *set,
65 + struct oidset_iter *iter)
66 +{
67 + oidmap_iter_init(&set->map, &iter->m_iter);
68 +}
69 +
70 +static inline struct object_id *oidset_iter_next(struct oidset_iter *iter)
71 +{
72 + struct oidmap_entry *e = oidmap_iter_next(&iter->m_iter);
73 + return e ? &e->oid : NULL;
74 +}
75 +
76 +static inline struct object_id *oidset_iter_first(struct oidset *set,
77 + struct oidset_iter *iter)
78 +{
79 + oidset_iter_init(set, iter);
80 + return oidset_iter_next(iter);
81 +}
82 +
83 #endif /* OIDSET_H */