GBAlatro
A Demake of Balatro for the GBA
Loading...
Searching...
No Matches
pool.h
1#ifndef POOL_H
2#define POOL_H
3
4#include "bitset.h"
5
6#include <stdbool.h>
7#include <stdint.h>
8
9#ifdef POOLS_TEST_ENV
10#define POOLS_DEF_FILE "def_test_mempool.h"
11#else
12#define POOLS_DEF_FILE "def_balatro_mempool.h"
13#endif
14
15#define POOL_DECLARE_TYPE(type) \
16 typedef struct \
17 { \
18 Bitset* bitset; \
19 type* objects; \
20 } type##Pool; \
21 type* pool_get_##type(); \
22 void pool_free_##type(type* obj); \
23 int pool_idx_##type(type* obj); \
24 type* pool_at_##type(int idx);
25
26#define POOL_DEFINE_TYPE(type, capacity) \
27 BITSET_DEFINE(type##_bitset, capacity) \
28 static type type##_storage[capacity]; \
29 static type##Pool type##_pool = { \
30 .bitset = &type##_bitset, \
31 .objects = type##_storage, \
32 }; \
33 type* pool_get_##type() \
34 { \
35 int free_offset = bitset_set_next_free_idx(type##_pool.bitset); \
36 if (free_offset == -1) \
37 return NULL; \
38 return &type##_pool.objects[free_offset]; \
39 } \
40 void pool_free_##type(type* entry) \
41 { \
42 if (entry == NULL) \
43 return; \
44 int offset = entry - &type##_pool.objects[0]; \
45 bitset_set_idx(type##_pool.bitset, offset, false); \
46 } \
47 int pool_idx_##type(type* entry) \
48 { \
49 return entry - &type##_pool.objects[0]; \
50 } \
51 type* pool_at_##type(int idx) \
52 { \
53 if (idx < 0 || idx >= (type##_pool.bitset)->cap) \
54 return NULL; \
55 return &type##_pool.objects[idx]; \
56 }
57
58#define POOL_GET(type) pool_get_##type()
59#define POOL_FREE(type, obj) pool_free_##type(obj)
60#define POOL_IDX(type, obj) pool_idx_##type(obj) // the index of the object
61#define POOL_AT(type, idx) pool_at_##type(idx) // the object at
62
63#define POOL_ENTRY(name, capacity) POOL_DECLARE_TYPE(name);
64#include POOLS_DEF_FILE
65#undef POOL_ENTRY
66
67#endif // POOL_H
A bitset for operating on flags.