aboutsummaryrefslogtreecommitdiffstats
path: root/test/raytracer/arrays.h
diff options
context:
space:
mode:
Diffstat (limited to 'test/raytracer/arrays.h')
-rw-r--r--test/raytracer/arrays.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/test/raytracer/arrays.h b/test/raytracer/arrays.h
new file mode 100644
index 00000000..47634f62
--- /dev/null
+++ b/test/raytracer/arrays.h
@@ -0,0 +1,31 @@
+/* Resizable arrays */
+
+struct array {
+ int size; /* Number of elements in the array */
+ int capacity; /* Max number of elements before resizing */
+ void * data; /* Actual data -- variable sized */
+};
+
+struct array * alloc_array(int eltsize, int initialsize);
+
+void grow_array(int eltsize, struct array * arr);
+
+struct array * copy_array(int eltsize, struct array * arr, int extrasize);
+
+#define new_array(ty,sz) alloc_array(sizeof(ty), sz)
+
+#define data_array(ty,arr) ((ty *) (arr)->data)
+
+#define get_array(ty,arr,idx) (data_array(ty,arr)[idx])
+
+#define get_array_large(dst,ty,arr,idx) \
+ ASSIGN(dst, data_array(ty,arr)[idx])
+
+#define set_array(ty,arr,idx,newval) (data_array(ty,arr)[idx] = (newval))
+
+#define set_array_large(ty,arr,idx,newval) \
+ ASSIGN(data_array(ty,arr)[idx], newval)
+
+#define extend_array(ty,arr) \
+ if ((arr)->size >= (arr)->capacity) grow_array(sizeof(ty), (arr)); \
+ (arr)->size++