diff options
Diffstat (limited to 'teensy/teensy_list.h')
| -rw-r--r-- | teensy/teensy_list.h | 51 |
1 files changed, 19 insertions, 32 deletions
diff --git a/teensy/teensy_list.h b/teensy/teensy_list.h index 56ae4b4..6d6e536 100644 --- a/teensy/teensy_list.h +++ b/teensy/teensy_list.h @@ -4,45 +4,32 @@ #include "teensy_common.h" #include "teensy_mem.h" -typedef struct { - size_t cap; - size_t len; -} ty_List_Header; - #define TY_LIST_MIN_CAP 8 #define TY_LIST_GROW_RATE 2 -#define ty_list_get_header(arr) ((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_last(arr) ((arr)[ty_list_len(arr) - 1]) +#define ty_list_last(arr) ((arr)->items[(arr)->len - 1]) -#define ty_list_reserve(arr, amt) \ - do { \ - ty_List_Header *header = ty_list_get_header(arr); \ - if ((amt) > header->cap) { \ - header->cap = (amt) < TY_LIST_MIN_CAP ? TY_LIST_MIN_CAP : (amt); \ - header = ty_realloc( \ - header, \ - (sizeof(*(arr)) * (amt)) + sizeof(ty_List_Header) \ - ); \ - (arr) = (void*)(header + 1); \ - } \ +#define ty_list_reserve(arr, amt) \ + do { \ + if ((amt) > (arr)->cap) { \ + (arr)->cap = ty_max(TY_LIST_MIN_CAP, (arr)->cap); \ + while ((arr)->cap < (amt)) \ + (arr)->cap *= TY_LIST_GROW_RATE; \ + \ + (arr)->items = ty_realloc( \ + (arr)->items, \ + sizeof(*(arr)->items) * (arr)->cap \ + ); \ + } \ } while (0) -#define ty_list_append(arr, elem) \ - do { \ - ty_List_Header *header = ty_list_get_header(arr); \ - ty_list_reserve(arr, header->len + 1); \ - (arr)[header->len++] = (elem); \ +#define ty_list_append(arr, elem) \ + do { \ + ty_list_reserve(arr, (arr)->len + 1); \ + (arr)->items[(arr)->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); +#define ty_list_clear(arr) ((arr)->len = 0) +#define ty_list_free(arr) ty_free((arr)->items) #endif // TEENSY_LIST_H_ |
