diff --git a/src/collections/List.h b/src/collections/List.h index ba2d3d0..5dc523a 100644 --- a/src/collections/List.h +++ b/src/collections/List.h @@ -12,22 +12,26 @@ return (List_##T){ .data = data_ptr, .len = len, .max_len = max_len };\ }\ \ - static inline List_##T List_##T##_alloc(u32 len){\ - return List_##T##_construct((T*)(len > 0 ? malloc(len * sizeof(T)) : NULL), 0, 0);\ - }\ + List_##T List_##T##_alloc(u32 initial_len);\ \ T* List_##T##_expand(List_##T* ptr);\ void List_##T##_push(List_##T* ptr, T value);\ #define List_define(T)\ + List_##T List_##T##_alloc(u32 initial_len){\ + if(initial_len == 0)\ + return List_##T##_construct((T*)NULL, 0, 0);\ + u32 max_Len = ALIGN_TO(initial_len, sizeof(void*)/sizeof(T));\ + /* branchless version of max(max_len, __List_min_size) */\ + max_len += (max_len < __List_min_size) * (__List_min_size - max_len);\ + return List_##T##_construct((T*)malloc(initial_len * sizeof(T)), 0, max_len);\ + }\ + \ T* List_##T##_expand(List_##T* ptr){\ if(ptr->len == ptr->max_len){\ - u32 max_len = ptr->max_len * 1.5;\ - max_len += __List_padding_in_sizeof_T(T);\ - /* branchless version of max(max_len, __List_min_size) */\ - max_len += (max_len < __List_min_size) * (__List_min_size - max_len);\ - ptr->data = (T*)realloc(ptr->data, max_len * sizeof(T));\ + ptr->max_len *= 2;\ + ptr->data = (T*)realloc(ptr->data, ptr->max_len * sizeof(T));\ ptr->max_len = max_len;\ }\ return &ptr->data[ptr->len++];\ @@ -40,11 +44,6 @@ #define __List_min_size 16 -// sizeof(T) == 1 - padding is 7 of sizeof(T) -// sizeof(T) == 2 - padding is 3 of sizeof(T) -// sizeof(T) == 4 - padding is 1 of sizeof(T) -#define __List_padding_in_sizeof_T(T) ((8 - sizeof(T) % 8) / sizeof(T) ) - List_declare(cstr); List_declare(u32); List_declare(u8);