diff options
Diffstat (limited to 'src/event.cpp')
| -rw-r--r-- | src/event.cpp | 138 |
1 files changed, 0 insertions, 138 deletions
diff --git a/src/event.cpp b/src/event.cpp deleted file mode 100644 index 41c1d7a..0000000 --- a/src/event.cpp +++ /dev/null @@ -1,138 +0,0 @@ - -#include "event.hpp" -#include "pk.h" - -#include <cstring> -#include <type_traits> - -struct BaseEventBucket { - char name[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -}; - -template<typename Fn> -struct EventBucket : public BaseEventBucket { - using BaseEventBucket::name; - pk_arr_t<Fn> callbacks; -}; -using EventArr = pk_arr_t<EventBucket<EventHandler>>; -using TickArr = pk_arr_t<EventBucket<TickEvent>>; -EventArr eventBuckets; -TickArr tickBuckets; - -template<typename Fn> -void EventBucketFind(const char *name, BaseEventBucket*& bkt) { - assert(strlen(name) <= 16); - char safeName[16]; - memset(safeName, '\0', 16); - memcpy(safeName, name, strlen(name)); - - BaseEventBucket *baseBkt = nullptr; - pk_arr *arr = nullptr; - - if constexpr(std::is_same<Fn, EventHandler>::value) { - arr = &eventBuckets; - } - if constexpr(std::is_same<Fn, TickEvent>::value) { - arr = &tickBuckets; - } - assert(arr != nullptr); - for (long i = 0; i < arr->next; ++i) { - if constexpr(std::is_same<Fn, EventHandler>::value) { - EventArr &tArr = *reinterpret_cast<EventArr *>(arr); - baseBkt = &tArr[i]; - } - if constexpr(std::is_same<Fn, TickEvent>::value) { - TickArr &tArr = *reinterpret_cast<TickArr *>(arr); - baseBkt = &tArr[i]; - } - assert(baseBkt != nullptr); - if (strncmp(safeName, baseBkt->name, 16) == 0) { - bkt = baseBkt; - return; - } - } - if constexpr(std::is_same<Fn, EventHandler>::value) { - EventArr &tArr = *reinterpret_cast<EventArr *>(arr); - pk_arr_append_t(&tArr, {}); - bkt = &tArr[tArr.next-1]; - } - if constexpr(std::is_same<Fn, TickEvent>::value) { - TickArr &tArr = *reinterpret_cast<TickArr *>(arr); - pk_arr_append_t(&tArr, {}); - bkt = &tArr[tArr.next-1]; - } - assert(bkt != nullptr); - memcpy(bkt->name, safeName, 16); -} - -template<> -void Event_RegisterCallback<EventHandler>(const char *name, EventHandler handler) { - assert(handler != nullptr); - BaseEventBucket *bkt = nullptr; - EventBucketFind<EventHandler>(name, bkt); - EventBucket<EventHandler> *tBkt = reinterpret_cast<EventBucket<EventHandler> *>(bkt); - pk_arr_append_t(&tBkt->callbacks, handler); -} - -template<> -void Event_UnregisterCallback<EventHandler>(const char *name, EventHandler handler) { - assert(handler != nullptr); - BaseEventBucket *bkt = nullptr; - EventBucketFind<EventHandler>(name, bkt); - EventBucket<EventHandler> *tBkt = reinterpret_cast<EventBucket<EventHandler> *>(bkt); - for (uint32_t i = 0; i < tBkt->callbacks.next; ++i) { - if (tBkt->callbacks[i] == handler) { - pk_arr_remove_at(&tBkt->callbacks, i); - break; - } - } -} - -template<> -void Event_Dispatch<EventHandler>(const char *name) { - BaseEventBucket *bkt = nullptr; - EventBucketFind<EventHandler>(name, bkt); - EventBucket<EventHandler> *tBkt = reinterpret_cast<EventBucket<EventHandler> *>(bkt); - for (int64_t i = 0; i < tBkt->callbacks.next; ++i) { - tBkt->callbacks[i](); - } -} - -template<> -void Event_RegisterCallback<TickEvent>(const char *name, TickEvent handler) { - assert(handler != nullptr); - BaseEventBucket *bkt = nullptr; - EventBucketFind<TickEvent>(name, bkt); - EventBucket<TickEvent> *tBkt = reinterpret_cast<EventBucket<TickEvent> *>(bkt); - pk_arr_append_t(&tBkt->callbacks, handler); -} - -template<> -void Event_UnregisterCallback<TickEvent>(const char *name, TickEvent handler) { - assert(handler != nullptr); - BaseEventBucket *bkt = nullptr; - EventBucketFind<TickEvent>(name, bkt); - EventBucket<TickEvent> *tBkt = reinterpret_cast<EventBucket<TickEvent> *>(bkt); - for (uint32_t i = 0; i < tBkt->callbacks.next; ++i) { - if (tBkt->callbacks[i] == handler) { - pk_arr_remove_at(&tBkt->callbacks, i); - break; - } - } -} - -template<> -void Event_Dispatch<TickEvent, double>(const char *name, double d) { - BaseEventBucket *bkt = nullptr; - EventBucketFind<TickEvent>(name, bkt); - EventBucket<TickEvent> *tBkt = reinterpret_cast<EventBucket<TickEvent> *>(bkt); - for (uint32_t i = 0; i < tBkt->callbacks.next; ++i) { - tBkt->callbacks[i](d); - } -} - -void Event_Teardown() { - pk_arr_reset(&tickBuckets); - pk_arr_reset(&eventBuckets); -} - |
