-
Notifications
You must be signed in to change notification settings - Fork 4
/
varray.c
109 lines (89 loc) · 1.78 KB
/
varray.c
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <math.h>
#include <stdlib.h>
#include <assert.h>
#include "varray.h"
#define MIN_ALLOC 16
struct varray {
int size;
int alloc;
void **data;
};
varray_t *
varray_create(void)
{
varray_t *va = calloc (1, sizeof(*va));
return va;
}
void
varray_destroy (varray_t *va)
{
if (va->data != NULL)
free (va->data);
free (va);
}
int
varray_size (varray_t *va)
{
return va->size;
}
void
varray_add (varray_t *va, void *p)
{
if (va->size == va->alloc) {
int newalloc = va->alloc*2;
if (newalloc < MIN_ALLOC)
newalloc = MIN_ALLOC;
va->data = realloc(va->data, sizeof(void*)*newalloc);
va->alloc = newalloc;
}
va->data[va->size] = p;
va->size++;
}
void *
varray_get (varray_t *va, int idx)
{
assert (idx < va->size);
return va->data[idx];
}
void *
varray_remove (varray_t *va, int idx)
{
assert (idx >= 0 && idx < va->size);
void *p = va->data[idx];
for (int i = idx+1; i < va->size; i++)
va->data[i-1] = va->data[i];
va->size--;
return p;
}
void *
varray_remove_shuffle (varray_t *va, int idx)
{
assert (idx >= 0 && idx < va->size);
void *p = va->data[idx];
va->data[idx] = va->data[va->size-1];
va->size--;
return p;
}
void
varray_remove_value (varray_t *va, void *d)
{
int outpos = 0;
for (int inpos = 0; inpos < va->size; inpos++) {
if (va->data[inpos] == d)
continue;
va->data[outpos] = va->data[inpos];
outpos++;
}
va->size = outpos;
}
void
varray_map (varray_t *va, void (*f)())
{
for (int i = 0; i < varray_size(va); i++)
f(varray_get(va, i));
}
void
varray_sort (varray_t *va, int (*compare)(const void *, const void *))
{
qsort (va->data, va->size, sizeof(void*), compare);
}