Derive-C
Loading...
Searching...
No Matches
basic.c
Go to the documentation of this file.
1
4
5#include <stdio.h>
6#include <stdlib.h>
7
9
10#include <derive-c/alloc/std.h>
12
13#define INDEX_BITS 32
14#define VALUE uint32_t
15#define NAME ints
17
19 ints arena = ints_new_with_capacity_for(12, stdalloc_get());
20 ints_insert(&arena, 23);
21 ints_insert(&arena, 42);
22 ints_insert(&arena, 1000);
23 ints_insert(&arena, 1001);
24
25 DC_ASSERT(ints_size(&arena) == 4);
26 {
27 FOR(ints, &arena, iter, entry) {
28 printf("entry for %d at %d\n", *entry.value, entry.index.index);
29 }
30 }
31
32 {
33 FOR(ints, &arena, iter, entry) {
34 printf("incrementing for %d = %d + 1 at %d\n", *entry.value, *entry.value,
35 entry.index.index);
36 *entry.value += 1;
37 }
38 }
39
40 ints_debug(&arena, dc_debug_fmt_new(), stdout);
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
53void foo_debug(struct foo const* self, dc_debug_fmt fmt, FILE* stream) {
54 (void)fmt;
55 fprintf(stream, "foo@%p { x: %d, y: \"%s\", owned_data: @%p { %d }, }", self, self->x, self->y,
56 self->owned_data, *self->owned_data);
57}
58
59int* new_owned_int(int value) {
60 int* v = (int*)malloc(sizeof(int));
61 *v = value;
62 return v;
63}
64
65#define INDEX_BITS 8
66#define VALUE struct foo
67#define VALUE_DELETE my_foo_delete
68#define VALUE_DEBUG foo_debug
69#define NAME foo_arena
71
73 foo_arena arena = foo_arena_new_with_capacity_for(12, stdalloc_get());
74 foo_arena_index_t index_a =
75 foo_arena_insert(&arena, (struct foo){.x = 42, .y = "A", .owned_data = new_owned_int(3)});
76 foo_arena_index_t index_b =
77 foo_arena_insert(&arena, (struct foo){.x = 41, .y = "B", .owned_data = new_owned_int(5)});
78
79 DC_ASSERT(foo_arena_size(&arena) == 2);
80 DC_ASSERT(foo_arena_full(&arena) == false);
81 DC_ASSERT(foo_arena_read(&arena, index_a)->x == 42);
82 DC_ASSERT(foo_arena_read(&arena, index_b)->x == 41);
83
84 foo_arena_write(&arena, index_b)->x = 100;
85 DC_ASSERT(foo_arena_read(&arena, index_b)->x == 100);
86
87 foo_arena_debug(&arena, dc_debug_fmt_new(), stdout);
88
89 // we remove the entry, importantly - we now own this data
90 struct foo entry_a = foo_arena_remove(&arena, index_a);
91
92 // entry_b was deleted
93 foo_arena_delete(&arena);
94
95 // entry a has not yet been deleted, so we can still access and then delete it
96 DC_ASSERT(entry_a.x == 42);
97
98 my_foo_delete(&entry_a);
99}
100
101int main() {
102 int_example();
103 foo_example();
104}
static void free(SELF *self, void *ptr)
Definition template.h:56
static void * malloc(SELF *self, size_t size)
Definition template.h:23
int * new_owned_int(int value)
Definition basic.c:59
void foo_example()
Definition basic.c:72
void foo_debug(struct foo const *self, dc_debug_fmt fmt, FILE *stream)
Definition basic.c:53
void my_foo_delete(struct foo *self)
Definition basic.c:51
void int_example()
Definition basic.c:18
int main()
Definition basic.c:101
static dc_debug_fmt dc_debug_fmt_new()
Definition fmt.h:14
#define FOR(TYPE, INSTANCE, ITER, ITEM)
Definition for.h:9
#define DC_ASSERT(expr,...)
Definition panic.h:36
Debug format helpers for debug printin data structures.
Definition fmt.h:10
Definition basic.c:45
int x
Definition basic.c:46
int * owned_data
Definition basic.c:48
char const * y
Definition basic.c:47
static FILE * stream(SELF *self)
Opens a file for.
Definition template.h:107