]> git.ipfire.org Git - thirdparty/git.git/commit
strvec: `strvec_splice()` to a statically initialized vector
authorRubén Justo <rjusto@gmail.com>
Wed, 4 Dec 2024 22:44:25 +0000 (23:44 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 10 Dec 2024 00:07:47 +0000 (09:07 +0900)
commit14ef8c04c545d729174839b3ecbad2b5f24b1de6
treef8f8700355bba844716e0bb26fec74b91eb52054
parent60c778d1723950bc1d8b2d5cf496c677e24df9f4
strvec: `strvec_splice()` to a statically initialized vector

We use a singleton empty array to initialize a `struct strvec`;
similar to the empty string singleton we use to initialize a `struct
strbuf`.

Note that an empty strvec instance (with zero elements) does not
necessarily need to be an instance initialized with the singleton.
Let's refer to strvec instances initialized with the singleton as
"empty-singleton" instances.

    As a side note, this is the current `strvec_pop()`:

    void strvec_pop(struct strvec *array)
    {
     if (!array->nr)
     return;
     free((char *)array->v[array->nr - 1]);
     array->v[array->nr - 1] = NULL;
     array->nr--;
    }

    So, with `strvec_pop()` an instance can become empty but it does
    not going to be the an "empty-singleton".

This "empty-singleton" circumstance requires us to be careful when
adding elements to instances.  Specifically, when adding the first
element:  when we detach the strvec instance from the singleton and
set the internal pointer in the instance to NULL.  After this point we
apply `realloc()` on the pointer.  We do this in
`strvec_push_nodup()`, for example.

The recently introduced `strvec_splice()` API is expected to be
normally used with non-empty strvec's.  However, it can also end up
being used with "empty-singleton" strvec's:

       struct strvec arr = STRVEC_INIT;
       int a = 0, b = 0;

       ... no modification to arr, a or b ...

       const char *rep[] = { "foo" };
       strvec_splice(&arr, a, b, rep, ARRAY_SIZE(rep));

So, we'll try to add elements to an "empty-singleton" strvec instance.

Avoid misapplying `realloc()` to the singleton in `strvec_splice()` by
adding a special case for strvec's initialized with the singleton.

Signed-off-by: Rubén Justo <rjusto@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
strvec.c
t/unit-tests/strvec.c