Fumofumotris/source/game/event.c
Julia 8ad3bf1f22 gaming
th j
2024-04-22 17:13:13 -05:00

58 lines
1.2 KiB
C

#include "event.h"
#define INIT_CAPACITY 16
size_t clbks_size(size_t capacity) {
return sizeof(union func) * capacity;
}
bool CreateEvent(struct Event *event)
{
union func *callbacks = malloc(clbks_size(INIT_CAPACITY));
if (callbacks == nullptr)
return false;
*event = (struct Event) {
.clbks = callbacks,
.len = 0,
.capacity = INIT_CAPACITY,
};
return true;
}
void FreeEvent(struct Event *event)
{
free(event->clbks);
}
bool EventSubscribe(struct Event *event, union func callback)
{
if (event->len == event->capacity) {
size_t new_cap = event->capacity * 2;
union func *new_clbks = realloc(event->clbks, clbks_size(new_cap));
if (new_clbks == nullptr)
return false;
event->clbks = new_clbks;
event->capacity = new_cap;
}
event->clbks[event->len++] = callback;
return true;
}
void EventInvoke(struct Event *event, void *arg)
{
for (size_t i = 0; i < event->len; i++) {
event->clbks[i].generic(arg);
}
}
void EventInvokeUpdate(struct Event *event, u64 dt)
{
for (size_t i = 0; i < event->len; i++) {
event->clbks[i].update(dt);
}
}