kiba-engine
id.c
1 #include <kiba/containers/array.h>
2 #include <kiba/core/id.h>
3 #include <kiba/core/memory.h>
4 
6  identifier max;
7  array_of(identifier) returned;
8  allocator *alloc;
9 };
10 
11 b8 id_generator_create(id_generator *generator, allocator *alloc) {
12  struct kb_id_generator *new_generator = allocator_allocate_aligned(alloc, sizeof(struct kb_id_generator), 8);
13  if (!new_generator) {
14  KB_ERROR("could not allocate new id generator");
15  return false;
16  }
17  new_generator->max = 0;
18  new_generator->alloc = alloc;
19  new_generator->returned = array_create(identifier, 64, alloc);
20  if (!new_generator->returned) {
21  KB_ERROR("could not allocate storage for returned ids");
22  id_generator_destroy(new_generator);
23  return false;
24  }
25  *generator = new_generator;
26  return true;
27 }
28 
29 void id_generator_destroy(id_generator generator) {
30  if (generator->returned) {
31  array_destroy(&generator->returned);
32  }
33  allocator_free(generator->alloc, generator);
34 }
35 
36 identifier id_request(id_generator generator) {
37  if (array_size(generator->returned) > 0) {
38  return array_pop(generator->returned);
39  } else {
40  return generator->max++;
41  }
42 }
43 
44 void id_return(id_generator generator, identifier id) {
45  if (!array_push_checked(&generator->returned, &id)) {
46  KB_WARN("could not return id {usize} to generator {pointer}, id will not be reused", id, generator);
47  }
48 }
void * allocator_allocate_aligned(allocator *alloc, usize size, usize alignment)
Allocate aligned memory.
Definition: allocator.c:94
void allocator_free(allocator *alloc, void *mem)
Give back memory to the allocator.
Definition: allocator.c:134
Lightweight layer between platform and other engine components to enable tracing/monitoring.
#define KB_WARN(...)
Log entry with warn log level.
Definition: log.h:161
#define KB_ERROR(...)
Log entry with error log level.
Definition: log.h:142
Central allocator structure.
Definition: allocator.h:87