-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patharr.h
82 lines (73 loc) · 1.61 KB
/
arr.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#ifndef _lib_arr_h_
#define _lib_arr_h_
#include <stdlib.h>
#include <string.h>
static inline
void *
arr_alloc(size_t size, size_t len)
{
size_t mem;
mem = size * len + sizeof (size_t);
return (size_t*)calloc(1, mem) + 1;
}
static inline
void
arr_free(void *a)
{
free((size_t *)a - 1);
}
static inline
size_t
arr_len(void const *a)
{
size_t ret;
memcpy(&ret, (size_t *)a - 1, sizeof ret);
return ret;
}
static inline
void *
arr_peek(void const *a, size_t size)
{
return (char *)a + (arr_len(a) - 1) * size;
}
static inline
void
arr_get(void *dst, void *src, size_t size)
{
memcpy(dst,(char *)src+(arr_len(src)-1)*size, size);
memset((char*)src+(arr_len(src)-1)*size, 0, size);
memcpy((char*)src - sizeof (size_t),
(size_t[]){arr_len(src)-1},
sizeof (size_t));
}
static inline
void
arr_put(void *dst, void const *src, size_t size)
{
memcpy((char *)dst + arr_len(dst) * size, src, size);
memcpy((char *)dst - sizeof (size_t),
(size_t[]){arr_len(dst)+1},
sizeof (size_t));
}
static inline
void
arr_pop(void *dst, void *src, size_t size)
{
char tmp[size];
arr_get(tmp, src, size);
arr_put(dst, tmp, size);
}
static inline
void
arr_rm(void *a, size_t w, size_t z)
{
memmove((char*)a+w*z, (char*)a+w*z+z, arr_len(a)-w-1);
memcpy((size_t*)a-1, (size_t[]){arr_len(a)-1},sizeof (size_t));
}
#define arr_cat(d, s) arr_cat(d, s, sizeof *d)
#define arr_get(d, s) arr_get(d, s, sizeof *s)
#define arr_pop(d, s) arr_pop(d, s, sizeof *d)
#define arr_put(d, s) arr_put(d, s, sizeof *d)
#define arr_peek(a) arr_peek(a, sizeof *a)
#define arr_rm(a, w) arr_rm(a, w, sizeof *a)
#endif /* _lib_arr_h_ */