summaryrefslogtreecommitdiff
path: root/src/event.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/event.cpp')
-rw-r--r--src/event.cpp57
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]();
+ }
+}
+