#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; }