diff options
| -rw-r--r-- | da.h | 30 | 
1 files changed, 22 insertions, 8 deletions
| @@ -23,15 +23,17 @@   * The argument ‘a’ to all of the below macros is a pointer to the dynamic array   * structure.   * - * dainit(a, n)              Initialize the array with a capacity of ‘n’ items. - * dapush(a, x)              Append the item ‘x’ to the array - * daremove(a, x)            Remove the item at index ‘x’ from the array - * da_remove_range(a, x, y)  Remove the items between the range [x, y) - * da_foreach(a, p)          Iterate the pointer ‘p’ over each element of the - *                           array.  The type of ‘p’ is inferred. + * dainit(a, n)             Initialize the array with a capacity of ‘n’ items + * dapush(a, x)             Append the item ‘x’ to the array + * daextend(a, xs, n)       Append the ‘n’ items pointed to by ‘xs’ to the array + * daremove(a, x)           Remove the item at index ‘x’ from the array + * da_remove_range(a, x, y) Remove the items between the range [x, y) + * da_foreach(a, p)         Iterate the pointer ‘p’ over each element of the + *                          array.  The type of ‘p’ is inferred.   * - * The ‘dapush()’ macro will double the arrays capacity when it gets full.  If - * you would like your arrays to grow with a different scale, edit this file. + * The ‘dapush()’ and ‘daextend()’ macros will double the arrays capacity when + * it gets full.  If you would like your arrays to grow with a different scale, + * edit this file.   *   *   * Example @@ -106,6 +108,18 @@  		(a)->buf[(a)->len++] = (x); \  	} while (0) +#define daextend(a, xs, n) \ +	do { \ +		if ((a)->len + (n) >= (a)->cap) { \ +			do \ +				(a)->cap = (a)->cap ? (a)->cap * 2 : 1; \ +			while ((a)->len + (n) >= (a)->cap); \ +			DA_ALLOC((a)->buf, (a)->cap); \ +		} \ +		memcpy((a)->buf + (a)->len, (xs), (n)); \ +		(a)->len += (n); \ +	} while (0) +  #define daremove(a, i) da_remove_range((a), (i), (i) + 1)  #define da_remove_range(a, i, j) \ |