diff options
Diffstat (limited to '')
-rw-r--r-- | src/Event.cpp | 130 | ||||
-rw-r--r-- | src/Event.hpp | 241 |
2 files changed, 0 insertions, 371 deletions
diff --git a/src/Event.cpp b/src/Event.cpp index 1f3a9e8..00f67c0 100644 --- a/src/Event.cpp +++ b/src/Event.cpp @@ -1,131 +1 @@ #include "Event.hpp" - -#include <easylogging++.h> - -#include "Utility.hpp" - -std::queue<Event> EventAgregator::eventsToHandle; -std::mutex EventAgregator::queueMutex; -bool EventAgregator::isStarted = false; -std::vector<EventListener *> EventAgregator::listeners; -std::mutex EventAgregator::listenersMutex; - -EventListener::EventListener() { - EventAgregator::RegisterListener(*this); -} - -EventListener::~EventListener() { - EventAgregator::UnregisterListener(*this); -} - -void EventListener::PushEvent(Event event) { - eventsMutex.lock(); - handlersMutex.lock(); - if (handlers[event.type]) { - events.push(event); - } - handlersMutex.unlock(); - eventsMutex.unlock(); -} - -void EventListener::DirectCall(Event event) -{ - handlersMutex.lock(); - if (handlers[event.type]) - handlers[event.type](event.data); - handlersMutex.unlock(); -} - -bool EventListener::IsEventsQueueIsNotEmpty() { - eventsMutex.lock(); - bool value = !events.empty(); - eventsMutex.unlock(); - return value; -} - - -void EventListener::RegisterHandler(EventType type, EventListener::HandlerFunc handler) { - handlersMutex.lock(); - handlers[type] = handler; - handlersMutex.unlock(); -} - -void EventListener::HandleEvent() { - eventsMutex.lock(); - if (events.empty()) { - eventsMutex.unlock(); - return; - } - Event event = events.front(); - events.pop(); - eventsMutex.unlock(); - handlersMutex.lock(); - auto function = handlers[event.type]; - handlersMutex.unlock(); - function(event.data); -} - - -void EventAgregator::RegisterListener(EventListener &listener) { - listenersMutex.lock(); - //LOG(WARNING) << "Registered handler " << &listener; - listeners.push_back(&listener); - listenersMutex.unlock(); -} - -void EventAgregator::UnregisterListener(EventListener &listener) { - listenersMutex.lock(); - //LOG(WARNING) << "Unregistered handler " << &listener; - listeners.erase(std::find(listeners.begin(), listeners.end(), &listener)); - listenersMutex.unlock(); -} - -void EventAgregator::PushEvent(EventType type, EventData data) { - Event event; - event.type = type; - event.data = data; - queueMutex.lock(); - eventsToHandle.push(event); - queueMutex.unlock(); - if (!isStarted) { - isStarted = true; - std::thread(&EventAgregator::EventHandlingLoop).detach(); - } -} - -void EventAgregator::DirectEventCall(EventType type, EventData data) -{ - Event event {type, data}; - listenersMutex.lock(); - for (auto &listener : listeners) { - listenersMutex.unlock(); - listener->DirectCall(event); - listenersMutex.lock(); - } - listenersMutex.unlock(); -} - -void EventAgregator::EventHandlingLoop() { - LoopExecutionTimeController timer(std::chrono::milliseconds(5)); - while (true) { - queueMutex.lock(); - if (!eventsToHandle.empty()) { - auto queue = std::move(eventsToHandle); - queueMutex.unlock(); - - while (!queue.empty()) { - auto event = queue.front(); - listenersMutex.lock(); - for (auto &listener : listeners) { - listener->PushEvent(event); - } - listenersMutex.unlock(); - queue.pop(); - } - - queueMutex.lock(); - } - queueMutex.unlock(); - timer.Update(); - } -}
\ No newline at end of file diff --git a/src/Event.hpp b/src/Event.hpp index 4962ee9..3f59c93 100644 --- a/src/Event.hpp +++ b/src/Event.hpp @@ -1,243 +1,2 @@ #pragma once -#include <queue> -#include <map> -#include <thread> -#include <mutex> -#include <variant> -#include <functional> - -#include <SDL.h> - -#include "Vector.hpp" -#include "Chat.hpp" - -class Packet; - -enum class EventType { - Echo, - ChunkChanged, - ConnectToServer, - ConnectionSuccessfull, - Disconnect, - RequestNetworkClient, - RegisterNetworkClient, - PlayerConnected, - RemoveLoadingScreen, - ConnectionFailed, - Exit, - Disconnected, - Connecting, - NetworkClientException, - MouseMoved, - KeyPressed, - KeyReleased, - InitalizeSectionRender, - UpdateSectionsRender, - CreateSectionRender, - CreatedSectionRender, - PlayerPosChanged, - DeleteSectionRender, - EntityChanged, - NewRenderDataAvailable, - BlockChange, - RendererWorkerTask, - ChunkDeleted, - ChatMessageReceived, - SendChatMessage, - StateUpdated, -}; - -struct EchoData { - std::chrono::time_point<std::chrono::high_resolution_clock> time; -}; - -struct ChunkChangedData { - Vector chunkPosition; -}; - -struct ConnectToServerData { - std::string username; - std::string address; - unsigned short port; -}; - -struct ConnectionSuccessfullData { -}; - -struct DisconnectData { - std::string reason; -}; - -struct SendPacketData { - std::shared_ptr<Packet> packet; -}; - -struct ReceivePacketData { - std::shared_ptr<Packet> packet; -}; - -struct RequestNetworkClientData { - -}; - -struct RegisterNetworkClientData { -}; - -struct PlayerConnectedData { -}; - -struct RemoveLoadingScreenData { - -}; - -struct ConnectionFailedData { - std::string reason; -}; - -struct ExitData { - -}; - -struct DisconnectedData { - std::string reason; -}; - -struct ConnectingData { - -}; - -struct NetworkClientExceptionData { - std::string what; -}; - -struct MouseMovedData { - double x, y; -}; - -struct KeyPressedData { - SDL_Scancode key; -}; - -struct KeyReleasedData { - SDL_Scancode key; -}; - -struct InitalizeSectionRenderData { - Vector pos; -}; - -struct CreateSectionRenderData { - Vector pos; -}; - -struct CreatedSectionRenderData { - Vector pos; -}; - -struct PlayerPosChangedData { - VectorF newPos; -}; - -struct UpdateSectionsRenderData { - -}; - -struct DeleteSectionRenderData { - Vector pos; -}; - -struct EntityChangedData { - unsigned int EntityId; -}; - -struct NewRenderDataAvailableData { - -}; - -struct BlockChangeData { - Vector SectionPos; -}; - -struct RendererWorkerTaskData { - size_t WorkerId; - Vector Task; -}; - -struct ChunkDeletedData { - Vector pos; -}; - -struct ChatMessageReceivedData { - Chat message; - unsigned char position; -}; - -struct SendChatMessageData { - std::string message; -}; - -struct StateUpdatedData { - -}; - -using EventData = std::variant<EchoData, ChunkChangedData, ConnectToServerData, ConnectionSuccessfullData, - DisconnectData, SendPacketData, ReceivePacketData, RequestNetworkClientData, RegisterNetworkClientData, - PlayerConnectedData, RemoveLoadingScreenData, ConnectionFailedData, ExitData, DisconnectedData, - ConnectingData, NetworkClientExceptionData, MouseMovedData, KeyPressedData, KeyReleasedData, - InitalizeSectionRenderData, CreateSectionRenderData, CreatedSectionRenderData, PlayerPosChangedData, - UpdateSectionsRenderData, DeleteSectionRenderData, EntityChangedData, NewRenderDataAvailableData, - BlockChangeData, RendererWorkerTaskData, ChunkDeletedData, ChatMessageReceivedData, - SendChatMessageData, StateUpdatedData>; - -struct Event { - EventType type; - EventData data; -}; - -class EventListener { - friend class EventAgregator; - - using HandlerFunc = std::function<void(EventData)>; - - std::map<EventType, HandlerFunc> handlers; //TODO: There must be more elegant solution than std::variant of all data - - std::mutex handlersMutex; - - std::queue<Event> events; - - std::mutex eventsMutex; - - void PushEvent(Event event); - - void DirectCall(Event event); - -public: - EventListener(); - ~EventListener(); - bool IsEventsQueueIsNotEmpty(); - - void RegisterHandler(EventType type, HandlerFunc handler); - - void HandleEvent(); -}; - -class EventAgregator { - friend EventListener; - - EventAgregator() = default; - static std::queue<Event> eventsToHandle; - static std::mutex queueMutex; - static bool isStarted; - static std::vector<EventListener *> listeners; - static std::mutex listenersMutex; - - static void EventHandlingLoop(); - - static void RegisterListener(EventListener &listener); - static void UnregisterListener(EventListener &listener); - -public: - static void PushEvent(EventType type, EventData data); - static void DirectEventCall(EventType, EventData data); -};
\ No newline at end of file |