diff options
Diffstat (limited to 'hicn-light/src/hicn/base/vector.c')
-rw-r--r-- | hicn-light/src/hicn/base/vector.c | 60 |
1 files changed, 49 insertions, 11 deletions
diff --git a/hicn-light/src/hicn/base/vector.c b/hicn-light/src/hicn/base/vector.c index 00ed7c305..43110414a 100644 --- a/hicn-light/src/hicn/base/vector.c +++ b/hicn-light/src/hicn/base/vector.c @@ -18,16 +18,30 @@ * \brief Implementation of resizeable static array */ +#include <assert.h> #include <stddef.h> // size_t #include <stdlib.h> // calloc +#include <stdio.h> #include "vector.h" +#define DEFAULT_VECTOR_SIZE 64 + void -_vector_init(void ** vector_ptr, size_t elt_size, size_t max_elts) +_vector_init(void ** vector_ptr, size_t elt_size, size_t init_size, size_t max_size) { - vector_hdr_t * vh = calloc(VECTOR_HDRLEN + elt_size * max_elts, 1); - *vector_ptr = (uint8_t*)vh - VECTOR_HDRLEN; + assert(vector_ptr); + assert(max_size == 0 || init_size < max_size); + + if (init_size == 0) + init_size = DEFAULT_VECTOR_SIZE; + + *vector_ptr = NULL; + _vector_resize(vector_ptr, elt_size, init_size); + + vector_hdr_t * vh = vector_hdr(*vector_ptr); + vh->cur_size = 0; + vh->max_size = max_size; } void @@ -37,18 +51,42 @@ _vector_free(void ** vector_ptr) *vector_ptr = NULL; } -void +int _vector_resize(void ** vector_ptr, size_t elt_size, off_t pos) { - vector_hdr_t * vh = vector_hdr(*vector_ptr); - size_t new_elts = (pos > 0) ? next_pow2(pos) : vh->max_elts * 2; + vector_hdr_t * vh; - /* Double the allocated vector size */ - vh = realloc(vh, VECTOR_HDRLEN + new_elts * elt_size); + size_t old_size; + + if (*vector_ptr) { + vh = vector_hdr(*vector_ptr); + old_size = vh->alloc_size; + } else { + vh = NULL; + old_size = 0; + } + + /* Round the allocated size to the next power of 2 of the requested position */ + size_t new_size = next_pow2(pos); + + /* Don't grow the vector back */ + if (new_size < old_size) + return 0; + + /* Don't exceed maximum size (for init, check is done beforehand) */ + if (vh && vh->max_size && new_size > vh->max_size) + return -1; + + vh = realloc(vh, VECTOR_HDRLEN + new_size * elt_size); if (!vh) - abort(); - vh->max_elts = new_elts; + return -1; + vh->alloc_size = new_size; + + /* Zero out the newly allocated memory (except headers) */ + memset((uint8_t*)vh + VECTOR_HDRLEN + old_size * elt_size, 0, (new_size - old_size) * elt_size); /* Reassign vector pointer */ - *vector_ptr = (uint8_t*) + VECTOR_HDRLEN; + *vector_ptr = (uint8_t*)vh + VECTOR_HDRLEN; + + return 0; } |