add macro REALLOC_ARRAY
authorRené Scharfe <l.s.r@web.de>
Tue, 16 Sep 2014 18:56:48 +0000 (20:56 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 18 Sep 2014 16:13:38 +0000 (09:13 -0700)
The macro ALLOC_GROW manages several aspects of dynamic memory
allocations for arrays: It performs overprovisioning in order to avoid
reallocations in future calls, updates the allocation size variable,
multiplies the item size and thus allows users to simply specify the
item count, performs the reallocation and updates the array pointer.

Sometimes this is too much. Add the macro REALLOC_ARRAY, which only
takes care of the latter three points and allows users to specfiy the
number of items the array can store. It can increase and also decrease
the size. Using the macro avoid duplicating the variable name and
takes care of the item sizes automatically.

Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/technical/api-allocation-growing.txt
git-compat-util.h
index 542946b1ba701069837b702cbd8fe8079cecf56d..5a59b548448f3744a24ff9a58181b105f9cb1934 100644 (file)
@@ -34,3 +34,6 @@ item[nr++] = value you like;
 ------------
 
 You are responsible for updating the `nr` variable.
+
+If you need to specify the number of elements to allocate explicitly
+then use the macro `REALLOC_ARRAY(item, alloc)` instead of `ALLOC_GROW`.
index 4e7e3f8726a26a1f7dfbb889fe3531d01d4419b9..5a15b53d67b2fd0650f2bfe929f70dcd625c2cbd 100644 (file)
@@ -626,6 +626,8 @@ extern int odb_mkstemp(char *template, size_t limit, const char *pattern);
 extern int odb_pack_keep(char *name, size_t namesz, const unsigned char *sha1);
 extern char *xgetcwd(void);
 
+#define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), (alloc) * sizeof(*(x)))
+
 static inline size_t xsize_t(off_t len)
 {
        if (len > (size_t) len)