Derive-C
Loading...
Searching...
No Matches
arena.c File Reference

Go to the source code of this file.

Data Structures

struct  example_data

Macros

#define INDEX_BITS   16
#define VALUE   struct example_data
#define VALUE_DELETE   example_data_delete
#define VALUE_DEBUG   example_data_debug
#define NAME   unstable_arena
#define NAME   dbg
#define CAPACITY   512
#define ALLOC   dbg
#define NAME   hybrid
#define INDEX_BITS   16
#define VALUE   struct example_data
#define VALUE_DELETE   example_data_delete
#define VALUE_DEBUG   example_data_debug
#define ALLOC   hybrid
#define NAME   custom_arena
#define INDEX_BITS   32
#define VALUE   struct example_data
#define VALUE_DELETE   example_data_delete
#define VALUE_DEBUG   example_data_debug
#define NAME   geometric_arena
#define KEY   geometric_arena_index_t
#define KEY_HASH   geometric_arena_index_hash
#define KEY_EQ   geometric_arena_index_eq
#define VALUE   struct example_data const*
#define NAME   index_to_data_map
#define INDEX_BITS   8
#define BLOCK_INDEX_BITS   2
#define VALUE   struct example_data
#define VALUE_DELETE   example_data_delete
#define VALUE_DEBUG   example_data_debug
#define NAME   chunked_arena

Functions

static void example_data_delete (struct example_data *self)
static void example_data_debug (struct example_data const *self, dc_debug_fmt fmt, FILE *stream)
static void example_unstable_arena (DC_LOGGER *parent)
static void example_custom_allocator_arena (DC_LOGGER *parent)
static size_t geometric_arena_index_hash (geometric_arena_index_t const *idx)
static bool geometric_arena_index_eq (geometric_arena_index_t const *a, geometric_arena_index_t const *b)
static void example_geometric_arena (DC_LOGGER *parent)
static void example_chunked_arena (DC_LOGGER *parent)
int main ()

Macro Definition Documentation

◆ ALLOC [1/2]

#define ALLOC   hybrid

Definition at line 63 of file arena.c.

◆ ALLOC [2/2]

#define ALLOC   dbg

Definition at line 63 of file arena.c.

◆ BLOCK_INDEX_BITS

#define BLOCK_INDEX_BITS   2

Definition at line 132 of file arena.c.

◆ CAPACITY

#define CAPACITY   512

Definition at line 62 of file arena.c.

◆ INDEX_BITS [1/4]

#define INDEX_BITS   8

Definition at line 28 of file arena.c.

◆ INDEX_BITS [2/4]

#define INDEX_BITS   32

Definition at line 28 of file arena.c.

◆ INDEX_BITS [3/4]

#define INDEX_BITS   16

Definition at line 28 of file arena.c.

◆ INDEX_BITS [4/4]

#define INDEX_BITS   16

Definition at line 28 of file arena.c.

◆ KEY

#define KEY   geometric_arena_index_t

Definition at line 104 of file arena.c.

◆ KEY_EQ

#define KEY_EQ   geometric_arena_index_eq

Definition at line 106 of file arena.c.

◆ KEY_HASH

#define KEY_HASH   geometric_arena_index_hash

Definition at line 105 of file arena.c.

◆ NAME [1/7]

#define NAME   chunked_arena

Definition at line 32 of file arena.c.

◆ NAME [2/7]

#define NAME   index_to_data_map

Definition at line 32 of file arena.c.

◆ NAME [3/7]

#define NAME   geometric_arena

Definition at line 32 of file arena.c.

◆ NAME [4/7]

#define NAME   custom_arena

Definition at line 32 of file arena.c.

◆ NAME [5/7]

#define NAME   hybrid

Definition at line 32 of file arena.c.

◆ NAME [6/7]

#define NAME   dbg

Definition at line 32 of file arena.c.

◆ NAME [7/7]

#define NAME   unstable_arena

Definition at line 32 of file arena.c.

◆ VALUE [1/5]

#define VALUE   struct example_data

Definition at line 29 of file arena.c.

◆ VALUE [2/5]

#define VALUE   struct example_data const*

Definition at line 29 of file arena.c.

◆ VALUE [3/5]

#define VALUE   struct example_data

Definition at line 29 of file arena.c.

◆ VALUE [4/5]

#define VALUE   struct example_data

Definition at line 29 of file arena.c.

◆ VALUE [5/5]

#define VALUE   struct example_data

Definition at line 29 of file arena.c.

◆ VALUE_DEBUG [1/4]

#define VALUE_DEBUG   example_data_debug

Definition at line 31 of file arena.c.

◆ VALUE_DEBUG [2/4]

#define VALUE_DEBUG   example_data_debug

Definition at line 31 of file arena.c.

◆ VALUE_DEBUG [3/4]

#define VALUE_DEBUG   example_data_debug

Definition at line 31 of file arena.c.

◆ VALUE_DEBUG [4/4]

#define VALUE_DEBUG   example_data_debug

Definition at line 31 of file arena.c.

◆ VALUE_DELETE [1/4]

#define VALUE_DELETE   example_data_delete

Definition at line 30 of file arena.c.

◆ VALUE_DELETE [2/4]

#define VALUE_DELETE   example_data_delete

Definition at line 30 of file arena.c.

◆ VALUE_DELETE [3/4]

#define VALUE_DELETE   example_data_delete

Definition at line 30 of file arena.c.

◆ VALUE_DELETE [4/4]

#define VALUE_DELETE   example_data_delete

Definition at line 30 of file arena.c.

Function Documentation

◆ example_chunked_arena()

void example_chunked_arena ( DC_LOGGER * parent)
static
Examples
container/arena.c.

Definition at line 139 of file arena.c.

139 {
140 DC_SCOPED(DC_LOGGER) log = DC_LOGGER_NEW(parent, "%s", __func__);
141 DC_STATIC_ASSERT(sizeof(chunked_arena_index_t) == sizeof(uint8_t), "Index size must be 8 bits");
142
143 DC_SCOPED(chunked_arena) arena = chunked_arena_new(stdalloc_get_ref());
144
145 DC_LOG(log, DC_INFO, "inserting X and Y");
146 chunked_arena_insert(&arena, (struct example_data){.description = strdup("X"), .value = 100});
147 chunked_arena_insert(&arena, (struct example_data){.description = strdup("Y"), .value = 200});
148}
#define DC_LOGGER
Definition file.h:168
#define DC_STATIC_ASSERT
Definition panic.h:22
#define DC_SCOPED(type,...)
RAII in C. Call the destructor when the variable goes out of scope.
Definition scope.h:5
#define DC_LOGGER_NEW(...)
Definition prelude.h:21
#define DC_LOG(...)
Definition prelude.h:20
@ DC_INFO
Definition trait.h:8

◆ example_custom_allocator_arena()

void example_custom_allocator_arena ( DC_LOGGER * parent)
static
Examples
container/arena.c.

Definition at line 75 of file arena.c.

75 {
76 DC_SCOPED(DC_LOGGER) log = DC_LOGGER_NEW(parent, "%s", __func__);
77 DC_SCOPED(dbg) debug_alloc = dbg_new("custom_arena", stdout, stdalloc_get_ref());
78 hybrid_buffer buf;
79 DC_SCOPED(hybrid) hybrid_alloc = hybrid_new(&buf, &debug_alloc);
80 DC_SCOPED(custom_arena) arena = custom_arena_new_with_capacity_for(3, &hybrid_alloc);
81
82 DC_LOG(log, DC_INFO, "inserting items A, B, C");
83 custom_arena_insert(&arena, (struct example_data){.description = strdup("A"), .value = 1});
84 custom_arena_insert(&arena, (struct example_data){.description = strdup("B"), .value = 2});
85 custom_arena_insert(&arena, (struct example_data){.description = strdup("C"), .value = 3});
86}

◆ example_data_debug()

void example_data_debug ( struct example_data const * self,
dc_debug_fmt fmt,
FILE * stream )
static
Examples
container/arena.c, utils/option.c, and utils/result.c.

Definition at line 19 of file arena.c.

19 {
20 fprintf(stream, "example_data@%p {\n", (void*)self);
21 fmt = dc_debug_fmt_scope_begin(fmt);
22 dc_debug_fmt_print(fmt, stream, "description: %s,\n", self->description);
23 dc_debug_fmt_print(fmt, stream, "value: %d,\n", self->value);
24 fmt = dc_debug_fmt_scope_end(fmt);
25 dc_debug_fmt_print(fmt, stream, "}");
26}
static DC_PUBLIC void dc_debug_fmt_print(dc_debug_fmt fmt, FILE *stream, const char *format,...)
Definition fmt.h:32
static DC_PUBLIC dc_debug_fmt dc_debug_fmt_scope_end(dc_debug_fmt fmt)
Definition fmt.h:57
static DC_PUBLIC dc_debug_fmt dc_debug_fmt_scope_begin(dc_debug_fmt fmt)
Definition fmt.h:50
static DC_PUBLIC FILE * stream(SELF *self)
Definition template.h:108

◆ example_data_delete()

void example_data_delete ( struct example_data * self)
static
Examples
container/arena.c, utils/option.c, and utils/result.c.

Definition at line 17 of file arena.c.

17{ free(self->description); }
char * description
Definition arena.c:13

◆ example_geometric_arena()

void example_geometric_arena ( DC_LOGGER * parent)
static
Examples
container/arena.c.

Definition at line 111 of file arena.c.

111 {
112 DC_SCOPED(DC_LOGGER) log = DC_LOGGER_NEW(parent, "%s", __func__);
113 DC_SCOPED(geometric_arena) arena = geometric_arena_new(stdalloc_get_ref());
114
115 DC_LOG(log, DC_INFO, "inserting Alpha, Beta, Gamma");
116 geometric_arena_index_t idx1 = geometric_arena_insert(
117 &arena, (struct example_data){.description = strdup("Alpha"), .value = 10});
118 geometric_arena_index_t idx2 = geometric_arena_insert(
119 &arena, (struct example_data){.description = strdup("Beta"), .value = 20});
120 geometric_arena_index_t idx3 = geometric_arena_insert(
121 &arena, (struct example_data){.description = strdup("Gamma"), .value = 30});
122
123 DC_SCOPED(index_to_data_map) map = index_to_data_map_new(stdalloc_get_ref());
124 index_to_data_map_insert(&map, idx1, geometric_arena_read(&arena, idx1));
125 index_to_data_map_insert(&map, idx2, geometric_arena_read(&arena, idx2));
126 index_to_data_map_insert(&map, idx3, geometric_arena_read(&arena, idx3));
127
128 DC_LOG(log, DC_INFO, "arena: %s", DC_DEBUG(geometric_arena_debug, &arena));
129}
#define DC_DEBUG(DEBUG_FN, DEBUG_PTR)
Definition dump.h:92

◆ example_unstable_arena()

void example_unstable_arena ( DC_LOGGER * parent)
static
Examples
container/arena.c.

Definition at line 35 of file arena.c.

35 {
36 DC_SCOPED(DC_LOGGER) log = DC_LOGGER_NEW(parent, "%s", __func__);
37 DC_SCOPED(unstable_arena) arena = unstable_arena_new_with_capacity_for(3, stdalloc_get_ref());
38
39 DC_LOG(log, DC_INFO, "inserting three items");
40 unstable_arena_insert(&arena,
41 (struct example_data){.description = strdup("First"), .value = 1});
42 unstable_arena_index_t idx2 = unstable_arena_insert(
43 &arena, (struct example_data){.description = strdup("Second"), .value = 2});
44 unstable_arena_insert(&arena,
45 (struct example_data){.description = strdup("Third"), .value = 3});
46
47 DC_FOR(unstable_arena, &arena, iter, entry) {
48 DC_LOG(log, DC_INFO, "entry at index %u: %s = %d", entry.index.index,
49 entry.value->description, entry.value->value);
50 }
51
52 DC_LOG(log, DC_INFO, "arena: %s", DC_DEBUG(unstable_arena_debug, &arena));
53
54 DC_LOG(log, DC_INFO, "removing second item");
55 struct example_data removed = unstable_arena_remove(&arena, idx2);
56 example_data_delete(&removed);
57}
static void example_data_delete(struct example_data *self)
Definition arena.c:17
#define DC_FOR(TYPE, INSTANCE, ITER, ITEM)
Definition for.h:13

◆ geometric_arena_index_eq()

bool geometric_arena_index_eq ( geometric_arena_index_t const * a,
geometric_arena_index_t const * b )
static
Examples
container/arena.c.

Definition at line 99 of file arena.c.

100 {
101 return a->index == b->index;
102}

◆ geometric_arena_index_hash()

size_t geometric_arena_index_hash ( geometric_arena_index_t const * idx)
static
Examples
container/arena.c.

Definition at line 95 of file arena.c.

95 {
96 return DC_DEFAULT_HASH(&idx->index);
97}
#define DC_DEFAULT_HASH(obj)
Definition default.h:15

◆ main()

int main ( )

Definition at line 150 of file arena.c.

150 {
152 root = NS(DC_LOGGER,
153 new_global)((NS(DC_LOGGER, global_config)){.stream = stdout, .ansi_colours = true},
154 (dc_log_id){"arena"});
155
160 return 0;
161}
static void example_custom_allocator_arena(DC_LOGGER *parent)
Definition arena.c:75
static void example_geometric_arena(DC_LOGGER *parent)
Definition arena.c:111
static void example_unstable_arena(DC_LOGGER *parent)
Definition arena.c:35
static void example_chunked_arena(DC_LOGGER *parent)
Definition arena.c:139
#define NS(pre, post)
Definition namespace.h:14