gwion-util
utilities for the Gwion project
Loading...
Searching...
No Matches
mp_vector.h File Reference

Go to the source code of this file.

Data Structures

struct  MP_Vector
 

Macros

#define new_mp_vector(mp, type, data)
 
#define free_mp_vector(mp, type, data)
 
#define mp_vector_add(mp, a, type, data)
 
#define mp_vector_at(a, type, index)
 
#define mp_vector_set(a, type, index, data)
 
#define mp_vector_pop(a, type)
 
#define mp_vector_rem(a, type, idx)
 
#define mp_vector_rem2(a, type, data)
 
#define mp_vector_back(a, type)
 
#define MK_VECTOR_TYPE(Type, type, ...)
 

Typedefs

typedef struct MP_Vector MP_Vector
 

Functions

static ANN void mp_vector_resize (const MemPool mp, MP_Vector **ap, const uint32_t size, const uint32_t cap)
 
ANN MP_Vectornew_mp_vector (const MemPool mp, const uint32_t size, const uint32_t len)
 
static ANN void free_mp_vector (const MemPool mp, const uint32_t size, MP_Vector *a)
 
static uint32_t mp_vector_len (MP_Vector *a)
 
static ANN void mp_vector_rem (MP_Vector *const a, const uint32_t size, const uint32_t idx)
 
static ANN m_bitmp_vector_pop (MP_Vector *const a, const uint32_t size)
 

Macro Definition Documentation

◆ free_mp_vector

#define free_mp_vector ( mp,
type,
data )
Value:
free_mp_vector(mp, sizeof(type), data)
#define free_mp_vector(mp, type, data)
Definition mp_vector.h:29

Definition at line 29 of file mp_vector.h.

29#define free_mp_vector(mp, type, data) \
30 free_mp_vector(mp, sizeof(type), data)

◆ MK_VECTOR_TYPE

#define MK_VECTOR_TYPE ( Type,
type,
... )

Definition at line 74 of file mp_vector.h.

74#define MK_VECTOR_TYPE(Type, type, ...) \
75typedef struct Type##List { \
76 __VA_ARGS__ ; \
77 uint32_t len; \
78 uint32_t cap; \
79 Type ptr[]; \
80} Type##List; \
81/*typedef MP_Vector Type##List;*/ \
82ANN static inline Type##List *new_##type##list(const MemPool mp, const uint32_t len) { \
83 return (Type##List*)new_mp_vector(mp, Type, len); \
84} \
85ANN static inline void free_##type##list(const MemPool mp, Type##List *v) { \
86 mp_free2(mp, sizeof(Type##List) + (m_uint)(v->cap * sizeof(Type)), v); \
87} \
88ANN static inline void type##list_resize(const MemPool mp, Type##List **ap, \
89 const uint32_t cap) { \
90 return mp_vector_resize(mp, (MP_Vector**)ap, sizeof(Type), cap); \
91} \
92ANN static inline Type type##list_at(const Type##List *v, const uint32_t index) { \
93 return v->ptr[index]; \
94} \
95ANN static inline Type* type##list_ptr_at(Type##List *v, const uint32_t index) { \
96 return v->ptr + index; \
97} \
98ANN static inline void type##list_set(Type##List *v, const uint32_t index, \
99 Type data) { \
100 v->ptr[index] = data; \
101} \
102ANN static inline void type##list_add(const MemPool mp, Type##List **v, \
103 Type data) { \
104 mp_vector_add(mp, (MP_Vector**)v, Type, data); \
105} \
106static inline uint32_t type##list_len(const Type##List *a) { \
107 return a ? a->len : 0; \
108} \
109ANN static inline Type type##list_back(const Type##List *a) { \
110 return a->ptr[a->len-1]; \
111}

◆ mp_vector_add

#define mp_vector_add ( mp,
a,
type,
data )
Value:
{ \
if (++((*a))->len >= ((*a))->cap) \
mp_vector_resize(mp, (a), sizeof(type), (*(a))->cap * 2); \
*(type*)((*(a))->ptr + ((*a)->len - 1) * sizeof(type)) = (data); }\

Definition at line 32 of file mp_vector.h.

32#define mp_vector_add(mp, a, type, data) { \
33 if (++((*a))->len >= ((*a))->cap) \
34 mp_vector_resize(mp, (a), sizeof(type), (*(a))->cap * 2); \
35 *(type*)((*(a))->ptr + ((*a)->len - 1) * sizeof(type)) = (data); }\
36

◆ mp_vector_at

#define mp_vector_at ( a,
type,
index )
Value:
((type*)((a)->ptr + (index) * sizeof(type)))

Definition at line 37 of file mp_vector.h.

37#define mp_vector_at(a, type, index) \
38 ((type*)((a)->ptr + (index) * sizeof(type)))

◆ mp_vector_back

#define mp_vector_back ( a,
type )
Value:
((type*)((a)->ptr + (a->len-1) * sizeof(type)))

Definition at line 71 of file mp_vector.h.

71#define mp_vector_back(a, type) \
72 ((type*)((a)->ptr + (a->len-1) * sizeof(type)))

◆ mp_vector_pop

#define mp_vector_pop ( a,
type )
Value:
((type*)mp_vector_pop(a, sizeof(type)))
#define mp_vector_pop(a, type)
Definition mp_vector.h:57

Definition at line 57 of file mp_vector.h.

57#define mp_vector_pop(a, type) \
58 ((type*)mp_vector_pop(a, sizeof(type)))

◆ mp_vector_rem

#define mp_vector_rem ( a,
type,
idx )
Value:
mp_vector_rem(a, sizeof(type), idx)
#define mp_vector_rem(a, type, idx)
Definition mp_vector.h:60

Definition at line 60 of file mp_vector.h.

60#define mp_vector_rem(a, type, idx) \
61 mp_vector_rem(a, sizeof(type), idx)

◆ mp_vector_rem2

#define mp_vector_rem2 ( a,
type,
data )
Value:
for(uint32_t i = 0; i < a->len; i++) { \
if(data == mp_vector_at(a, type, i)) { \
mp_vector_rem(a, type, i); \
break; \
} \
}
#define mp_vector_at(a, type, index)
Definition mp_vector.h:37

Definition at line 63 of file mp_vector.h.

63#define mp_vector_rem2(a, type, data) \
64 for(uint32_t i = 0; i < a->len; i++) { \
65 if(data == mp_vector_at(a, type, i)) { \
66 mp_vector_rem(a, type, i); \
67 break; \
68 } \
69 }

◆ mp_vector_set

#define mp_vector_set ( a,
type,
index,
data )
Value:
*(type*)((a)->ptr + (index) * sizeof(type)) = (data)

Definition at line 40 of file mp_vector.h.

40#define mp_vector_set(a, type, index, data) \
41 *(type*)((a)->ptr + (index) * sizeof(type)) = (data)

◆ new_mp_vector

#define new_mp_vector ( mp,
type,
data )
Value:
new_mp_vector(mp, sizeof(type), data)
#define new_mp_vector(mp, type, data)
Definition mp_vector.h:26

Definition at line 26 of file mp_vector.h.

26#define new_mp_vector(mp, type, data) \
27 new_mp_vector(mp, sizeof(type), data)

Typedef Documentation

◆ MP_Vector

typedef struct MP_Vector MP_Vector

Function Documentation

◆ free_mp_vector()

static ANN void free_mp_vector ( const MemPool mp,
const uint32_t size,
MP_Vector * a )
inlinestatic

Definition at line 18 of file mp_vector.h.

18 {
19 mp_free2(mp, sizeof(MP_Vector) + (m_uint)(a->cap * size), a);
20}
uintptr_t m_uint
Definition gwcommon.h:11
#define mp_free2(p, sz, a)
Definition mpool.h:28
uint32_t cap
Definition mp_vector.h:6

◆ mp_vector_len()

static uint32_t mp_vector_len ( MP_Vector * a)
inlinestatic

Definition at line 22 of file mp_vector.h.

22 {
23 return a ? a->len : 0;
24}
uint32_t len
Definition mp_vector.h:5

◆ mp_vector_pop()

static ANN m_bit * mp_vector_pop ( MP_Vector *const a,
const uint32_t size )
inlinestatic

Definition at line 52 of file mp_vector.h.

52 {
53 m_bit *data = ((a)->ptr + (a->len--) * size);
54 return data;
55}
unsigned char m_bit
Definition gwcommon.h:12

◆ mp_vector_rem()

static ANN void mp_vector_rem ( MP_Vector *const a,
const uint32_t size,
const uint32_t idx )
inlinestatic

Definition at line 43 of file mp_vector.h.

43 {
44 if (idx >= a->len) return;
45 if (idx < a->len - 1) {
46 const size_t len = a->len - idx - 1;
47 memmove(a->ptr + idx, a->ptr + idx + OFFSET + 1,
48 len * size);
49 }
50}
#define OFFSET
Definition container.h:9
uint8_t ptr[]
Definition mp_vector.h:7

◆ mp_vector_resize()

static ANN void mp_vector_resize ( const MemPool mp,
MP_Vector ** ap,
const uint32_t size,
const uint32_t cap )
inlinestatic

Definition at line 10 of file mp_vector.h.

10 {
11 MP_Vector *a = *ap;
12 *ap = (MP_Vector *)mp_realloc(mp, a, sizeof(MP_Vector) + (m_uint)(a->cap * size), sizeof(MP_Vector) + (m_uint)(cap * size));
13 (*ap)->cap = cap;
14}
void * mp_realloc(MemPool mp, void *ptr, const m_uint curr, const m_uint next)
Definition mpool.c:148

◆ new_mp_vector()

ANN MP_Vector * new_mp_vector ( const MemPool mp,
const uint32_t size,
const uint32_t len )

Definition at line 3 of file mp_vector.c.

3 {
4 m_uint cap = 1;
5 while (cap < len) cap *= 2;
6 const size_t sz = cap * size;
7 MP_Vector *a = (MP_Vector *)mp_malloc2(mp, sizeof(MP_Vector) + sz);
8 a->cap = cap;
9 a->len = len;
10 return a;
11}
#define mp_malloc2(p, sz)
Definition mpool.h:30