53 lines
1.2 KiB
C
53 lines
1.2 KiB
C
// vector.h
|
|
#ifndef __SMCC_DS_VECTOR_H__
|
|
#define __SMCC_DS_VECTOR_H__
|
|
|
|
#include <lib/rt/rt.h>
|
|
|
|
#define vector_header(name, type) \
|
|
struct { \
|
|
rt_size_t size; \
|
|
rt_size_t cap; \
|
|
type *data; \
|
|
} name \
|
|
|
|
// You can't malloc at init function becase some user just need a header
|
|
#define vector_init(vec) \
|
|
do { \
|
|
(vec).size = 0, \
|
|
(vec).cap = 0, \
|
|
(vec).data = 0; \
|
|
} while(0)
|
|
|
|
#define vector_push(vec, value) \
|
|
do { \
|
|
if (vec.size >= vec.cap) { \
|
|
int cap = vec.cap ? vec.cap * 2 : 8; \
|
|
void* data = salloc_realloc(vec.data, cap * sizeof(*vec.data)); \
|
|
if (!data) { \
|
|
LOG_FATAL("vector_push: rt_realloc failed\n"); \
|
|
} \
|
|
(vec).cap = cap; \
|
|
(vec).data = data; \
|
|
} \
|
|
(vec).data[(vec).size++] = value; \
|
|
} while(0)
|
|
|
|
#define vector_pop(vec) \
|
|
((vec).data[--(vec).size])
|
|
|
|
#define vector_at(vec, idx) \
|
|
(((vec).data)[idx])
|
|
|
|
#define vector_idx(vec, ptr) \
|
|
((ptr) - (vec).data)
|
|
|
|
#define vector_free(vec) \
|
|
do { \
|
|
salloc_free((vec).data); \
|
|
(vec).data = NULL; \
|
|
(vec).size = (vec).cap = 0; \
|
|
} while(0)
|
|
|
|
#endif
|