git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[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
Previous: Junio C HamanoNext: René Scharfe
Message 10 of 20 in “COPY_ARRAY, MOVE_ARRAY, DUP_ARRAY”
  1. 0/3 COPY_ARRAY, MOVE_ARRAY, DUP_ARRAYRené Scharfe, Dec 30, 2022
  2. 1/3 do full type check in COPY_ARRAY and MOVE_ARRAYRené Scharfe, Dec 30, 2022
  3. Junio C HamanoJan 1, 2023
  4. Junio C HamanoJan 1, 2023
  5. René ScharfeJan 1, 2023
  6. René ScharfeJan 1, 2023
  7. Junio C HamanoJan 1, 2023
  8. René ScharfeJan 1, 2023
  9. Junio C HamanoJan 1, 2023
  10. 2/3 add DUP_ARRAYRené Scharfe, Dec 30, 2022
  11. 3/3 use DUP_ARRAYRené Scharfe, Dec 30, 2022
  12. 0/4 COPY_ARRAY, MOVE_ARRAY, DUP_ARRAYRené Scharfe, Jan 1, 2023
  13. 1/4 factor out BARF_UNLESS_COPYABLERené Scharfe, Jan 1, 2023
  14. 2/4 do full type check in BARF_UNLESS_COPYABLERené Scharfe, Jan 1, 2023
  15. Junio C HamanoJan 8, 2023
  16. René ScharfeJan 8, 2023
  17. Junio C HamanoJan 9, 2023
  18. Jeff HostetlerJan 9, 2023
  19. 3/4 add DUP_ARRAYRené Scharfe, Jan 1, 2023
  20. 4/4 use DUP_ARRAYRené Scharfe, Jan 1, 2023

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.