summaryrefslogtreecommitdiff
path: root/dynarray.h
diff options
context:
space:
mode:
Diffstat (limited to 'dynarray.h')
-rw-r--r--dynarray.h32
1 files changed, 32 insertions, 0 deletions
diff --git a/dynarray.h b/dynarray.h
new file mode 100644
index 0000000..9ff1289
--- /dev/null
+++ b/dynarray.h
@@ -0,0 +1,32 @@
+
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+
+#define DEFINE_DYNARRAY(name, type) \
+ type *name; \
+ int name ## _len; \
+ int name ## _size;
+
+#define RESIZE_DYNARRAY(name, desired_len) { \
+ int orig_size = name ## _size; \
+ while(name ## _size < (desired_len)) \
+ name ## _size *= 2; \
+ /* don't bother shrinking for now. when/if we do, we'll want to bake in \
+ * some kind of hysteresis so that we don't shrink until we've been under \
+ * for a while. */ \
+ if(name ## _size != orig_size) \
+ name = realloc(name, name ## _size * sizeof(*name)); \
+ name ## _len = desired_len; \
+}
+
+#define INIT_DYNARRAY(name, initial_len, initial_size) \
+ name ## _len = initial_len; \
+ name ## _size = initial_size; \
+ name = realloc(NULL, name ## _size * sizeof(*name))
+
+#define FREE_DYNARRAY(name) \
+ free(name);
+
+#define DYNARRAY_GET_TOP(name) \
+ (&name[name ## _len - 1])
+
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback