8380dcd700
When we are looking up an oid in an array, we obviously don't need to write to the array. Let's mark it as const in the function interfaces, as well as in the local variables we use to derference the void pointer (note a few cases use pointers-to-pointers, so we mark everything const). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
94 lines
1.8 KiB
C
94 lines
1.8 KiB
C
#include "cache.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;
|
|
}
|