aboutsummaryrefslogtreecommitdiff
path: root/teensy/teensy_list.h
diff options
context:
space:
mode:
Diffstat (limited to 'teensy/teensy_list.h')
-rw-r--r--teensy/teensy_list.h51
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_