u_dynarray: add util_dynarray_grow_cap
authorQiang Yu <yuq825@gmail.com>
Mon, 19 Feb 2018 13:44:44 +0000 (21:44 +0800)
committerQiang Yu <yuq825@gmail.com>
Thu, 11 Apr 2019 01:57:53 +0000 (09:57 +0800)
This is for the case that user only know a max size
it wants to append to the array and enlarge the array
capacity before writing into it.

v2:
- rename newsize to newcap
- rename util_dynarray_enlarge to util_dynarray_grow_cap

Signed-off-by: Qiang Yu <yuq825@gmail.com>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
src/util/u_dynarray.h

index 9bed2b9c25c879672e222e6767564bb0b8bd0890..b30fd7b115404259fbb0321f04a3f0c0ad5dcd85 100644 (file)
@@ -77,16 +77,14 @@ util_dynarray_clear(struct util_dynarray *buf)
 
 #define DYN_ARRAY_INITIAL_SIZE 64
 
-/* use util_dynarray_trim to reduce the allocated storage */
 static inline void *
-util_dynarray_resize(struct util_dynarray *buf, unsigned newsize)
+util_dynarray_ensure_cap(struct util_dynarray *buf, unsigned newcap)
 {
-   void *p;
-   if (newsize > buf->capacity) {
+   if (newcap > buf->capacity) {
       if (buf->capacity == 0)
          buf->capacity = DYN_ARRAY_INITIAL_SIZE;
 
-      while (newsize > buf->capacity)
+      while (newcap > buf->capacity)
          buf->capacity *= 2;
 
       if (buf->mem_ctx) {
@@ -96,7 +94,20 @@ util_dynarray_resize(struct util_dynarray *buf, unsigned newsize)
       }
    }
 
-   p = (void *)((char *)buf->data + buf->size);
+   return (void *)((char *)buf->data + buf->size);
+}
+
+static inline void *
+util_dynarray_grow_cap(struct util_dynarray *buf, int diff)
+{
+   return util_dynarray_ensure_cap(buf, buf->size + diff);
+}
+
+/* use util_dynarray_trim to reduce the allocated storage */
+static inline void *
+util_dynarray_resize(struct util_dynarray *buf, unsigned newsize)
+{
+   void *p = util_dynarray_ensure_cap(buf, newsize);
    buf->size = newsize;
 
    return p;