#include "event.hpp" struct EventBucket { char name[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; DynArray callbacks{8}; }; DynArray eventBuckets{4}; void EventBucketFind(const char *name, char *safeName, EventBucket*& bkt) { assert(strlen(name) <= 16); memset(safeName, '\0', 16); memcpy(safeName, name, strlen(name)); for (long i = 0; i < eventBuckets.Count(); ++i) { EventBucket *tmpBkt = eventBuckets.GetPtr() + (sizeof(EventBucket) * i); if (strncmp(safeName, tmpBkt->name, 16) == 0) { bkt = tmpBkt; break; } } } void RegisterCallback(const char *name, EventHandler handler) { char safeName[16]; EventBucket *bkt = nullptr; EventBucketFind(name, safeName, bkt); if (bkt == nullptr) { eventBuckets.Push(EventBucket{}); bkt = eventBuckets.GetPtr() + (sizeof(EventBucket) * (eventBuckets.Count() - 1)); memcpy(bkt->name, safeName, 16); } bkt->callbacks.Push(handler); } void UnregisterCallback(const char *name, EventHandler handler) { char safeName[16]; EventBucket *bkt = nullptr; EventBucketFind(name, safeName, bkt); if (bkt == nullptr) return; for (uint64_t i = 0; i < bkt->callbacks.Count(); ++i) { if (bkt->callbacks[i] == handler) { bkt->callbacks.Remove(i); break; } } } void DispatchCabllack(const char *name) { char safeName[16]; EventBucket *bkt = nullptr; EventBucketFind(name, safeName, bkt); if (bkt == nullptr) return; for (long i = 0; i < bkt->callbacks.Count(); ++i) { bkt->callbacks[i](); } }