20 fprintf(
stream,
"example_data@%p {\n", (
void*)self);
29#define VALUE struct example_data
30#define VALUE_DELETE example_data_delete
31#define VALUE_DEBUG example_data_debug
32#define NAME unstable_arena
37 DC_SCOPED(unstable_arena) arena = unstable_arena_new_with_capacity_for(3, stdalloc_get_ref());
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});
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);
55 struct example_data removed = unstable_arena_remove(&arena, idx2);
68#define VALUE struct example_data
69#define VALUE_DELETE example_data_delete
70#define VALUE_DEBUG example_data_debug
72#define NAME custom_arena
77 DC_SCOPED(dbg) debug_alloc = dbg_new(
"custom_arena", stdout, stdalloc_get_ref());
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);
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});
89#define VALUE struct example_data
90#define VALUE_DELETE example_data_delete
91#define VALUE_DEBUG example_data_debug
92#define NAME geometric_arena
100 geometric_arena_index_t
const* b) {
101 return a->index == b->index;
104#define KEY geometric_arena_index_t
105#define KEY_HASH geometric_arena_index_hash
106#define KEY_EQ geometric_arena_index_eq
107#define VALUE struct example_data const*
108#define NAME index_to_data_map
113 DC_SCOPED(geometric_arena) arena = geometric_arena_new(stdalloc_get_ref());
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});
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));
132#define BLOCK_INDEX_BITS 2
133#define VALUE struct example_data
134#define VALUE_DELETE example_data_delete
135#define VALUE_DEBUG example_data_debug
136#define NAME chunked_arena
141 DC_STATIC_ASSERT(
sizeof(chunked_arena_index_t) ==
sizeof(uint8_t),
"Index size must be 8 bits");
143 DC_SCOPED(chunked_arena) arena = chunked_arena_new(stdalloc_get_ref());
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});
153 new_global)((
NS(
DC_LOGGER, global_config)){.stream = stdout, .ansi_colours =
true},
static void example_data_debug(struct example_data const *self, dc_debug_fmt fmt, FILE *stream)
static size_t geometric_arena_index_hash(geometric_arena_index_t const *idx)
static void example_custom_allocator_arena(DC_LOGGER *parent)
static void example_data_delete(struct example_data *self)
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_unstable_arena(DC_LOGGER *parent)
static void example_chunked_arena(DC_LOGGER *parent)
#define DC_DEFAULT_HASH(obj)
#define DC_DEBUG(DEBUG_FN, DEBUG_PTR)
static DC_PUBLIC void dc_debug_fmt_print(dc_debug_fmt fmt, FILE *stream, const char *format,...)
static DC_PUBLIC dc_debug_fmt dc_debug_fmt_scope_end(dc_debug_fmt fmt)
static DC_PUBLIC dc_debug_fmt dc_debug_fmt_scope_begin(dc_debug_fmt fmt)
#define DC_FOR(TYPE, INSTANCE, ITER, ITEM)
#define DC_SCOPED(type,...)
RAII in C. Call the destructor when the variable goes out of scope.
Debug format helpers for debug printin data structures.
#define DC_LOGGER_NEW(...)
static DC_PUBLIC FILE * stream(SELF *self)