-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.c
49 lines (37 loc) · 1.21 KB
/
main.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
#include "arena.h"
static const uint64_t ALIGNMENT = 32;
int main()
{
Arena* a = ArenaAlloc(1024);
ArenaSetAutoAlign(a, ALIGNMENT);
uint64_t ptr = (uint64_t)ArenaPush(a, ALIGNMENT * 4 - 8); // offset by -8
assert(((uint64_t)ptr % ALIGNMENT) == 0);
uint64_t pos = ArenaPos(a);
assert((pos % ALIGNMENT) == (ALIGNMENT - 8));
ArenaPopTo(a, pos - 2);
pos = ArenaPos(a);
assert((pos % ALIGNMENT) == (ALIGNMENT - 10));
ArenaPop(a, (1 << 16));
assert(a->size == ARENA_MIN_SIZE);
pos = ArenaPos(a);
assert((uint64_t)&a->data == pos);
ArenaClear(a);
assert(a->size == ARENA_MIN_SIZE);
// check chaining
ArenaPush(a, 4096);
assert(a->next != NULL);
assert(a->size == a->capacity);
ArenaPop(a, 4090);
pos = ArenaPos(a->next);
assert((pos % a->autoalignment) == 6);
ArenaPopTo(a, (uint64_t)&a->data + a->capacity / 2);
assert(a->next->size == ARENA_MIN_SIZE);
assert(a->next->data == (uint64_t)&a->next->data);
pos = ArenaPos(a);
assert(pos == (uint64_t)&a->data + a->capacity / 2);
ArenaPopTo(a, (uint64_t)a);
assert(a->size == ARENA_MIN_SIZE);
assert(a->next->size == ARENA_MIN_SIZE);
ArenaRelease(a);
return 0;
}