51 lines
1.5 KiB
C
Executable File
51 lines
1.5 KiB
C
Executable File
#pragma once
|
|
#include "../std.h"
|
|
|
|
#define Array(T) Array_
|
|
|
|
typedef struct Array_ {
|
|
void* data;
|
|
u32 size;
|
|
} Array_;
|
|
|
|
/// creates Array_ from self 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(SELF, T, COUNT) Array_realloc_size(SELF, (COUNT) * sizeof(T))
|
|
|
|
static inline void Array_realloc_size(Array_* self, u32 new_size){
|
|
self->data = realloc(self->data, new_size);
|
|
self->size = new_size;
|
|
}
|
|
|
|
static inline Array_ Array_copy(const Array_ self){
|
|
Array_ copy = Array_alloc_size(self.size);
|
|
if(copy.data != NULL)
|
|
memcpy(copy.data, self.data, self.size);
|
|
return copy;
|
|
}
|
|
|
|
#define Array_len(SELF, T) (SELF.size / sizeof(T))
|
|
#define Array_memset(SELF, VAL) memset(SELF.data, VAL, SELF.size)
|
|
|
|
#define struct_castTo_Array(STRUCT_PTR) Array_construct_size((STRUCT_PTR), sizeof(*STRUCT_PTR))
|
|
|
|
///@return self[0..i-1]
|
|
static inline Array(u8) Array_sliceTo(const Array(u8) self, u32 i){
|
|
return Array_construct_size(self.data, i);
|
|
}
|
|
|
|
///@return self[i...]
|
|
static inline Array(u8) Array_sliceFrom(const Array(u8) self, u32 i){
|
|
return Array_construct_size((u8*)self.data + i, self.size - i);
|
|
}
|