commit af547a319c9845c0921580bd9aece70a0a63e9ab Author: Jorijn van der Graaf Date: Tue May 6 12:38:46 2025 +0200 inital commit diff --git a/Crafter.Event.cppm b/Crafter.Event.cppm new file mode 100644 index 0000000..f4b34ec --- /dev/null +++ b/Crafter.Event.cppm @@ -0,0 +1,165 @@ +module; + +#include +#include +#include +#include + +export module Crafter.Event; + +namespace Crafter { + export template + class Event; + + export template<> + class Event; + + export template + class EventListener { + public: + int priority; + EventListener(); + void SetEvent(Event* eventToListenTo, std::function function, int priority = 0); + EventListener(Event* eventToListenTo, std::function function, int priority = 0); + ~EventListener(); + Event* eventToListenTo; + std::function function; + }; + + export template<> + class EventListener { + public: + int priority; + EventListener(); + void SetEvent(Event* eventToListenTo, std::function function, int priority = 0); + EventListener(Event* eventToListenTo, std::function function, int priority = 0); + ~EventListener(); + Event* eventToListenTo; + std::function function; + }; + + export template + class Event { + private: + std::map*>> listeners; + public: + ~Event() { + for (const auto& listenerSlice : listeners) { + const std::vector*> slice = listenerSlice.second; + for (const auto& listener : slice) { + listener->eventToListenTo = nullptr; + } + } + } + + void AddListener(EventListener* listener, int priority = 0) { + if (listeners.contains(priority)) { + listeners[priority].push_back(listener); + } + else { + listeners[priority] = std::vector*>{ listener }; + } + } + + void RemoveListener(EventListener* listener) { + listeners[listener->priority].erase(std::remove(listeners[listener->priority].begin(), listeners[listener->priority].end(), listener), listeners[listener->priority].end()); + } + + void Invoke(T data) { + for (const auto& listenerSlice : listeners) { + const std::vector*> slice = listenerSlice.second; + for (const auto& listener : slice) { + listener->function(data); + } + } + } + }; + + template void EventListener::SetEvent(Event* eventToListenTo, std::function listener, int priority) + { + this->priority = priority; + if (this->eventToListenTo != nullptr) { + eventToListenTo->RemoveListener(this); + } + this->eventToListenTo = eventToListenTo; + eventToListenTo->AddListener(this); + this->function = listener; + } + + template EventListener::EventListener(Event* eventToListenTo, std::function listener, int priority) : priority(priority), eventToListenTo(eventToListenTo), function(listener) { + eventToListenTo->AddListener(this); + } + + template EventListener::~EventListener() { + if (eventToListenTo != nullptr) { + eventToListenTo->RemoveListener(this); + } + } + + template EventListener::EventListener() { + eventToListenTo = nullptr; + } + + export template<> + class Event { + private: + std::map*>> listeners; + + public: + ~Event() { + for (const auto& listenerSlice : listeners) { + const std::vector*> slice = listenerSlice.second; + for (const auto& listener : slice) { + listener->eventToListenTo = nullptr; + } + } + } + + void AddListener(EventListener* listener, int priority = 0) { + if (listeners.contains(priority)) { + listeners[priority].push_back(listener); + } + else { + listeners[priority] = std::vector*>{ listener }; + } + } + + void RemoveListener(EventListener* listener) { + listeners[listener->priority].erase(std::remove(listeners[listener->priority].begin(), listeners[listener->priority].end(), listener), listeners[listener->priority].end()); + } + + void Invoke() { + for (const auto& listenerSlice : listeners) { + const std::vector*> slice = listenerSlice.second; + for (const auto& listener : slice) { + listener->function(); + } + } + } + }; + + void EventListener::SetEvent(Event* eventToListenTo, std::function listener, int priority) + { + this->priority = priority; + if (this->eventToListenTo != nullptr) { + eventToListenTo->RemoveListener(this); + } + this->eventToListenTo = eventToListenTo; + eventToListenTo->AddListener(this); + this->function = listener; + } + + EventListener::EventListener(Event* eventToListenTo, std::function listener, int priority) : priority(priority), eventToListenTo(eventToListenTo), function(listener) { + eventToListenTo->AddListener(this); + } + + EventListener::~EventListener() { + if (eventToListenTo != nullptr) { + eventToListenTo->RemoveListener(this); + } + } + + EventListener::EventListener() { + eventToListenTo = nullptr; + } +} \ No newline at end of file diff --git a/bin/Crafter.Event.pcm b/bin/Crafter.Event.pcm new file mode 100644 index 0000000..81d9f05 Binary files /dev/null and b/bin/Crafter.Event.pcm differ diff --git a/bin/Crafter.Thread-ThreadPool.pcm b/bin/Crafter.Thread-ThreadPool.pcm new file mode 100644 index 0000000..5d7b7d9 Binary files /dev/null and b/bin/Crafter.Thread-ThreadPool.pcm differ diff --git a/bin/Crafter.Thread.pcm b/bin/Crafter.Thread.pcm new file mode 100644 index 0000000..c09a4a6 Binary files /dev/null and b/bin/Crafter.Thread.pcm differ diff --git a/bin/libcrafter-event.a b/bin/libcrafter-event.a new file mode 100644 index 0000000..bf78419 Binary files /dev/null and b/bin/libcrafter-event.a differ diff --git a/bin/libcrafter-thread.a b/bin/libcrafter-thread.a new file mode 100644 index 0000000..8468da3 Binary files /dev/null and b/bin/libcrafter-thread.a differ diff --git a/build/Crafter.Event.o b/build/Crafter.Event.o new file mode 100644 index 0000000..8af92dd Binary files /dev/null and b/build/Crafter.Event.o differ diff --git a/build/Crafter.Thread b/build/Crafter.Thread new file mode 160000 index 0000000..79b152b --- /dev/null +++ b/build/Crafter.Thread @@ -0,0 +1 @@ +Subproject commit 79b152bd67194ed11b56eb6cd3f5019f862296dd diff --git a/build/debug/Crafter.Event.o b/build/debug/Crafter.Event.o new file mode 100644 index 0000000..d95116b Binary files /dev/null and b/build/debug/Crafter.Event.o differ diff --git a/build/debug/Crafter.Thread b/build/debug/Crafter.Thread new file mode 160000 index 0000000..79b152b --- /dev/null +++ b/build/debug/Crafter.Thread @@ -0,0 +1 @@ +Subproject commit 79b152bd67194ed11b56eb6cd3f5019f862296dd diff --git a/project.json b/project.json new file mode 100644 index 0000000..79ffa27 --- /dev/null +++ b/project.json @@ -0,0 +1,38 @@ +{ + "name": "crafter-event", + "configurations": [ + { + "name": "base", + "standard": "c++26", + "source_files": [], + "module_files": ["Crafter.Event"], + "additional_files": [], + "build_dir": "./build", + "output_dir": "./bin", + "type":"library" + }, + { + "name": "debug", + "extends": ["base"], + "optimization_level": "0", + "debug":true, + "dependencies": [ + { + "path":"https://forgejo.catcrafts.net/Catcrafts/Crafter.Thread.git", + "configuration":"debug" + } + ] + }, + { + "name": "release", + "extends": ["base"], + "optimization_level": "3", + "dependencies": [ + { + "path":"https://forgejo.catcrafts.net/Catcrafts/Crafter.Thread.git", + "configuration":"release" + } + ] + } + ] +}