Add vector_resize

This commit is contained in:
Nikita Ivanov
2022-06-07 00:17:38 +05:00
parent 55cb74435b
commit 0ae355868d
2 changed files with 36 additions and 16 deletions

View File

@ -37,25 +37,31 @@ void vector_free(Vector *vec)
free(vec);
}
void vector_append_arr(Vector *vec, void *arr, size_t len)
static void resize_if_needed(Vector *vec, size_t new_len)
{
void *p;
size_t cap = vec->cap;
while (cap < vec->len + len)
while (new_len > cap)
cap *= 2;
if (cap != vec->cap) {
if (!(p = realloc(vec->buf, vec->size * cap))) {
vector_free(vec);
PRINTINTERR(FUNCFAILED("realloc"), ERRNOS);
abort();
}
if (cap == vec->cap)
return;
vec->buf = p;
vec->cap = cap;
if (!(p = realloc(vec->buf, vec->size * cap))) {
vector_free(vec);
PRINTINTERR(FUNCFAILED("realloc"), ERRNOS);
abort();
}
vec->buf = p;
vec->cap = cap;
}
void vector_append_arr(Vector *vec, void *arr, size_t len)
{
resize_if_needed(vec, vec->len + len);
memcpy(vec->buf + vec->len * vec->size, arr, len * vec->size);
vec->len += len;
}
@ -69,3 +75,10 @@ void *vector_get(Vector *vec, size_t i)
{
return vec->buf + i * vec->size;
}
void vector_resize(Vector *vec, size_t len)
{
resize_if_needed(vec, len);
vec->len = len;
}