summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Grover <agrover@redhat.com>2014-08-12 10:49:13 -0700
committerAndy Grover <agrover@redhat.com>2014-08-12 10:49:13 -0700
commit54f85c236ad6f04734cda522ffb78bce7be824bf (patch)
tree4123d93c8f6dcdcf309cfd306f704182b7450633
parent897626152d12d7fd13a8feb36989eb5c8c1f3485 (diff)
darray: Add darray_remove()
It is useful to be able to remove elements from other than the end, even if it is slow. Signed-off-by: Andy Grover <agrover@redhat.com>
-rw-r--r--ccan/darray/darray.h9
1 files changed, 8 insertions, 1 deletions
diff --git a/ccan/darray/darray.h b/ccan/darray/darray.h
index b7e08db2..75112419 100644
--- a/ccan/darray/darray.h
+++ b/ccan/darray/darray.h
@@ -74,6 +74,7 @@
*
* T darray_pop(darray(T) arr | darray_size(arr) != 0);
* T* darray_pop_check(darray(T*) arr);
+ * void darray_remove(darray(T) arr, size_t index);
*
* Replacement:
*
@@ -106,7 +107,7 @@
* darray_foreach(T *&i, darray(T) arr) {...}
* darray_foreach_reverse(T *&i, darray(T) arr) {...}
*
- * Except for darray_foreach and darray_foreach_reverse,
+ * Except for darray_foreach, darray_foreach_reverse, and darray_remove,
* all macros evaluate their non-darray arguments only once.
*/
@@ -221,6 +222,12 @@ typedef darray(unsigned long) darray_ulong;
/* Warning: Do not call darray_pop on an empty darray. */
#define darray_pop(arr) ((arr).item[--(arr).size])
#define darray_pop_check(arr) ((arr).size ? darray_pop(arr) : NULL)
+/* Warning, slow: Requires copying all elements after removed item. */
+#define darray_remove(arr, index) do { \
+ if (index < arr.size-1) \
+ memmove(&(arr).item[index], &(arr).item[index+1], ((arr).size-1-i)*sizeof(*(arr).item)); \
+ (arr).size--; \
+ } while(0)
/*** Replacement ***/