diff options
author | Loïc Blot <nerzhul@users.noreply.github.com> | 2018-03-30 18:32:52 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-30 18:32:52 +0200 |
commit | ce873108aa91d19104f46c5acd3350385e7a4541 (patch) | |
tree | 58672a3c803469de71c9ae270beb9a052ba5559a /src/client/event_manager.h | |
parent | 2c490dddc037d7d1cf211bbf28309e31b0abdadd (diff) | |
download | minetest-ce873108aa91d19104f46c5acd3350385e7a4541.tar.gz minetest-ce873108aa91d19104f46c5acd3350385e7a4541.tar.bz2 minetest-ce873108aa91d19104f46c5acd3350385e7a4541.zip |
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
Diffstat (limited to 'src/client/event_manager.h')
-rw-r--r-- | src/client/event_manager.h | 86 |
1 files changed, 86 insertions, 0 deletions
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 <celeron55@gmail.com> + +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 <list> +#include <map> + +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<FuncSpec> funcs{}; + }; + std::map<MtEvent::Type, Dest> m_dest{}; + +public: + ~EventManager() override = default; + + void put(MtEvent *e) override + { + std::map<MtEvent::Type, Dest>::iterator i = m_dest.find(e->getType()); + if (i != m_dest.end()) { + std::list<FuncSpec> &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<MtEvent::Type, Dest>::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<MtEvent::Type, Dest>::iterator i = m_dest.find(type); + if (i != m_dest.end()) { + std::list<FuncSpec> &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; + } + } + } +}; |