Luanti 5.15.0-dev
 
Loading...
Searching...
No Matches
event_manager.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5#pragma once
6
7#include "mtevent.h"
8#include <list>
9#include <map>
10
12{
13 struct FuncSpec
14 {
16 void *d;
17 FuncSpec(event_receive_func f, void *d) : f(f), d(d) {}
18 };
19
20 struct Dest
21 {
22 std::list<FuncSpec> funcs{};
23 };
24 std::map<MtEvent::Type, Dest> m_dest{};
25
26public:
27 ~EventManager() override = default;
28
29 void put(MtEvent *e) override
30 {
31 auto i = m_dest.find(e->getType());
32 if (i != m_dest.end()) {
33 std::list<FuncSpec> &funcs = i->second.funcs;
34 for (FuncSpec &func : funcs) {
35 (*(func.f))(e, func.d);
36 }
37 }
38 delete e;
39 }
40 void reg(MtEvent::Type type, event_receive_func f, void *data) override
41 {
42 auto i = m_dest.find(type);
43 if (i != m_dest.end()) {
44 i->second.funcs.emplace_back(f, data);
45 } else {
46 Dest dest;
47 dest.funcs.emplace_back(f, data);
48 m_dest[type] = dest;
49 }
50 }
51 void dereg(MtEvent::Type type, event_receive_func f, void *data) override
52 {
53 auto i = m_dest.find(type);
54 if (i != m_dest.end()) {
55 std::list<FuncSpec> &funcs = i->second.funcs;
56 for (auto j = funcs.begin(); j != funcs.end(); ) {
57 bool remove = (j->f == f && (!data || j->d == data));
58 if (remove)
59 j = funcs.erase(j);
60 else
61 ++j;
62 }
63 }
64 }
65};
static void remove(TestMap &map, size_t offset, size_t count)
Definition benchmark_mapmodify.cpp:32
Definition event_manager.h:12
~EventManager() override=default
void reg(MtEvent::Type type, event_receive_func f, void *data) override
Definition event_manager.h:40
std::map< MtEvent::Type, Dest > m_dest
Definition event_manager.h:24
void put(MtEvent *e) override
Definition event_manager.h:29
void dereg(MtEvent::Type type, event_receive_func f, void *data) override
Definition event_manager.h:51
Definition mtevent.h:42
Definition mtevent.h:10
Type
Definition mtevent.h:13
virtual Type getType() const =0
void(* event_receive_func)(MtEvent *e, void *data)
Definition mtevent.h:39
Definition event_manager.h:21
std::list< FuncSpec > funcs
Definition event_manager.h:22
Definition event_manager.h:14
event_receive_func f
Definition event_manager.h:15
FuncSpec(event_receive_func f, void *d)
Definition event_manager.h:17
void * d
Definition event_manager.h:16