diff options
Diffstat (limited to 'teensy/teensy_list.h')
| -rw-r--r-- | teensy/teensy_list.h | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/teensy/teensy_list.h b/teensy/teensy_list.h new file mode 100644 index 0000000..dd1e06a --- /dev/null +++ b/teensy/teensy_list.h @@ -0,0 +1,49 @@ +#ifndef TEENSY_LIST_H_ +#define TEENSY_LIST_H_ + +#include "teensy_common.h" +#include "teensy_mem.h" + +struct ty_list_header { + size_t cap; + size_t len; +}; + +#define TY_LIST_MIN_CAP 8 +#define TY_LIST_GROW_RATE 2 + +#define ty_list_get_header(arr) ((struct ty_list_header*)arr - 1) +#define ty_list_cap(arr) (ty_list_get_header(arr)->cap) +#define ty_list_len(arr) (ty_list_get_header(arr)->len) + + +#define ty_list_reserve(arr, amt) \ + do { \ + struct ty_list_header *header = ty_list_get_header(arr); \ + if (amt > header->cap) { \ + header->cap = header->cap < TY_LIST_MIN_CAP \ + ? TY_LIST_MIN_CAP \ + : header->cap * TY_LIST_GROW_RATE; \ + header = ty_realloc( \ + header, \ + (sizeof(*(arr)) * amt) + sizeof(struct ty_list_header) \ + ); \ + (arr) = (void*)(header + 1); \ + } \ + } while (0) + +#define ty_list_append(arr, elem) \ + do { \ + struct ty_list_header *header = ty_list_get_header(arr); \ + ty_list_reserve(arr, header->len + 1); \ + (arr)[header->len++] = (elem); \ + } while (0) + +#define ty_list_clear(arr) \ + (ty_list_get_header(arr)->len = 0) + +#define ty_list_free(arr) (ty_free(ty_list_get_header(arr))) + +void *ty_list_create(void); + +#endif // TEENSY_LIST_H_ |
