diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-08-30 22:00:54 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-09-06 17:19:09 -0400 |
| commit | 9372b51357e6179935339691f36e811b84934e8b (patch) | |
| tree | c1056c7aae7f548a75977e6de4dc71150b9feb85 | |
| parent | 4d15ed6a8b7676f3c76a466b367f253ba1794268 (diff) | |
first pass add events
| -rw-r--r-- | CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/event.cpp | 57 | ||||
| -rw-r--r-- | src/event.hpp | 17 |
3 files changed, 76 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index e90552d..5a1851a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,8 @@ set(PKE_SOURCE_FILES src/macros.hpp src/ecs.hpp src/ecs.cpp + src/event.hpp + src/event.cpp src/game.hpp src/game.cpp src/memory.hpp 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 */ |
