aboutsummaryrefslogtreecommitdiff
path: root/example_vec/new
diff options
context:
space:
mode:
Diffstat (limited to 'example_vec/new')
-rw-r--r--example_vec/new/main.c33
-rw-r--r--example_vec/new/vec.h116
2 files changed, 149 insertions, 0 deletions
diff --git a/example_vec/new/main.c b/example_vec/new/main.c
new file mode 100644
index 0000000..a00c35c
--- /dev/null
+++ b/example_vec/new/main.c
@@ -0,0 +1,33 @@
+#include "vec.h"
+
+typedef ints = vec[int]();
+
+#define foreach(name, i, s) \
+ for (name##_iter i = name##_begin(s); !name##_end(s, i); i = name##_next(i))
+
+int main()
+{
+ struct ints ints = ints_create(0);
+ for (int i = 0; i < 1000000; ++i) {
+ ints_append(&ints, i);
+ }
+ assert(ints_len(&ints) == 1000000);
+
+ for (int i = 0; i < 1000000; ++i) {
+ int *v = ints_at(&ints, i);
+ assert(v && *v == i);
+ }
+
+ int i = 0;
+ foreach(ints, iter, &ints) {
+ assert(iter && *iter == i);
+ i++;
+ }
+
+ for (int i = 1000000 - 1; i >= 0; --i) {
+ ints_remove(&ints, i);
+ }
+ assert(ints_len(&ints) == 0);
+
+ ints_destroy(&ints);
+}
diff --git a/example_vec/new/vec.h b/example_vec/new/vec.h
new file mode 100644
index 0000000..613af51
--- /dev/null
+++ b/example_vec/new/vec.h
@@ -0,0 +1,116 @@
+#ifndef NGC_VEC_H
+#define NGC_VEC_H
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <stdbool.h>
+
+typedef vec[any type]() {
+ struct <> {
+ size_t n;
+ size_t s;
+ type *buf;
+ };
+
+ typedef type *<>_iter;
+
+ struct <> <>_create(size_t reserve)
+ {
+ if (reserve == 0)
+ return (struct <>){.n = 0, .s = 0, .buf = NULL};
+
+ return (struct <>){
+ .n = 0,
+ .s = reserve,
+ .buf = malloc(reserve * sizeof(type))
+ };
+ }
+
+ bool <>_uninit(struct <> *v)
+ {
+ return v->buf == NULL;
+ }
+
+ size_t <>_len(struct <> *v)
+ {
+ return v->n;
+ }
+
+
+ type *<>_at(struct <> *v, size_t i)
+ {
+ assert(i < v->n && "out of vector bounds");
+ return &v->buf[i];
+ }
+
+ type *<>_pop(struct <> *v)
+ {
+ assert(v->n && "attempting to pop empty vector");
+ v->n--;
+ return &v->buf[v->n];
+ }
+
+ type* <>_append(struct <> *v, type n)
+ {
+ v->n++;
+ if (v->n >= v->s) {
+ v->s = v->s == 0 ? 1 : 2 * v->s;
+ v->buf = realloc(v->buf, v->s * sizeof(type));
+ }
+
+ v->buf[v->n - 1] = n;
+ }
+
+ void <>_reset(struct <> *v)
+ {
+ v->n = 0;
+ }
+
+ void <>_destroy(struct <> *v)
+ {
+ free(v->buf);
+ }
+
+ void <>_reserve(struct <> *v, size_t n)
+ {
+ if (v->n >= n)
+ return;
+
+ while (v->s < v->n)
+ v->s = v->s == 0 ? 1 : 2 * v->s;
+
+ v->buf = realloc(v->buf, v->s * sizeof(type));
+ }
+
+ void <>_shrink(struct <> *v, size_t n)
+ {
+ assert(v->n >= n);
+ v->n = n;
+ }
+
+ void <>_remove(struct <> *v, size_t i)
+ {
+ assert(v->n > i);
+ size_t c = sizeof(type) * (v->n - i);
+ memcpy(&v->buf[i], &v->buf[i + 1], c);
+ v->n--;
+ }
+
+ <>_iter <>_begin(struct <> *v)
+ {
+ return &v->buf[0];
+ }
+
+ bool <>_end(struct <> *v, <>_iter i)
+ {
+ return &v->buf[v->n] == i;
+ }
+
+ <>_iter <>_next(<>_iter i)
+ {
+ return i + 1;
+ }
+}
+
+#endif /* NGC_VEC_H */