11 assert(listeners.empty());
16 return contains(listeners, listener);
21 assert(!isRegistered(&listener));
22 listeners.push_back(&listener);
33 recorder = &recorder_;
39 assert(recorder == &recorder_);
59 void StateChangeDistributor::distribute(
const EventPtr& event)
67 auto copy = listeners;
68 for (
auto& l :
copy) {
69 if (isRegistered(l)) {
72 l->signalStateChange(event);
82 for (
auto& l : listeners) {
void registerRecorder(StateChangeRecorder &recorder)
(Un)registers the given object to receive state change events.
void unregisterRecorder(StateChangeRecorder &recorder)
void registerListener(StateChangeListener &listener)
(Un)registers the given object to receive state change events.
void distributeNew(const EventPtr &event)
Deliver the event to all registered listeners MSX input devices should call the distributeNew() versi...
void distributeReplay(const EventPtr &event)
std::shared_ptr< StateChange > EventPtr
void unregisterListener(StateChangeListener &listener)
void stopReplay(EmuTime::param time)
Explicitly stop replay.
~StateChangeDistributor()
virtual void stopReplay(EmuTime::param time) noexcept=0
This method gets called when we switch from replayed events to live events.
virtual void signalStateChange(const std::shared_ptr< StateChange > &event)=0
This method gets called when a StateChange event occurs.
virtual bool isReplaying() const =0
This file implemented 3 utility functions:
auto copy(InputRange &&range, OutputIter out)
constexpr auto rfind_unguarded(RANGE &range, const VAL &val)
Similar to the find(_if)_unguarded functions above, but searches from the back to front.
void move_pop_back(VECTOR &v, typename VECTOR::iterator it)
Erase the pointed to element from the given vector.
constexpr bool contains(ITER first, ITER last, const VAL &val)
Check if a range contains a given value, using linear search.