OXYGENHUB
◆ main openmsx / src / input / MSXEventDistributor.hh
1.5 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
1
#ifndef MSXEVENTDISTRIBUTOR_HH
2
#define MSXEVENTDISTRIBUTOR_HH
3
4
#include "EmuTime.hh"
5
#include "Event.hh"
6
#include <vector>
7
8
namespace openmsx {
9
10
class MSXEventListener;
11
12
class MSXEventDistributor
13
{
14
public:
15
	MSXEventDistributor() = default;
16
	MSXEventDistributor(const MSXEventDistributor&) = delete;
17
	MSXEventDistributor(MSXEventDistributor&&) = delete;
18
	MSXEventDistributor& operator=(const MSXEventDistributor&) = delete;
19
	MSXEventDistributor& operator=(MSXEventDistributor&&) = delete;
20
	~MSXEventDistributor();
21
22
	/**
23
	 * Registers a given object to receive certain events.
24
	 * @param listener Listener that will be notified when an event arrives.
25
	 */
26
	void registerEventListener(MSXEventListener& listener);
27
28
	/**
29
	 * Unregisters a previously registered event listener.
30
	 * @param listener Listener to unregister.
31
	 */
32
	void unregisterEventListener(MSXEventListener& listener);
33
34
	/** Deliver the event to all registered listeners
35
	  * @param event The event
36
	  * @param time Current time
37
	  * Note: MSXEventListener's are allowed to throw exceptions, and this
38
	  *       method doesn't catch them (in case of an exception it's
39
	  *       undefined which listeners receive the event)
40
	  */
41
	void distributeEvent(const Event& event, EmuTime time);
42
43
private:
44
	[[nodiscard]] bool isRegistered(MSXEventListener* listener) const;
45
46
private:
47
	std::vector<MSXEventListener*> listeners; // unordered
48
	std::vector<MSXEventListener*> listenersCopy; // see distributeEvent()
49
};
50
51
} // namespace openmsx
52
53
#endif