38 #include "cafAssert.h"
44 #include <type_traits>
69 std::list<AbstractSignal*> emittedSignals()
const;
72 mutable std::list<AbstractSignal*> m_signals;
84 std::list<AbstractSignal*> observedSignals()
const;
86 void removeObservedSignal(
AbstractSignal* signalToRemove )
const noexcept;
89 void disconnectAllSignals() noexcept;
92 mutable std::list<AbstractSignal*> m_signals;
101 template <
typename... Args>
105 using MemberCallback = std::function<void(
const SignalEmitter*, Args... args )>;
106 using MemberCallbackAndActiveFlag = std::pair<MemberCallback, bool>;
110 : m_emitter( emitter )
112 m_emitter->addEmittedSignal(
this );
117 for (
auto observerCallbackPair : m_observerCallbacks )
119 observerCallbackPair.first->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] = std::make_pair( callback,
true );
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 (
auto observerCallbackPair : observerCallBacksCopy )
159 if ( observerCallbackPair.second.second )
161 observerCallbackPair.second.first( m_emitter, args... );
168 auto it = m_observerCallbacks.find( observer );
169 CAFFA_ASSERT( it != m_observerCallbacks.end() );
170 it->second.second =
false;
175 auto it = m_observerCallbacks.find( observer );
176 CAFFA_ASSERT( it != m_observerCallbacks.end() );
177 it->second.second =
true;
179 size_t observerCount()
const {
return m_observerCallbacks.size(); }
183 for (
const auto& observerPair : m_observerCallbacks )
185 if ( observerPair.first == observer )
return true;
195 std::map<SignalObserver*, MemberCallbackAndActiveFlag> m_observerCallbacks;
Definition: cafSignal.h:52
Definition: cafSignal.h:63
Definition: cafSignal.h:80
Definition: cafSignal.h:103
Main Caffa namespace.
Definition: __init__.py:1