aboutsummaryrefslogtreecommitdiff
path: root/lib/cbit/vec.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/cbit/vec.c')
-rw-r--r--lib/cbit/vec.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/cbit/vec.c b/lib/cbit/vec.c
new file mode 100644
index 0000000..21038a2
--- /dev/null
+++ b/lib/cbit/vec.c
@@ -0,0 +1,23 @@
+#include "cbit/vec.h"
+#include <stdio.h>
+
+void vec_realloc_internal(struct vec_internal *vi, size_t new_capacity,
+ size_t esize) {
+ size_t new_size = safe_mul(new_capacity, esize);
+ if (vi->els == vi->storage) {
+ void *new = malloc(new_size);
+ memcpy(new, vi->els, vi->capacity * esize);
+ vi->els = new;
+ } else {
+ vi->els = realloc(vi->els, new_size);
+ }
+ vi->capacity = new_capacity;
+}
+void vec_realloc_internal_as_necessary(struct vec_internal *vi,
+ size_t min_capacity,
+ size_t esize) {
+ if (min_capacity > vi->capacity)
+ vec_realloc_internal(vi, safe_mul(vi->capacity, 2), esize);
+ else if (min_capacity < vi->capacity / 3)
+ vec_realloc_internal(vi, vi->capacity / 3, esize);
+}