106 template <
typename T,
typename... Args>
109 using Mf = void (T::*)(Args...) ;
112 Binder( T * sink , Mf mf ) :
117 void operator()( Args... args )
119 return (m_sink->*m_mf)( args... ) ;
128 template <
typename... Args>
131 std::function<void(Args...)> m_fn ;
132 Slot()
noexcept =
default;
133 template <
typename T>
Slot( T & sink ,
void (T::*mf)(Args...) ) :
137 void invoke( Args... args )
148 G_EXCEPTION_CLASS( AlreadyConnected ,
"already connected" ) ;
155 template <
typename... SlotArgs>
158 Slot<SlotArgs...> m_slot ;
160 bool m_emitted{
false} ;
161 explicit Signal(
bool once =
false ) :
167 if( m_slot.m_fn )
throw SignalImp::AlreadyConnected() ;
170 void disconnect()
noexcept
172 m_slot.m_fn = nullptr ;
173 G_ASSERT( !connected() ) ;
175 void emit( SlotArgs... args )
177 if( !m_once || !m_emitted )
181 m_slot.m_fn( args... ) ;
188 bool connected()
const
190 return !! m_slot.m_fn ;
195 void operator=(
const Signal & ) = delete ;
196 void operator=(
Signal && ) = delete ;
201 template <
typename TSink,
typename... Args>
Slot<Args...>
slot( TSink & sink ,
void (TSink::*method)(Args...) )
204 return Slot<Args...>( sink , method ) ;
208 using Signal0 = Signal<> ;
209 template <
typename T>
using Signal1 = Signal<T> ;
210 template <
typename T1,
typename T2>
using Signal2 = Signal<T1,T2> ;
211 template <
typename T1,
typename T2,
typename T3>
using Signal3 = Signal<T1,T2,T3> ;
212 template <
typename T1,
typename T2,
typename T3,
typename T4>
using Signal4 = Signal<T1,T2,T3,T4> ;
213 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
using Signal5 = Signal<T1,T2,T3,T4,T5> ;
214 using Slot0 = Slot<> ;
215 template <
typename T>
using Slot1 = Slot<T> ;
216 template <
typename T1,
typename T2>
using Slot2 = Slot<T1,T2> ;
217 template <
typename T1,
typename T2,
typename T3>
using Slot3 = Slot<T1,T2,T3> ;
218 template <
typename T1,
typename T2,
typename T3,
typename T4>
using Slot4 = Slot<T1,T2,T3,T4> ;
219 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
using Slot5 = Slot<T1,T2,T3,T4,T5> ;
Slot< Args... > slot(TSink &sink, void(TSink::*method)(Args...))
A factory function for Slot objects.
A functor class template that contains the target object pointer and method pointer,...
A slot/signal scoping class.
A slot holder, with connect() and emit() methods.
A slot class template that is parameterised only on the target method's signature (with an implicit v...