Examples using arenas with different index sizes.
Examples using arenas with different index sizes.
#include <stdio.h>
#include <stdlib.h>
#define INDEX_BITS 32
#define VALUE uint32_t
#define NAME ints
ints arena = ints_new_with_capacity_for(12, stdalloc_get());
ints_insert(&arena, 23);
ints_insert(&arena, 42);
ints_insert(&arena, 1000);
ints_insert(&arena, 1001);
{
FOR(ints, &arena, iter, entry) {
printf("entry for %d at %d\n", *entry.value, entry.index.index);
}
}
{
FOR(ints, &arena, iter, entry) {
printf("incrementing for %d = %d + 1 at %d\n", *entry.value, *entry.value,
entry.index.index);
*entry.value += 1;
}
}
ints_delete(&arena);
}
};
(void)fmt;
fprintf(
stream,
"foo@%p { x: %d, y: \"%s\", owned_data: @%p { %d }, }", self, self->
x, self->
y,
}
int* v = (
int*)
malloc(
sizeof(
int));
*v = value;
return v;
}
#define INDEX_BITS 8
#define VALUE struct foo
#define VALUE_DELETE my_foo_delete
#define VALUE_DEBUG foo_debug
#define NAME foo_arena
foo_arena arena = foo_arena_new_with_capacity_for(12, stdalloc_get());
foo_arena_index_t index_a =
foo_arena_insert(&arena, (
struct foo){.x = 42, .y =
"A", .owned_data =
new_owned_int(3)});
foo_arena_index_t index_b =
foo_arena_insert(&arena, (
struct foo){.x = 41, .y =
"B", .owned_data =
new_owned_int(5)});
DC_ASSERT(foo_arena_read(&arena, index_a)->x == 42);
DC_ASSERT(foo_arena_read(&arena, index_b)->x == 41);
foo_arena_write(&arena, index_b)->x = 100;
DC_ASSERT(foo_arena_read(&arena, index_b)->x == 100);
struct foo entry_a = foo_arena_remove(&arena, index_a);
foo_arena_delete(&arena);
}
}
static void free(SELF *self, void *ptr)
static void * malloc(SELF *self, size_t size)
int * new_owned_int(int value)
void foo_debug(struct foo const *self, dc_debug_fmt fmt, FILE *stream)
void my_foo_delete(struct foo *self)
static dc_debug_fmt dc_debug_fmt_new()
#define FOR(TYPE, INSTANCE, ITER, ITEM)
#define DC_ASSERT(expr,...)
Debug format helpers for debug printin data structures.
static FILE * stream(SELF *self)
Opens a file for.