aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTucker Evans <tucker@tuckerevans.com>2020-07-04 22:17:27 -0400
committerTucker Evans <tucker@tuckerevans.com>2020-07-04 23:14:34 -0400
commit5fa1551b4a0acc28d5c656479806511ab0c81a18 (patch)
tree47738892753aaf5947f011f779efd159ea476266
parent8aa9f42d914a453a0570752ee292b9a9cfcae9d6 (diff)
Add reserve function to vectors
-rw-r--r--collections/vector/vector.adoc20
-rw-r--r--collections/vector/vector.c14
-rw-r--r--collections/vector/vector.h1
3 files changed, 34 insertions, 1 deletions
diff --git a/collections/vector/vector.adoc b/collections/vector/vector.adoc
index ce91c71..7c4bc7f 100644
--- a/collections/vector/vector.adoc
+++ b/collections/vector/vector.adoc
@@ -1,7 +1,7 @@
Vector
======
Tucker Evans
-v0.16, 2020-07-04
+v0.17, 2020-07-04
A basic vector, that hold pointers to your data structures.
@@ -400,6 +400,24 @@ vec_truncate(vector, 1);
assert(vec_size == 1);
----
+[[vec_reserve]]
++void vec_reserve(vec *self, int additional)+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Reserves space for +additional+ items. May reserve more memory to avoid too
+many reallocations.
+
+Examples
+^^^^^^^^
+[source,c]
+----
+#include "vector.h"
+
+vec *vector = vec_with_capacity(16);
+
+vec_reserve(vector, 20);
+assert(vec_capacity(vector) >= 20);
+----
+
[[vec_clear]]
+void vec_clear(vec *self)+
~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/collections/vector/vector.c b/collections/vector/vector.c
index 391b5a6..f14c302 100644
--- a/collections/vector/vector.c
+++ b/collections/vector/vector.c
@@ -250,6 +250,20 @@ int size;
root->end = size;
}
+void vec_reserve(root, n)
+vec *root;
+int n;
+{
+ int i;
+
+ if (!root || n + root->end <= root->limit)
+ return;
+
+ for (i = root->limit; i < root->end + n; i*=2);
+
+ root->base = reallocarray(root->base, i, sizeof(void*));
+}
+
void vec_clear(root)
vec *root;
{
diff --git a/collections/vector/vector.h b/collections/vector/vector.h
index b997b46..4d6d04c 100644
--- a/collections/vector/vector.h
+++ b/collections/vector/vector.h
@@ -30,6 +30,7 @@ void* vec_swap_pop(vec*, int);
/*memory*/
void vec_truncate(vec*, int);
+void vec_reserve(vec*, int);
void vec_clear(vec*);
void vec_free(vec*);