Minetest 5.9.0-dev
 
Loading...
Searching...
No Matches
event_manager.h
Go to the documentation of this file.
1/*
2Minetest
3Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5This program is free software; you can redistribute it and/or modify
6it under the terms of the GNU Lesser General Public License as published by
7the Free Software Foundation; either version 2.1 of the License, or
8(at your option) any later version.
9
10This program is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13GNU Lesser General Public License for more details.
14
15You should have received a copy of the GNU Lesser General Public License along
16with this program; if not, write to the Free Software Foundation, Inc.,
1751 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18*/
19
20#pragma once
21
22#include "mtevent.h"
23#include <list>
24#include <map>
25
27{
28 static void receiverReceive(MtEvent *e, void *data)
29 {
31 r->onEvent(e);
32 }
33 struct FuncSpec
34 {
36 void *d;
37 FuncSpec(event_receive_func f, void *d) : f(f), d(d) {}
38 };
39
40 struct Dest
41 {
42 std::list<FuncSpec> funcs{};
43 };
44 std::map<MtEvent::Type, Dest> m_dest{};
45
46public:
47 ~EventManager() override = default;
48
49 void put(MtEvent *e) override
50 {
51 std::map<MtEvent::Type, Dest>::iterator i = m_dest.find(e->getType());
52 if (i != m_dest.end()) {
53 std::list<FuncSpec> &funcs = i->second.funcs;
54 for (FuncSpec &func : funcs) {
55 (*(func.f))(e, func.d);
56 }
57 }
58 delete e;
59 }
60 void reg(MtEvent::Type type, event_receive_func f, void *data) override
61 {
62 std::map<MtEvent::Type, Dest>::iterator i = m_dest.find(type);
63 if (i != m_dest.end()) {
64 i->second.funcs.emplace_back(f, data);
65 } else {
66 Dest dest;
67 dest.funcs.emplace_back(f, data);
68 m_dest[type] = dest;
69 }
70 }
71 void dereg(MtEvent::Type type, event_receive_func f, void *data) override
72 {
73 auto i = m_dest.find(type);
74 if (i != m_dest.end()) {
75 std::list<FuncSpec> &funcs = i->second.funcs;
76 for (auto j = funcs.begin(); j != funcs.end(); ) {
77 bool remove = (j->f == f && (!data || j->d == data));
78 if (remove)
79 j = funcs.erase(j);
80 else
81 ++j;
82 }
83 }
84 }
85};
static void remove(TestMap &map, size_t offset, size_t count)
Definition: benchmark_mapmodify.cpp:47
Definition: event_manager.h:27
~EventManager() override=default
static void receiverReceive(MtEvent *e, void *data)
Definition: event_manager.h:28
void reg(MtEvent::Type type, event_receive_func f, void *data) override
Definition: event_manager.h:60
std::map< MtEvent::Type, Dest > m_dest
Definition: event_manager.h:44
void put(MtEvent *e) override
Definition: event_manager.h:49
void dereg(MtEvent::Type type, event_receive_func f, void *data) override
Definition: event_manager.h:71
Definition: mtevent.h:64
Definition: mtevent.h:55
virtual void onEvent(MtEvent *e)=0
Definition: mtevent.h:25
Type
Definition: mtevent.h:28
virtual Type getType() const =0
void(* event_receive_func)(MtEvent *e, void *data)
Definition: mtevent.h:61
Definition: event_manager.h:41
std::list< FuncSpec > funcs
Definition: event_manager.h:42
Definition: event_manager.h:34
event_receive_func f
Definition: event_manager.h:35
FuncSpec(event_receive_func f, void *d)
Definition: event_manager.h:37
void * d
Definition: event_manager.h:36