From: Derrick Stolee Date: Fri, 06 Apr 2018 19:27:13 GMT Subject: Re: [PATCH 3/3] ref-filter: factor ref_array pushing into its own function Message-ID: <51135137-97ea-354a-7acd-4e905ee69a80@gmail.com> In-Reply-To: <20180406185945.GC11108@sigill.intra.peff.net> On 4/6/2018 2:59 PM, Jeff King wrote: > 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 > --- > ref-filter.c | 16 +++++++++++++--- > ref-filter.h | 8 ++++++++ > 2 files changed, 21 insertions(+), 3 deletions(-) > > diff --git a/ref-filter.c b/ref-filter.c > index c1c3cc9480..6e9328b274 100644 > --- a/ref-filter.c > +++ b/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; > } > > diff --git a/ref-filter.h b/ref-filter.h > index 68268f9ebc..76cf87cb6c 100644 > --- a/ref-filter.h > +++ b/ref-filter.h > @@ -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 */ The three patches in this series look good to me. Reviewed-by: Derrick Stolee