List and Compiler

This commit is contained in:
2024-11-20 07:41:26 +05:00
parent a073d0ebd9
commit 1cae800a66
8 changed files with 409 additions and 62 deletions

41
src/collections/List.h Normal file
View File

@@ -0,0 +1,41 @@
#pragma once
#include "../std.h"
#define List_declare(T)\
typedef struct List_##T {\
T* data;\
u32 len;\
u32 max_len;\
} List_##T;\
\
static inline List_##T List_##T##_construct(T* data_ptr, u32 len, u32 max_len) {\
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(len > 0 ? malloc(len * sizeof(T)) : NULL, 0, 0);\
}\
\
void List_##T##_push(List_##T* ptr, T value);
#define List_define(T)\
void List_##T##_push(List_##T* ptr, T value){\
u32 max_len = ptr->max_len;\
if(ptr->len == max_len){\
max_len = 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 = realloc(ptr->data, max_len * sizeof(T));\
ptr->max_len = max_len;\
}\
ptr->data[ptr->len++] = value;\
}
#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) )