diff options
| author | Vasco <[email protected]> | 2026-08-24 00:56:24 +0100 |
|---|---|---|
| committer | Vasco <[email protected]> | 2026-08-24 00:56:24 +0100 |
| commit | 5dc2716abd43166cd65133625f408ad36a6623b3 (patch) | |
| tree | 19d89b838206b6bb11cc0b9f88311d855999d447 /archive/Podium/p_ds.h | |
| parent | dc96fcd771bea09d726a760266739906e95c09a6 (diff) | |
Peak 0.4.0 and Draw
Diffstat (limited to 'archive/Podium/p_ds.h')
| -rw-r--r-- | archive/Podium/p_ds.h | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/archive/Podium/p_ds.h b/archive/Podium/p_ds.h new file mode 100644 index 0000000..8731975 --- /dev/null +++ b/archive/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) |
