Stefan Beller <[email protected]> writes:
> Helped-by: Junio C Hamano <[email protected]>
> Signed-off-by: Stefan Beller <[email protected]>
> ---
> 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 */