generated from pbentes/ProjectTemplate
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHandles.hpp
48 lines (38 loc) · 1.53 KB
/
Handles.hpp
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
#pragma once
#include "Arena.hpp"
#include <cstddef>
#include <cstdlib>
#include <cstring>
typedef unsigned long long handle;
typedef struct HandleStore {
Arena* arena;
size_t element_size;
} HandleStore;
HandleStore handleStoreCreate(size_t element_size, int element_count);
handle handleStoreAdd(HandleStore* handle_store, void* data);
void* handleStoreGet(HandleStore* handle_store, handle h);
void handleStoreDestroy(HandleStore* handle_store);
#ifndef HANDLES_IMPLEMENTATION
#define HANDLES_IMPLEMENTATION
HandleStore handleStoreCreate(size_t element_size, int element_count) {
return HandleStore {
.arena = arenaCreate(element_size * element_count),
.element_size = element_size
};
}
handle handleStoreAdd(HandleStore* handle_store, void* data) {
handle index = ((char*)handle_store->arena->index - (char*)handle_store->arena->buffer) / handle_store->element_size;
void* arena_position = arenaAlloc(handle_store->arena, handle_store->element_size);
memcpy(arena_position, data, handle_store->element_size);
return index;
}
void* handleStoreGet(HandleStore* handle_store, handle h) {
if(h > handle_store->arena->size / handle_store->element_size)
return nullptr;
return (void*)((char*)handle_store->arena->buffer + handle_store->element_size * h);
}
void handleStoreDestroy(HandleStore* handle_store) {
arenaDestroy(handle_store->arena);
free(handle_store);
}
#endif //HANDLES_IMPLEMENTATION