63 lines
1.7 KiB
C
Executable File
63 lines
1.7 KiB
C
Executable File
#pragma once
|
|
#include "../std.h"
|
|
|
|
/*
|
|
Pointer and length.
|
|
Can be initialized with {0}.
|
|
*/
|
|
|
|
#define Array(T) Array_##T
|
|
|
|
/// create Array(T) from array initializer list ({ a, b, c })
|
|
#define ARRAY(T, A...) ((Array(T)){ .data = ((T[])A), .len = sizeof((T[])A) / sizeof(T) })
|
|
|
|
#define Array_declare(T) \
|
|
typedef struct Array(T) { \
|
|
T* data; \
|
|
u32 len; \
|
|
} Array(T); \
|
|
\
|
|
static inline Array(T) Array_##T##_construct(T* data, u32 len) { \
|
|
return (Array(T)){ .data = data, .len = len }; \
|
|
} \
|
|
\
|
|
static inline Array(T) Array_##T##_alloc(u32 len){ \
|
|
if(len == 0) \
|
|
return Array_##T##_construct(NULL, 0); \
|
|
return Array_##T##_construct(malloc(len * sizeof(T)), len); \
|
|
} \
|
|
\
|
|
static inline void Array_##T##_realloc(Array(T)* self, u32 new_len){ \
|
|
self->data = (T*)realloc(self->data, new_len * sizeof(T)); \
|
|
self->len = new_len; \
|
|
} \
|
|
\
|
|
static inline Array(T) Array_##T##_copy(const Array(T) src){ \
|
|
Array(T) copy = Array_##T##_alloc(src.len); \
|
|
if(copy.data != NULL) \
|
|
memcpy(copy.data, src.data, src.len * sizeof(T)); \
|
|
return copy; \
|
|
} \
|
|
\
|
|
static inline void Array_##T##_destroy(Array(T)* self){ \
|
|
if(!self) \
|
|
return; \
|
|
free(self->data); \
|
|
} \
|
|
\
|
|
static inline void Array_##T##_memset(Array(T)* self, u32 value){ \
|
|
memset(self->data, value, self->len * sizeof(T)); \
|
|
} \
|
|
\
|
|
/* @return self[0..i-1] */ \
|
|
static inline Array(T) Array_##T##_sliceTo(const Array(T) src, u32 i){ \
|
|
return Array_##T##_construct(src.data, i); \
|
|
} \
|
|
\
|
|
/* @return self[i...] */ \
|
|
static inline Array(T) Array_##T##_sliceFrom(const Array(T) src, u32 i){ \
|
|
return Array_##T##_construct(src.data + i, src.len - i); \
|
|
} \
|
|
|
|
#define struct_castTo_Array_u8(STRUCT_PTR) Array_u8_construct((void*)(STRUCT_PTR), sizeof(*STRUCT_PTR))
|