18#ifndef FOOLSENGINE_SIGNALS_H
19#define FOOLSENGINE_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>
207 void connect(
const std::string& theirSignal,
const std::string& ourObserver,
SignalTracker& other);
221 template <
typename ...TArgs>
223 const std::string& signalName
234 template <
typename ...TArgs>
236 const std::string& observerName,
237 std::function<
void(TArgs...)> callbackFunction
250 std::unordered_map<std::string, std::weak_ptr<ISignalObserver>>
mObservers {};
256 std::unordered_map<std::string, std::weak_ptr<ISignal>>
mSignals {};
258 friend class IObserver;
260 template <
typename ...TArgs>
263 template <
typename ...TArgs>
322 template <
typename ...TArgs>
411 template <
typename ...TArgs>
457 friend class Signal<TArgs...>;
460 template <
typename ...TArgs>
462 assert(!observer.expired() &&
"Cannot register a null pointer as an observer");
465 template <
typename ...TArgs>
468 std::vector<std::weak_ptr<
SignalObserver_<TArgs...>>> expiredObservers {};
473 (*activeObserver)(args...);
477 expiredObservers.push_back(observer);
482 for(
auto expiredObserver: expiredObservers) {
487 template <
typename ...TArgs>
491 template <
typename ...TArgs>
496 template <
typename ...TArgs>
498 std::shared_ptr<ISignal> newSignal {
new Signal_<TArgs...>{} };
501 return std::static_pointer_cast<
Signal_<TArgs...>>(newSignal);
503 template <
typename ...TArgs>
505 std::shared_ptr<ISignalObserver> newObserver {
new SignalObserver_<TArgs...>{callback} };
508 return std::static_pointer_cast<
SignalObserver_<TArgs...>>(newObserver);
510 template <
typename ...TArgs>
514 template <
typename ...TArgs>
518 template <
typename ...TArgs>
522 template <
typename ...TArgs>
527 template <
typename ...TArgs>
531 template <
typename ...TArgs>
533 assert(callback &&
"Empty callback is not allowed");
536 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:488
void operator()(TArgs... args)
The function called by a Signal this oberver is subscribed to.
Definition signals.hpp:492
A SignalObserver object, which can subscribe to Signals matching its data signature and receive signa...
Definition signals.hpp:412
std::shared_ptr< SignalObserver_< TArgs... > > mSignalObserver_
The underlying implementation of the observer template.
Definition signals.hpp:455
SignalObserver(SignalTracker &owningTracker, const std::string &name, std::function< void(TArgs...)> callback)
Creates a new SignalObserver object.
Definition signals.hpp:528
void resetObserver(SignalTracker &owningTracker, const std::string &name, std::function< void(TArgs...)> callback)
Reinitializes this observer with a new SignalTracker.
Definition signals.hpp:532
void connectTo(Signal< TArgs... > &signal)
Subscribes this SignalObserver to a Signal whose signature matches its own.
Definition signals.hpp:537
A signal tracker, the main interface between an object and the signal system.
Definition signals.hpp:161
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:250
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:504
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:256
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:497
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:461
void emit(TArgs... args)
Method via which the owner of the signal can send data to the signal's obervers.
Definition signals.hpp:466
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:323
void resetSignal(SignalTracker &owningTracker, const std::string &name)
Reinitializes the tracker with a new owning SignalTracker.
Definition signals.hpp:519
std::shared_ptr< Signal_< TArgs... > > mSignal_
The actual object connected with this Signal's signal tracker, hidden from users of Signal.
Definition signals.hpp:370
void registerObserver(SignalObserver< TArgs... > &observer)
Registers a compatible SignalObserver as a subscriber of this Signal.
Definition signals.hpp:523
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:515
Signal(SignalTracker &owningTracker, const std::string &name)
Constructs a Signal object and associates it with its SignalTracker.
Definition signals.hpp:511
Namespace containing all class definitions and functions related to the ToyMaker engine.
Definition camera_system.hpp:20