ref-filter: factor ref_array pushing into its own function
In preparation for callers constructing their own ref_array structs, let's move our own internal push operation into its own function. While we're at it, we can replace REALLOC_ARRAY() with ALLOC_GROW(), which should give the growth operation amortized linear complexity (as opposed to growing by one, which is potentially quadratic, though in-place realloc growth often makes this faster in practice). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
0ffaa00f45
commit
427cbc9dbf
16
ref-filter.c
16
ref-filter.c
@ -1840,6 +1840,18 @@ static struct ref_array_item *new_ref_array_item(const char *refname,
|
||||
return ref;
|
||||
}
|
||||
|
||||
struct ref_array_item *ref_array_push(struct ref_array *array,
|
||||
const char *refname,
|
||||
const struct object_id *oid)
|
||||
{
|
||||
struct ref_array_item *ref = new_ref_array_item(refname, oid);
|
||||
|
||||
ALLOC_GROW(array->items, array->nr + 1, array->alloc);
|
||||
array->items[array->nr++] = ref;
|
||||
|
||||
return ref;
|
||||
}
|
||||
|
||||
static int ref_kind_from_refname(const char *refname)
|
||||
{
|
||||
unsigned int i;
|
||||
@ -1930,13 +1942,11 @@ static int ref_filter_handler(const char *refname, const struct object_id *oid,
|
||||
* to do its job and the resulting list may yet to be pruned
|
||||
* by maxcount logic.
|
||||
*/
|
||||
ref = new_ref_array_item(refname, oid);
|
||||
ref = ref_array_push(ref_cbdata->array, refname, oid);
|
||||
ref->commit = commit;
|
||||
ref->flag = flag;
|
||||
ref->kind = kind;
|
||||
|
||||
REALLOC_ARRAY(ref_cbdata->array->items, ref_cbdata->array->nr + 1);
|
||||
ref_cbdata->array->items[ref_cbdata->array->nr++] = ref;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -135,4 +135,12 @@ void setup_ref_filter_porcelain_msg(void);
|
||||
void pretty_print_ref(const char *name, const struct object_id *oid,
|
||||
const struct ref_format *format);
|
||||
|
||||
/*
|
||||
* Push a single ref onto the array; this can be used to construct your own
|
||||
* ref_array without using filter_refs().
|
||||
*/
|
||||
struct ref_array_item *ref_array_push(struct ref_array *array,
|
||||
const char *refname,
|
||||
const struct object_id *oid);
|
||||
|
||||
#endif /* REF_FILTER_H */
|
||||
|
Loading…
Reference in New Issue
Block a user