git-commit-vandalism/oid-array.c
Elijah Newren 36bf195890 alloc.h: move ALLOC_GROW() functions from cache.h
This allows us to replace includes of cache.h with includes of the much
smaller alloc.h in many places.  It does mean that we also need to add
includes of alloc.h in a number of C files.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2023-02-23 17:25:28 -08:00

95 lines
1.8 KiB
C

#include "git-compat-util.h"
#include "alloc.h"
#include "oid-array.h"
#include "hash-lookup.h"
void oid_array_append(struct oid_array *array, const struct object_id *oid)
{
ALLOC_GROW(array->oid, array->nr + 1, array->alloc);
oidcpy(&array->oid[array->nr++], oid);
array->sorted = 0;
}
static int void_hashcmp(const void *a, const void *b)
{
return oidcmp(a, b);
}
void oid_array_sort(struct oid_array *array)
{
if (array->sorted)
return;
QSORT(array->oid, array->nr, void_hashcmp);
array->sorted = 1;
}
static const struct object_id *oid_access(size_t index, const void *table)
{
const struct object_id *array = table;
return &array[index];
}
int oid_array_lookup(struct oid_array *array, const struct object_id *oid)
{
oid_array_sort(array);
return oid_pos(oid, array->oid, array->nr, oid_access);
}
void oid_array_clear(struct oid_array *array)
{
FREE_AND_NULL(array->oid);
array->nr = 0;
array->alloc = 0;
array->sorted = 0;
}
int oid_array_for_each(struct oid_array *array,
for_each_oid_fn fn,
void *data)
{
size_t i;
/* No oid_array_sort() here! See oid-array.h */
for (i = 0; i < array->nr; i++) {
int ret = fn(array->oid + i, data);
if (ret)
return ret;
}
return 0;
}
int oid_array_for_each_unique(struct oid_array *array,
for_each_oid_fn fn,
void *data)
{
size_t i;
oid_array_sort(array);
for (i = 0; i < array->nr; i = oid_array_next_unique(array, i)) {
int ret = fn(array->oid + i, data);
if (ret)
return ret;
}
return 0;
}
void oid_array_filter(struct oid_array *array,
for_each_oid_fn want,
void *cb_data)
{
size_t 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;
}