Browse Source

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>
Andy Grover 11 years ago
parent
commit
54f85c236a
1 changed files with 8 additions and 1 deletions
  1. 8 1
      ccan/darray/darray.h

+ 8 - 1
ccan/darray/darray.h

@@ -74,6 +74,7 @@
  *
  *
  *     T      darray_pop(darray(T) arr | darray_size(arr) != 0);
  *     T      darray_pop(darray(T) arr | darray_size(arr) != 0);
  *     T*     darray_pop_check(darray(T*) arr);
  *     T*     darray_pop_check(darray(T*) arr);
+ *     void   darray_remove(darray(T) arr, size_t index);
  *
  *
  * Replacement:
  * Replacement:
  *
  *
@@ -106,7 +107,7 @@
  *     darray_foreach(T *&i, darray(T) arr) {...}
  *     darray_foreach(T *&i, darray(T) arr) {...}
  *     darray_foreach_reverse(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.
  * 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. */
 /* Warning: Do not call darray_pop on an empty darray. */
 #define darray_pop(arr) ((arr).item[--(arr).size])
 #define darray_pop(arr) ((arr).item[--(arr).size])
 #define darray_pop_check(arr) ((arr).size ? darray_pop(arr) : NULL)
 #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 ***/
 /*** Replacement ***/