-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathevents.h
executable file
·70 lines (53 loc) · 1.32 KB
/
events.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#pragma once
#include <bits/stdc++.h>
#include "types.h"
namespace MLib
{
typedef unsigned long event_t;
typedef void* eventdata_t;
class EventEmitter;
class EventReceiver;
extern bool DEBUG_EVENTS;
class Event
{
private:
bool bubbles = true;
bool canceled = false;
Event(EventEmitter* source, event_t type, eventdata_t data);
public:
const EventEmitter* target;
const event_t type;
void* data;
void stopPropagation();
void stopImmediatePropagation();
friend EventEmitter;
};
class EventEmitter
{
private:
std::unordered_map<event_t, std::unordered_set<EventReceiver*>> receivers;
protected:
void trigger(event_t event, eventdata_t data = nullptr);
public:
EventEmitter();
EventEmitter(EventEmitter& other);
EventEmitter(EventEmitter&& other);
~EventEmitter();
void on(event_t event, EventReceiver* target);
void off(event_t event, EventReceiver* target);
void off(EventReceiver* target);
};
class EventReceiver
{
private:
std::unordered_map<EventEmitter*, std::unordered_set<event_t>> eventSubscribed;
protected:
virtual void onEvent(Event& event) = 0;
public:
EventReceiver();
EventReceiver(EventReceiver& other);
EventReceiver(EventReceiver&& other);
~EventReceiver();
friend EventEmitter;
};
} // namespace MLib