summaryrefslogtreecommitdiff
path: root/Podium/p_ds.h
diff options
context:
space:
mode:
Diffstat (limited to 'Podium/p_ds.h')
-rw-r--r--Podium/p_ds.h52
1 files changed, 52 insertions, 0 deletions
diff --git a/Podium/p_ds.h b/Podium/p_ds.h
new file mode 100644
index 0000000..8731975
--- /dev/null
+++ b/Podium/p_ds.h
@@ -0,0 +1,52 @@
+#define DEFAULT_ALIGNMENT (2 * sizeof(void *))
+#define ARRAY_GROW_FACTOR 2
+
+typedef struct {
+ u32 size;
+ u32 capacity;
+} DynamicArrayHeader;
+
+#define DARRAY_INIT_CAPACITY 64
+#define p_darray_push(array, var) \
+ do { \
+ if (array == NULL) { \
+ DynamicArrayHeader *header = \
+ malloc(DARRAY_INIT_CAPACITY * sizeof *array + sizeof *header); \
+ header->size = 0; \
+ header->capacity = DARRAY_INIT_CAPACITY; \
+ array = (void *)(header + 1); \
+ } \
+ DynamicArrayHeader *header = (DynamicArrayHeader *)(array) - 1; \
+ if (header->size >= header->capacity - 1) { \
+ unsigned long new_capacity = header->capacity * 2; \
+ DynamicArrayHeader *new_header = \
+ realloc(header, new_capacity * sizeof *array + sizeof *header); \
+ if (!new_header) \
+ break; \
+ header = new_header; \
+ array = (void *)(header + 1); \
+ header->capacity = new_capacity; \
+ } \
+ (array)[header->size++] = var; \
+ } while (0)
+
+#define p_darray_len(array) ((array) ? ((DynamicArrayHeader *)(array) - 1)->size : 0)
+#define p_darray_destroy(array) \
+{ \
+ free((DynamicArrayHeader *)(array) - 1); \
+}
+
+#define p_darray_shrink(array) \
+ do { \
+ DynamicArrayHeader *header = (array) ? ((DynamicArrayHeader *)(array) - 1) : 0;\
+ if (header) {\
+ if (header->capacity > 4) {\
+ unsigned long new_capacity = (header->capacity >> 1) + (header->capacity & 1); \
+ void *new_header = realloc(header, new_capacity * sizeof *array + sizeof *header); \
+ if (!new_header) break; \
+ header = new_header; \
+ array = (void *)(header + 1); \
+ header->capacity = new_capacity; \
+ }\
+ }\
+ } while (0)