summaryrefslogtreecommitdiffstats
path: root/src/lrhi.c
blob: 38eed3acc376e822506509a328f033a438eff94a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include "lrhi.h"

void *lrhi_allocator_allocate(struct lrhi_allocator *allocator,
                              ptrdiff_t size) {
  return allocator->allocate(size, allocator->ctx);
}
void lrhi_allocator_free(struct lrhi_allocator *allocator, ptrdiff_t size,
                         void *ptr) {
  allocator->free(ptr, size, allocator->ctx);
}

struct lrhi_arena {
  unsigned char *data;
  int allocated;
  int capacity;
};

lrhi_arena *lrhi_arena_create(struct lrhi_allocator *allocator,
                              ptrdiff_t arena_size) {
  lrhi_arena *arena = lrhi_allocator_allocate(allocator, sizeof(lrhi_arena));
  arena->data = lrhi_allocator_allocate(allocator, arena_size);
  arena->allocated = 0;
  arena->capacity = arena_size;
  return arena;
}
void lrhi_arena_destroy(struct lrhi_allocator *allocator, lrhi_arena *arena) {
  lrhi_allocator_free(allocator, arena->capacity, arena->data);
  lrhi_allocator_free(allocator, sizeof(lrhi_arena), arena);
}
void *lrhi_arena_allocate(lrhi_arena *arena, ptrdiff_t size) {
  if (arena->allocated + size > arena->capacity) {
    LRHI_PANIC("Arena is full, allocation failed");
  }

  unsigned char *ptr = arena->data + arena->allocated;
  arena->allocated += size;
  return ptr;
}
void lrhi_arena_reset(lrhi_arena *arena) { arena->allocated = 0; }

static void *arena_allocator_allocate(ptrdiff_t size, void *ctx) {
  return lrhi_arena_allocate((lrhi_arena *)ctx, size);
}

static void arena_allocator_free(void *ptr, ptrdiff_t size, void *ctx) {
  (void)ptr;
  (void)size;
  (void)ctx;
}

struct lrhi_allocator lrhi_arena_allocator(lrhi_arena *arena) {
  return (struct lrhi_allocator){.allocate = arena_allocator_allocate,
                                 .free = arena_allocator_free,
                                 .ctx = arena};
}
Go back to lisible.xyz