39 #include "cafAssert.h" 45 #include <type_traits> 70 std::set<AbstractSignal*> emittedSignals()
const;
73 mutable std::set<AbstractSignal*> m_signals;
85 std::set<AbstractSignal*> observedSignals()
const;
87 void removeObservedSignal(
AbstractSignal* signalToRemove )
const noexcept;
90 void disconnectAllSignals() noexcept;
93 mutable std::set<AbstractSignal*> m_signals;
102 template <
typename... Args>
106 using MemberCallback = std::function<void(
const SignalEmitter*, Args... args )>;
110 : m_emitter( emitter )
112 m_emitter->addEmittedSignal(
this );
117 for (
auto& [observer, callback] : m_observerCallbacks )
119 observer->removeObservedSignal(
this );
123 template <
typename ClassType>
124 void connect( ClassType* observer,
void ( ClassType::*method )(
const SignalEmitter*, Args... args ) )
126 MemberCallback lambda = [=](
const SignalEmitter* emitter, Args... args )
129 ( observer->*method )( emitter, args... );
131 connect( observer, lambda );
134 template <
typename ClassType>
135 void connect( ClassType* observer,
const MemberCallback& callback )
137 static_assert( std::is_convertible<ClassType*, SignalObserver*>::value,
138 "Only classes that inherit SignalObserver can connect as an observer of a Signal." );
139 m_observerCallbacks[observer] = callback;
140 observer->addObservedSignal(
this );
150 m_observerCallbacks.erase( observer );
151 observer->removeObservedSignal(
this );
154 void send( Args... args )
const 156 auto observerCallBacksCopy = m_observerCallbacks;
157 for (
const auto& [observer, callback] : observerCallBacksCopy )
159 callback( m_emitter, args... );
163 size_t observerCount()
const {
return m_observerCallbacks.size(); }
168 auto it = m_observerCallbacks.find( observer );
169 return it != m_observerCallbacks.end();
177 using TransparentComparator = std::less<>;
178 std::map<SignalObserver*, MemberCallback, TransparentComparator> m_observerCallbacks;
Definition: cafSignal.h:52
Definition: cafSignal.h:80
Definition: cafSignal.h:63
Definition: cafSignal.h:103
Main Caffa namespace.
Definition: cafApplication.h:30