diff mbox series

[2/3] add DUP_ARRAY

Message ID 4dae3686-1183-0e70-a1c8-378b1cb91d23@web.de (mailing list archive)
State Superseded
Headers show
Series COPY_ARRAY, MOVE_ARRAY, DUP_ARRAY | expand

Commit Message

René Scharfe Dec. 30, 2022, 10:02 p.m. UTC
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(+)

--
2.39.0
diff mbox series

Patch

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: