diff options
Diffstat (limited to 'src/event.cpp')
| -rw-r--r-- | src/event.cpp | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/event.cpp b/src/event.cpp new file mode 100644 index 0000000..4683f0e --- /dev/null +++ b/src/event.cpp @@ -0,0 +1,57 @@ + +#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<EventHandler> callbacks{8}; +}; +DynArray<EventBucket> 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](); + } +} + |
