18#ifndef TOYMAKERENGINE_SIGNALS_H
19#define TOYMAKERENGINE_SIGNALS_H
32 template <
typename ...TArgs>
34 template <
typename ...TArgs>
36 template <
typename ...TArgs>
38 template <
typename ...TArgs>
64 template <
typename ...TArgs>
100 friend class Signal<TArgs...>;
111 template <
typename ...TArgs>
210 void connect(
const std::string& theirSignal,
const std::string& ourObserver,
SignalTracker& other);
224 template <
typename ...TArgs>
226 const std::string& signalName
237 template <
typename ...TArgs>
239 const std::string& observerName,
240 std::function<
void(TArgs...)> callbackFunction
253 std::unordered_map<std::string, std::weak_ptr<ISignalObserver>>
mObservers {};
259 std::unordered_map<std::string, std::weak_ptr<ISignal>>
mSignals {};
261 friend class IObserver;
263 template <
typename ...TArgs>
266 template <
typename ...TArgs>
325 template <
typename ...TArgs>
414 template <
typename ...TArgs>
460 friend class Signal<TArgs...>;
463 template <
typename ...TArgs>
465 assert(!observer.expired() &&
"Cannot register a null pointer as an observer");
469 template <
typename ...TArgs>
472 std::vector<std::weak_ptr<
SignalObserver_<TArgs...>>> expiredObservers {};
477 (*activeObserver)(args...);
481 expiredObservers.push_back(observer);
486 for(
auto expiredObserver: expiredObservers) {
491 template <
typename ...TArgs>
495 template <
typename ...TArgs>
500 template <
typename ...TArgs>
502 std::shared_ptr<ISignal> newSignal {
new Signal_<TArgs...>{} };
505 return std::static_pointer_cast<
Signal_<TArgs...>>(newSignal);
508 template <
typename ...TArgs>
510 std::shared_ptr<ISignalObserver> newObserver {
new SignalObserver_<TArgs...>{callback} };
513 return std::static_pointer_cast<
SignalObserver_<TArgs...>>(newObserver);
516 template <
typename ...TArgs>
521 template <
typename ...TArgs>
526 template <
typename ...TArgs>
531 template <
typename ...TArgs>
536 template <
typename ...TArgs>
541 template <
typename ...TArgs>
543 assert(callback &&
"Empty callback is not allowed");
547 template <
typename ...TArgs>
Definition signals.hpp:41
The base class for any signal that an object advertises.
Definition signals.hpp:48
virtual void registerObserver(std::weak_ptr< ISignalObserver > observer)=0
A method used by observers to declare their interest in this signal.
A class containing most of the implementation for this engine's SignalObserver concept.
Definition signals.hpp:112
std::function< void(TArgs...)> mStoredFunction
A reference to the function stored by this observer.
Definition signals.hpp:132
SignalObserver_(std::function< void(TArgs...)> callback)
Constructs a new Signal Observer_ object.
Definition signals.hpp:492
void operator()(TArgs... args)
The function called by a Signal this oberver is subscribed to.
Definition signals.hpp:496
A SignalObserver object, which can subscribe to Signals matching its data signature and receive signa...
Definition signals.hpp:415
std::shared_ptr< SignalObserver_< TArgs... > > mSignalObserver_
The underlying implementation of the observer template.
Definition signals.hpp:458
SignalObserver(SignalTracker &owningTracker, const std::string &name, std::function< void(TArgs...)> callback)
Creates a new SignalObserver object.
Definition signals.hpp:537
void resetObserver(SignalTracker &owningTracker, const std::string &name, std::function< void(TArgs...)> callback)
Reinitializes this observer with a new SignalTracker.
Definition signals.hpp:542
void connectTo(Signal< TArgs... > &signal)
Subscribes this SignalObserver to a Signal whose signature matches its own.
Definition signals.hpp:548
A signal tracker, the main interface between an object and the signal system.
Definition signals.hpp:164
void connect(const std::string &theirSignal, const std::string &ourObserver, SignalTracker &other)
Method that connects one of this objects SignalObservers to another tracker's Signal.
Definition signals.cpp:28
std::unordered_map< std::string, std::weak_ptr< ISignalObserver > > mObservers
A list of weak references to this object's SignalObservers, along with their names.
Definition signals.hpp:253
std::shared_ptr< SignalObserver_< TArgs... > > declareSignalObserver(const std::string &observerName, std::function< void(TArgs...)> callbackFunction)
Declares a SignalObserver owned by this tracker, returns a reference to it.
Definition signals.hpp:509
std::unordered_map< std::string, std::weak_ptr< ISignal > > mSignals
A list of weak references to this object's Signals, along with their names.
Definition signals.hpp:259
std::shared_ptr< Signal_< TArgs... > > declareSignal(const std::string &signalName)
Declares a Signal owned by this tracker, and returns a reference to it.
Definition signals.hpp:501
void garbageCollection()
A method which removes any signals and observers sitting on this object which were destroyed at some ...
Definition signals.cpp:44
SignalTracker & operator=(const SignalTracker &other)
Copy assignment operator.
Definition signals.cpp:13
SignalTracker()
Constructs a new SignalTracker object.
A class containing most of the implementation of this engine's Signal concept.
Definition signals.hpp:65
void registerObserver(std::weak_ptr< ISignalObserver > observer) override
Causes an eligible observer to be subscribed to this signal.
Definition signals.hpp:464
void emit(TArgs... args)
Method via which the owner of the signal can send data to the signal's obervers.
Definition signals.hpp:470
Signal_()=default
Constructs a new Signal_ object.
std::set< std::weak_ptr< SignalObserver_< TArgs... > >, std::owner_less< std::weak_ptr< SignalObserver_< TArgs... > > > > mObservers
Weak references to all the observers that have registered themselves with this Signal.
Definition signals.hpp:97
A Signal object, designed to emit signals matching some data signature to be received by all the Sign...
Definition signals.hpp:326
void resetSignal(SignalTracker &owningTracker, const std::string &name)
Reinitializes the tracker with a new owning SignalTracker.
Definition signals.hpp:527
std::shared_ptr< Signal_< TArgs... > > mSignal_
The actual object connected with this Signal's signal tracker, hidden from users of Signal.
Definition signals.hpp:373
void registerObserver(SignalObserver< TArgs... > &observer)
Registers a compatible SignalObserver as a subscriber of this Signal.
Definition signals.hpp:532
void emit(TArgs...args)
A method on the signal which causes the signal to be sent to all of its subscribers (aka SignalObserv...
Definition signals.hpp:522
Signal(SignalTracker &owningTracker, const std::string &name)
Constructs a Signal object and associates it with its SignalTracker.
Definition signals.hpp:517
Namespace containing all class definitions and functions related to the ToyMaker engine.
Definition application.hpp:25