diff options
| -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 */ |
