parent
e0429cf6ca
commit
e3cf5de1a9
@ -0,0 +1,22 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "vector.h"
|
||||||
|
|
||||||
|
extern void panic(const char* string, ...) _rc_attr((noreturn));
|
||||||
|
|
||||||
|
_rc_attr((noinline, noreturn, cold)) static void _fail_vec_alloc(size_t cap)
|
||||||
|
{
|
||||||
|
panic("vec_alloc(): malloc() failed to allocate %d bytes (cap %d)", sizeof(vec_t) + (cap * sizeof(vec_elem_t)), cap);
|
||||||
|
}
|
||||||
|
|
||||||
|
_rc_alloc_fn vec_t* _rc_restrict vec_alloc(size_t cap)
|
||||||
|
{
|
||||||
|
vec_t* vec = malloc(sizeof(vec_t) + (cap * sizeof(vec_elem_t)));
|
||||||
|
if(!vec) _fail_vec_alloc(cap);
|
||||||
|
vec-> cap = cap;
|
||||||
|
vec-> scap = cap;
|
||||||
|
vec-> len = 0;
|
||||||
|
|
||||||
|
return vec;
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
#ifndef _VECTOR_H
|
||||||
|
#define _VECTOR_H
|
||||||
|
|
||||||
|
#include <rc.h>
|
||||||
|
|
||||||
|
#define VEC_DEFAULT_CAP 16
|
||||||
|
|
||||||
|
|
||||||
|
typedef void* vec_elem_t;
|
||||||
|
typedef struct vec vec_t;
|
||||||
|
|
||||||
|
struct vec {
|
||||||
|
size_t scap;
|
||||||
|
|
||||||
|
size_t cap;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
vec_elem_t buffer[];
|
||||||
|
};
|
||||||
|
|
||||||
|
#define vec_new() vec_alloc(VEC_DEFAULT_CAP)
|
||||||
|
#define vec_free(vec) free(vec)
|
||||||
|
#define vec_tnptr(ty, elem) ((ty *)(elem))
|
||||||
|
|
||||||
|
vec_t* _rc_restrict vec_alloc(size_t cap) _rc_alloc_fn;
|
||||||
|
|
||||||
|
#endif /* _VECTOR_H */
|
Loading…
Reference in new issue