Luanti 5.17.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 <vector>
9#include <cassert>
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::vector<FuncSpec> funcs;
23 };
24 std::vector<Dest> m_dest;
25
26public:
30
31 ~EventManager() override = default;
32
33 void put(MtEvent *e) override
34 {
35 const size_t type = e->getType();
36 if (type >= MtEvent::Type::TYPE_MAX) {
37 assert(false);
38 return;
39 }
40 const auto &funcs = m_dest[type].funcs;
41 for (const FuncSpec &func : funcs) {
42 (*(func.f))(e, func.d);
43 }
44 delete e;
45 }
46
47 void reg(MtEvent::Type type, event_receive_func f, void *data) override
48 {
49 if (type >= MtEvent::Type::TYPE_MAX) {
50 assert(false);
51 return;
52 }
53 m_dest[type].funcs.emplace_back(f, data);
54 }
55
56 void dereg(MtEvent::Type type, event_receive_func f, void *data) override
57 {
58 if (type >= MtEvent::Type::TYPE_MAX) {
59 assert(false);
60 return;
61 }
62 auto &funcs = m_dest[type].funcs;
63 for (auto j = funcs.begin(); j != funcs.end(); ) {
64 bool remove = j->f == f && (!data || j->d == data);
65 if (remove)
66 j = funcs.erase(j);
67 else
68 ++j;
69 }
70 }
71};
static void remove(TestMap &map, size_t offset, size_t count)
Definition benchmark_mapmodify.cpp:32
~EventManager() override=default
void reg(MtEvent::Type type, event_receive_func f, void *data) override
Definition event_manager.h:47
EventManager()
Definition event_manager.h:27
void put(MtEvent *e) override
Definition event_manager.h:33
void dereg(MtEvent::Type type, event_receive_func f, void *data) override
Definition event_manager.h:56
std::vector< Dest > m_dest
Definition event_manager.h:24
Definition mtevent.h:40
void(* event_receive_func)(MtEvent *e, void *data)
Definition mtevent.h:42
Definition mtevent.h:10
Type
Definition mtevent.h:13
@ TYPE_MAX
Definition mtevent.h:22
virtual Type getType() const =0
Definition event_manager.h:21
std::vector< 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