OXYGENHUB
◆ main openmsx / src / input / MSXEventDistributor.cc
1.3 KiB · C++ · last changed chore(): initial commit 1 month ago source blame history raw
e8555c89 Andy McCall 1
#include "MSXEventDistributor.hh"
2
3
#include "MSXEventListener.hh"
4
5
#include "stl.hh"
6
7
#include <cassert>
8
9
namespace openmsx {
10
11
MSXEventDistributor::~MSXEventDistributor()
12
{
13
	assert(listeners.empty());
14
}
15
16
bool MSXEventDistributor::isRegistered(MSXEventListener* listener) const
17
{
18
	return contains(listeners, listener);
19
}
20
21
void MSXEventDistributor::registerEventListener(MSXEventListener& listener)
22
{
23
	assert(!isRegistered(&listener));
24
	listeners.push_back(&listener);
25
}
26
27
void MSXEventDistributor::unregisterEventListener(MSXEventListener& listener)
28
{
29
	move_pop_back(listeners, rfind_unguarded(listeners, &listener));
30
}
31
32
void MSXEventDistributor::distributeEvent(const Event& event, EmuTime time)
33
{
34
	// Iterate over a copy because signalMSXEvent() may indirect call back into
35
	// registerEventListener().
36
	//   e.g. signalMSXEvent() -> .. -> PlugCmd::execute() -> .. ->
37
	//        Connector::plug() -> .. -> Joystick::plugHelper() ->
38
	//        registerEventListener()
39
	// 'listenersCopy' could be a local variable. But making it a member
40
	// variable allows to reuse the allocated vector-capacity.
41
	listenersCopy = listeners;
42
	for (auto& l : listenersCopy) {
43
		if (isRegistered(l)) {
44
			// it's possible the listener unregistered itself
45
			// (but is still present in the copy)
46
			l->signalMSXEvent(event, time);
47
		}
48
	}
49
}
50
51
} // namespace openmsx