#pragma once #include "../std.h" typedef struct Array { void* data; u32 size; } Array; /// creates Array from a const array #define ARRAY(T, A...) Array_construct_size(((T[])A), sizeof((T[])A)) #define Array_construct(DATA, T, COUNT) Array_construct_size(DATA, (COUNT) * sizeof(T)) #define Array_construct_size(DATA, LEN) ((Array){ .data = (DATA), .size = (LEN) }) #define Array_alloc(T, COUNT) Array_alloc_size((COUNT) * sizeof(T)) static inline Array Array_alloc_size(u32 size){ return Array_construct_size(malloc(size), size); } #define Array_realloc(AR, T, COUNT) Array_realloc_size(AR, (COUNT) * sizeof(T)) static inline void Array_realloc_size(Array* ar, u32 new_size){ ar->data = realloc(ar->data, new_size); ar->size = new_size; } #define Array_len(AR, T) ((AR)->size / sizeof(T)) #define Array_memset(A, VAL) memset((A)->data, VAL, (A)->size) #define str_castTo_Array(S) Array_construct_size((S).data, (S).size) #define Array_castTo_str(S, IS_ZERO_TERMINATED) str_construct((S).data, (S).size, IS_ZERO_TERMINATED)