Derive-C
Loading...
Searching...
No Matches
arena.c
Go to the documentation of this file.
1
4
5#include <assert.h>
6#include <stdio.h>
7#include <stdlib.h>
8
10
11#define INDEX_BITS 32
12#define V uint32_t
13#define SELF ints
15
17 ints arena = ints_new_with_capacity_for(12, stdalloc_get());
18 ints_insert(&arena, 23);
19 ints_insert(&arena, 42);
20 ints_insert(&arena, 1000);
21 ints_insert(&arena, 1001);
22
23 assert(ints_size(&arena) == 4);
24 {
25 ints_iter_const print_ints = ints_get_iter_const(&arena);
26 ints_iv_const const* entry = NULL;
27 while ((entry = ints_iter_const_next(&print_ints))) {
28 printf("entry for %d at %d\n", *entry->value, entry->index.index);
29 }
30 }
31
32 {
33 ints_iter inc_ints = ints_get_iter(&arena);
34 ints_iv const* entry = NULL;
35 while ((entry = ints_iter_next(&inc_ints))) {
36 printf("incrementing for %d = %d + 1 at %d\n", *entry->value, *entry->value,
37 entry->index.index);
38 *entry->value += 1;
39 }
40 }
41
42 ints_delete(&arena);
43}
44
45struct foo {
46 int x;
47 char const* y;
49};
50
51void my_foo_delete(struct foo* self) { free(self->owned_data); }
52
53#define INDEX_BITS 8
54#define V struct foo
55#define V_DELETE my_foo_delete
56#define SELF foo_arena
58
60 foo_arena arena = foo_arena_new_with_capacity_for(12, stdalloc_get());
61 foo_arena_index index_a = foo_arena_insert(
62 &arena, (struct foo){.x = 42, .y = "A", .owned_data = (int*)malloc(sizeof(int))});
63 foo_arena_index index_b = foo_arena_insert(
64 &arena, (struct foo){.x = 41, .y = "B", .owned_data = (int*)malloc(sizeof(int))});
65
66 assert(foo_arena_size(&arena) == 2);
67 assert(foo_arena_full(&arena) == false);
68 assert(foo_arena_read(&arena, index_a)->x == 42);
69 assert(foo_arena_read(&arena, index_b)->x == 41);
70
71 foo_arena_write(&arena, index_b)->x = 100;
72 assert(foo_arena_read(&arena, index_b)->x == 100);
73
74 // we remove the entry, improtantly - we now own this data
75 struct foo entry_a = foo_arena_remove(&arena, index_a);
76
77 // entry_b was deleted
78 foo_arena_delete(&arena);
79
80 // entry a has not yet been deleted, so we can still access and then delete it
81 assert(entry_a.x == 42);
82
83 my_foo_delete(&entry_a);
84}
85
86int main() {
89}
static void free(SELF *self, void *ptr)
Definition template.h:62
static void * malloc(SELF *self, size_t size)
Definition template.h:29
void foo_example()
Definition arena.c:59
void my_foo_delete(struct foo *self)
Definition arena.c:51
void int_example()
Definition arena.c:16
int main()
Definition arena.c:86
Definition arena.c:45
int x
Definition arena.c:46
int * owned_data
Definition arena.c:48
char const * y
Definition arena.c:47