List growth factor and padding
This commit is contained in:
parent
46e5eb1887
commit
7f606dfaff
@ -12,22 +12,26 @@
|
|||||||
return (List_##T){ .data = data_ptr, .len = len, .max_len = max_len };\
|
return (List_##T){ .data = data_ptr, .len = len, .max_len = max_len };\
|
||||||
}\
|
}\
|
||||||
\
|
\
|
||||||
static inline List_##T List_##T##_alloc(u32 len){\
|
List_##T List_##T##_alloc(u32 initial_len);\
|
||||||
return List_##T##_construct((T*)(len > 0 ? malloc(len * sizeof(T)) : NULL), 0, 0);\
|
|
||||||
}\
|
|
||||||
\
|
\
|
||||||
T* List_##T##_expand(List_##T* ptr);\
|
T* List_##T##_expand(List_##T* ptr);\
|
||||||
void List_##T##_push(List_##T* ptr, T value);\
|
void List_##T##_push(List_##T* ptr, T value);\
|
||||||
|
|
||||||
|
|
||||||
#define List_define(T)\
|
#define List_define(T)\
|
||||||
T* List_##T##_expand(List_##T* ptr){\
|
List_##T List_##T##_alloc(u32 initial_len){\
|
||||||
if(ptr->len == ptr->max_len){\
|
if(initial_len == 0)\
|
||||||
u32 max_len = ptr->max_len * 1.5;\
|
return List_##T##_construct((T*)NULL, 0, 0);\
|
||||||
max_len += __List_padding_in_sizeof_T(T);\
|
u32 max_Len = ALIGN_TO(initial_len, sizeof(void*)/sizeof(T));\
|
||||||
/* branchless version of max(max_len, __List_min_size) */\
|
/* branchless version of max(max_len, __List_min_size) */\
|
||||||
max_len += (max_len < __List_min_size) * (__List_min_size - max_len);\
|
max_len += (max_len < __List_min_size) * (__List_min_size - max_len);\
|
||||||
ptr->data = (T*)realloc(ptr->data, max_len * sizeof(T));\
|
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){\
|
||||||
|
ptr->max_len *= 2;\
|
||||||
|
ptr->data = (T*)realloc(ptr->data, ptr->max_len * sizeof(T));\
|
||||||
ptr->max_len = max_len;\
|
ptr->max_len = max_len;\
|
||||||
}\
|
}\
|
||||||
return &ptr->data[ptr->len++];\
|
return &ptr->data[ptr->len++];\
|
||||||
@ -40,11 +44,6 @@
|
|||||||
|
|
||||||
#define __List_min_size 16
|
#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(cstr);
|
||||||
List_declare(u32);
|
List_declare(u32);
|
||||||
List_declare(u8);
|
List_declare(u8);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user