-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathArray.c
More file actions
57 lines (44 loc) · 1.11 KB
/
Array.c
File metadata and controls
57 lines (44 loc) · 1.11 KB
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
#include "Array.h"
void array_add(Array *r, void *e) {
if (r->usage == r->capacity) {
r->capacity *= 2;
r->data = (void **)realloc(r->data, r->capacity * sizeof(void *));
}
r->data[r->usage++] = e;
}
void array_delete(Array *r, void (*valuefreefunc)(void *)) {
if (valuefreefunc != NULL) {
for (int i = 0; i < array_size(r); i++) {
valuefreefunc(array_get(r, i));
}
}
free(r->data);
r->data = NULL;
r->capacity = r->usage = 0;
free(r);
r = NULL;
}
void *array_get(Array *r, int index) {
assert(index < r->usage);
return r->data[index];
}
Array *array_new() {
Array *r = (Array *)malloc( sizeof(Array) );
r->capacity = INITIAL_ARRAY_SIZE;
r->usage = 0;
r->data = (void **)malloc(r->capacity * sizeof(void *));
return r;
}
size_t array_size(Array *r) {
return r->usage;
}
Array *array_concat(Array *first, Array *second) {
Array *joined = array_new();
for (int i = 0; i < array_size(first); i++) {
array_add(joined, array_get(first, i));
}
for (int i = 0; i < array_size(second); i++) {
array_add(joined, array_get(second, i));
}
return joined;
}