]> git.ipfire.org Git - thirdparty/git.git/commitdiff
add DUP_ARRAY
authorRené Scharfe <l.s.r@web.de>
Sun, 1 Jan 2023 21:14:12 +0000 (22:14 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 9 Jan 2023 04:28:36 +0000 (13:28 +0900)
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 repetitve:

   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_unqual from
C23, though.

So use the safe and compatible variant for now.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-compat-util.h

index e81bb14fc90622ad44f2c31a3a69f8e425c75514..44abb240ae48aa29a5498738548b5d692b3008e0 100644 (file)
@@ -1115,6 +1115,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: