mirror of
https://github.com/git/git
synced 2024-08-24 18:26:02 +00:00
![Jeff King](/assets/img/avatar_default.png)
Using the more restrictive oideq() should, in the long run, give the compiler more opportunities to optimize these callsites. For now, this conversion should be a complete noop with respect to the generated code. The result is also perhaps a little more readable, as it avoids the "zero is equal" idiom. Since it's so prevalent in C, I think seasoned programmers tend not to even notice it anymore, but it can sometimes make for awkward double negations (e.g., we can drop a few !!oidcmp() instances here). This patch was generated almost entirely by the included coccinelle patch. This mechanical conversion should be completely safe, because we check explicitly for cases where oidcmp() is compared to 0, which is what oideq() is doing under the hood. Note that we don't have to catch "!oidcmp()" separately; coccinelle's standard isomorphisms make sure the two are treated equivalently. I say "almost" because I did hand-edit the coccinelle output to fix up a few style violations (it mostly keeps the original formatting, but sometimes unwraps long lines). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
80 lines
1.5 KiB
C
80 lines
1.5 KiB
C
#include "cache.h"
|
|
#include "sha1-array.h"
|
|
#include "sha1-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);
|
|
}
|
|
|
|
static void oid_array_sort(struct oid_array *array)
|
|
{
|
|
QSORT(array->oid, array->nr, void_hashcmp);
|
|
array->sorted = 1;
|
|
}
|
|
|
|
static const unsigned char *sha1_access(size_t index, void *table)
|
|
{
|
|
struct object_id *array = table;
|
|
return array[index].hash;
|
|
}
|
|
|
|
int oid_array_lookup(struct oid_array *array, const struct object_id *oid)
|
|
{
|
|
if (!array->sorted)
|
|
oid_array_sort(array);
|
|
return sha1_pos(oid->hash, array->oid, array->nr, sha1_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)
|
|
{
|
|
int i;
|
|
|
|
/* No oid_array_sort() here! See the api-oid-array.txt docs! */
|
|
|
|
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)
|
|
{
|
|
int i;
|
|
|
|
if (!array->sorted)
|
|
oid_array_sort(array);
|
|
|
|
for (i = 0; i < array->nr; i++) {
|
|
int ret;
|
|
if (i > 0 && oideq(array->oid + i, array->oid + i - 1))
|
|
continue;
|
|
ret = fn(array->oid + i, data);
|
|
if (ret)
|
|
return ret;
|
|
}
|
|
return 0;
|
|
}
|