From 9372b51357e6179935339691f36e811b84934e8b Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Wed, 30 Aug 2023 22:00:54 -0400 Subject: first pass add events --- src/event.cpp | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/event.hpp | 17 +++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/event.cpp create mode 100644 src/event.hpp (limited to 'src') 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 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](); + } +} + diff --git a/src/event.hpp b/src/event.hpp new file mode 100644 index 0000000..505d82a --- /dev/null +++ b/src/event.hpp @@ -0,0 +1,17 @@ +#ifndef PKE_EVENT_HPP +#define PKE_EVENT_HPP + +#include "macros.hpp" +#include "dynamic-array.hpp" + +#include +#include +#include + +typedef void (*EventHandler)(); + +void RegisterCallback(const char *name, EventHandler handler); +void UnregisterCallback(const char *name, EventHandler handler); +void DispatchCabllack(const char *name); + +#endif /* PKE_EVENT_HPP */ -- cgit v1.2.3