-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patharray.h
More file actions
81 lines (68 loc) · 4.08 KB
/
array.h
File metadata and controls
81 lines (68 loc) · 4.08 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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#pragma once
/******************************
*
* ARRAYLIST, SLICE, SEQUENCE
* MACRO IMPLEMENTATION
*
* ************************/
#define Slice(T) Slice_##T
#define decl_slice(T) \
typedef struct \
{ \
usize count; \
T *elements; \
} Slice(T)
#define seq_elem_type(seq) typeof(*(seq)->elements)
#define seq_start(seq) ((seq)->elements)
#define seq_end(seq) ((seq)->elements + (seq)->count)
#define seq_length(seq) ((seq)->count)
#define slice_make(T, start, count) ((Slice(T)){.count = (count), .elements = (start)})
#define slice_from_array(arr, low, high) \
((Slice(typeof(*(arr)->elements))){ \
.count = ((high) - (low)), \
.elements = seq_start(arr) + (low) \
})
#define for_each(seq, iter) \
for (seq_elem_type(seq) *(iter) = seq_start(seq); (iter) < seq_end(seq); (iter)++)
#define Array(T) Array_##T
#define generate_array_type(T) \
typedef struct \
{ \
usize count; \
usize capacity; \
T elements[]; \
} * Array(T); \
decl_slice(T)
#define array_total_size(arr) \
(sizeof(Array_Header) + ((arr)->capacity * sizeof(seq_elem_type(arr))))
typedef struct
{
usize count;
usize capacity;
} Array_Header;
static inline Array_Header *array_new(Array_Header *header, usize initial_size)
{
if (!header)
return NULL;
header->count = 0;
header->capacity = initial_size;
return header;
}
#define array_make(T, size) \
((Array(T))array_new(malloc(sizeof(Array_Header) + (size) * sizeof(T)), (size)))
#define array_free(arr) free(arr)
#define array_push(arr, value) \
do \
{ \
if ((arr)->count + 1 > (arr)->capacity) \
{ \
(arr)->capacity <<= 1; \
(arr) = realloc((arr), array_total_size(arr)); \
} \
(arr)->elements[(arr)->count++] = (value); \
} while (0)
#define array_start(arr) seq_start(arr)
#define array_end(arr) ((arr)->elements + ((arr)->count - 1))
#define array_at(arr, idx) ((arr)->elements[(idx)])
#define array_length(arr) seq_length(arr)
#define array_for_each(arr, el) for_each(arr, el)