From ce873108aa91d19104f46c5acd3350385e7a4541 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Blot?= Date: Fri, 30 Mar 2018 18:32:52 +0200 Subject: Client eventmanager refactor (#7179) * Drop EventManager from GameDef & do some client cleanups * EventManager is only used by Client. Don't expose it on Server & GameDef for nothing * Drop Client::event() in favor of direct calls to getEventManager * Cleanup some event put from new + put to put(new) * MtEvent: add Type(u8) enum * This will enhance event performance & ensure stricter type * Drop MtEvent::checkIs (unused) * clang-tidy reported fixes * Code style * Move event_manager.h to the client directory as it's only used by client Add EventManager unittests + switch to unordered_map as order is not important here Drop a unused function --- src/client/event_manager.h | 86 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/client/event_manager.h (limited to 'src/client/event_manager.h') diff --git a/src/client/event_manager.h b/src/client/event_manager.h new file mode 100644 index 000000000..3762e89bf --- /dev/null +++ b/src/client/event_manager.h @@ -0,0 +1,86 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#pragma once + +#include "event.h" +#include +#include + +class EventManager : public MtEventManager +{ + static void receiverReceive(MtEvent *e, void *data) + { + MtEventReceiver *r = (MtEventReceiver *)data; + r->onEvent(e); + } + struct FuncSpec + { + event_receive_func f; + void *d; + FuncSpec(event_receive_func f, void *d) : f(f), d(d) {} + }; + + struct Dest + { + std::list funcs{}; + }; + std::map m_dest{}; + +public: + ~EventManager() override = default; + + void put(MtEvent *e) override + { + std::map::iterator i = m_dest.find(e->getType()); + if (i != m_dest.end()) { + std::list &funcs = i->second.funcs; + for (FuncSpec &func : funcs) { + (*(func.f))(e, func.d); + } + } + delete e; + } + void reg(MtEvent::Type type, event_receive_func f, void *data) override + { + std::map::iterator i = m_dest.find(type); + if (i != m_dest.end()) { + i->second.funcs.emplace_back(f, data); + } else { + Dest dest; + dest.funcs.emplace_back(f, data); + m_dest[type] = dest; + } + } + void dereg(MtEvent::Type type, event_receive_func f, void *data) override + { + std::map::iterator i = m_dest.find(type); + if (i != m_dest.end()) { + std::list &funcs = i->second.funcs; + auto j = funcs.begin(); + while (j != funcs.end()) { + bool remove = (j->f == f && (!data || j->d == data)); + if (remove) + funcs.erase(j++); + else + ++j; + } + } + } +}; -- cgit v1.2.3