add MOVE_ARRAY
Similar to COPY_ARRAY (introduced in 60566cbb58
), add a safe and
convenient helper for moving potentially overlapping ranges of array
entries. It infers the element size, multiplies automatically and
safely to get the size in bytes, does a basic type safety check by
comparing element sizes and unlike memmove(3) it supports NULL
pointers iff 0 elements are to be moved.
Also add a semantic patch to demonstrate the helper's intended usage.
Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
parent
f3da2b79be
commit
578398071e
|
@ -25,6 +25,23 @@ expression n;
|
||||||
- memcpy(dst, src, n * sizeof(T));
|
- memcpy(dst, src, n * sizeof(T));
|
||||||
+ COPY_ARRAY(dst, src, n);
|
+ COPY_ARRAY(dst, src, n);
|
||||||
|
|
||||||
|
@@
|
||||||
|
type T;
|
||||||
|
T *dst;
|
||||||
|
T *src;
|
||||||
|
expression n;
|
||||||
|
@@
|
||||||
|
(
|
||||||
|
- memmove(dst, src, (n) * sizeof(*dst));
|
||||||
|
+ MOVE_ARRAY(dst, src, n);
|
||||||
|
|
|
||||||
|
- memmove(dst, src, (n) * sizeof(*src));
|
||||||
|
+ MOVE_ARRAY(dst, src, n);
|
||||||
|
|
|
||||||
|
- memmove(dst, src, (n) * sizeof(T));
|
||||||
|
+ MOVE_ARRAY(dst, src, n);
|
||||||
|
)
|
||||||
|
|
||||||
@@
|
@@
|
||||||
type T;
|
type T;
|
||||||
T *ptr;
|
T *ptr;
|
||||||
|
|
|
@ -825,6 +825,14 @@ static inline void copy_array(void *dst, const void *src, size_t n, size_t size)
|
||||||
memcpy(dst, src, st_mult(size, n));
|
memcpy(dst, src, st_mult(size, n));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MOVE_ARRAY(dst, src, n) move_array((dst), (src), (n), sizeof(*(dst)) + \
|
||||||
|
BUILD_ASSERT_OR_ZERO(sizeof(*(dst)) == sizeof(*(src))))
|
||||||
|
static inline void move_array(void *dst, const void *src, size_t n, size_t size)
|
||||||
|
{
|
||||||
|
if (n)
|
||||||
|
memmove(dst, src, st_mult(size, n));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These functions help you allocate structs with flex arrays, and copy
|
* These functions help you allocate structs with flex arrays, and copy
|
||||||
* the data directly into the array. For example, if you had:
|
* the data directly into the array. For example, if you had:
|
||||||
|
|
Loading…
Reference in New Issue