summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-08-30 22:00:54 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-09-06 17:19:09 -0400
commit9372b51357e6179935339691f36e811b84934e8b (patch)
treec1056c7aae7f548a75977e6de4dc71150b9feb85 /src
parent4d15ed6a8b7676f3c76a466b367f253ba1794268 (diff)
first pass add events
Diffstat (limited to 'src')
-rw-r--r--src/event.cpp57
-rw-r--r--src/event.hpp17
2 files changed, 74 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]();
+ }
+}
+
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 <cassert>
+#include <cstdint>
+#include <cstring>
+
+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 */