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
|
#include "array.h"
#include "crash.h"
#include <string.h>
#include <stdlib.h>
#define CRASH_IF_OOB(array, len) {\
if (len > array.length)\
crash("Array access out of bounds: %ld > %ld\n", len, array.length);\
}
void* array_at(const array_t array, size_t idx) {
CRASH_IF_OOB(array, idx);
return (char*)array.__data + idx*array.elemsz;
}
array_t array_slice(const array_t array, size_t start, size_t length) {
CRASH_IF_OOB(array, start + length);
array_t slice = {
.length = length,
.__data = (char*)array.__data + start * array.elemsz
};
return slice;
}
array_t array_init(void* data, size_t length, size_t elemsz) {
array_t array = {.length = length, .elemsz = elemsz, .__data = data};
return array;
}
array_t array_heap_alloc(size_t length, size_t elemsz) {
void* data_ptr = calloc(length, elemsz);
if (data_ptr == NULL)
crash(
"Out of memory allocating %ld elements of size %ld\n",
length,
elemsz);
array_t container = {
.length = length,
.elemsz = elemsz,
.__data = data_ptr,
};
return container;
}
void array_heap_destroy(array_t array) {
free(array.__data);
}
|