[PATCH 2/3] add DUP_ARRAY
- From
René Scharfe <l.s.r@web.de>
- Date
- Dec 30, 2022, 22:02 UTC
- Message-ID
- <4dae3686-1183-0e70-a1c8-378b1cb91d23@web.de>
- In-Reply-To
- <efe7ec20-201e-a1c1-8e16-2f714a0aee8e@web.de>
Add a macro for allocating and populating a shallow copy of an array. It is intended to replace a sequence like this:
ALLOC_ARRAY(dst, n); COPY_ARRAY(dst, src, n);
With the less repetitive:
DUP_ARRAY(dst, src, n);
It checks whether the types of source and destination are compatible to ensure the copy can be used safely.
An easier alternative would be to only consider the source and return a void pointer, that could be used like this:
dst = ARRAY_DUP(src, n);
That would be more versatile, as it could be used in declarations as well. Making it type-safe would require the use of typeof from C23, though, as far as I can see.
So use the first variant, whose safety requires no compiler extensions or future features.
Signed-off-by: René Scharfe <l.s.r@web.de> --- git-compat-util.h | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/git-compat-util.h b/git-compat-util.h index 8d04832988..29f4f699b5 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -1111,6 +1111,11 @@ static inline void move_array(void *dst, const void *src, size_t n, size_t size) memmove(dst, src, st_mult(size, n)); } +#define DUP_ARRAY(dst, src, n) do { \ + size_t dup_array_n_ = (n); \ + COPY_ARRAY(ALLOC_ARRAY((dst), dup_array_n_), (src), dup_array_n_); \ +} while (0) + /* * These functions help you allocate structs with flex arrays, and copy * the data directly into the array. For example, if you had: -- 2.39.0