Stefan Beller <sbeller@xxxxxxxxxx> writes: > Helped-by: Junio C Hamano <gitster@xxxxxxxxx> > Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> > --- > Documentation/technical/api-oid-array.txt | 5 +++++ > sha1-array.c | 17 +++++++++++++++++ > sha1-array.h | 3 +++ > 3 files changed, 25 insertions(+) Perfect ;-) > > diff --git a/Documentation/technical/api-oid-array.txt b/Documentation/technical/api-oid-array.txt > index 9febfb1d528..c97428c2c34 100644 > --- a/Documentation/technical/api-oid-array.txt > +++ b/Documentation/technical/api-oid-array.txt > @@ -48,6 +48,11 @@ Functions > is not sorted, this function has the side effect of sorting > it. > > +`oid_array_filter`:: > + Apply the callback function `want` to each entry in the array, > + retaining only the entries for which the function returns true. > + Preserve the order of the entries that are retained. > + > Examples > -------- > > diff --git a/sha1-array.c b/sha1-array.c > index b94e0ec0f5e..d922e94e3fc 100644 > --- a/sha1-array.c > +++ b/sha1-array.c > @@ -77,3 +77,20 @@ int oid_array_for_each_unique(struct oid_array *array, > } > return 0; > } > + > +void oid_array_filter(struct oid_array *array, > + for_each_oid_fn want, > + void *cb_data) > +{ > + unsigned nr = array->nr, src, dst; > + struct object_id *oids = array->oid; > + > + for (src = dst = 0; src < nr; src++) { > + if (want(&oids[src], cb_data)) { > + if (src != dst) > + oidcpy(&oids[dst], &oids[src]); > + dst++; > + } > + } > + array->nr = dst; > +} > diff --git a/sha1-array.h b/sha1-array.h > index 232bf950172..55d016c4bf7 100644 > --- a/sha1-array.h > +++ b/sha1-array.h > @@ -22,5 +22,8 @@ int oid_array_for_each(struct oid_array *array, > int oid_array_for_each_unique(struct oid_array *array, > for_each_oid_fn fn, > void *data); > +void oid_array_filter(struct oid_array *array, > + for_each_oid_fn want, > + void *cbdata); > > #endif /* SHA1_ARRAY_H */