37 #include <Pt/Function.h>
38 #include <Pt/Method.h>
39 #include <Pt/ConstMethod.h>
40 #include <Pt/Connectable.h>
45 class PT_API SignalBase :
public Connectable
50 Sentry(SignalBase* signal);
58 bool operator!()
const
59 {
return _signal == 0; }
69 SignalBase& operator=(
const SignalBase& other);
71 virtual void onConnectionOpen(
const Connection& c);
73 virtual void onConnectionClose(
const Connection& c);
76 void disconnectSlots();
78 void disconnectSlot(
const Slot&);
188 template <
typename... As>
202 SignalBase::operator=(rhs);
210 template <
typename R>
220 this->disconnectSlots();
225 template <
typename R>
228 this->disconnectSlot(slot);
239 if( Connectable::connections().empty() )
242 SignalBase::Sentry sentry(
this);
244 std::list<Connection>::const_iterator it = Connectable::connections().begin();
245 std::list<Connection>::const_iterator last = --Connectable::connections().end();
248 if( it->isValid() && it->sender() ==
this )
251 static_cast<const InvokableT*
>( it->callable() );
252 invokable->
invoke(args...);
282 template <
typename... As>
289 : _method( signal, &
Signal<As...>::send )
307 _method.object().onConnectionOpen(c);
313 _method.object().onConnectionClose(c);
320 return ss ? (_method == ss->_method) :
false;
331 template <
typename... As>
341 template <
typename R,
typename... As>
351 template <
typename R,
typename... As>
357 struct PT_API CompareEventTypeInfo
359 bool operator()(
const std::type_info* t1,
360 const std::type_info* t2 )
const;
364 class PT_API Signal<const
Pt::Event&> :
public Connectable
365 ,
protected NonCopyable
369 Sentry(Signal* signal);
377 bool operator!()
const
378 {
return _signal == 0; }
387 IEventRoute(Connection& target)
391 virtual ~IEventRoute() {}
395 typedef Invokable<const Pt::Event&> InvokableT;
396 const InvokableT* invokable =
static_cast<const InvokableT*
>( _target.callable() );
397 invokable->invoke(ev);
400 Connection& connection()
404 {
return _target.isValid(); }
410 template <
typename EventT>
411 class EventRoute :
public IEventRoute
414 EventRoute(Connection& target)
415 : IEventRoute(target)
420 typedef Invokable<const Pt::Event&> InvokableT;
421 const InvokableT* invokable =
static_cast<const InvokableT*
>( connection().callable() );
423 const EventT&
event =
static_cast<const EventT&
>(ev);
424 invokable->invoke(event);
428 typedef std::multimap<
const std::type_info*,
430 CompareEventTypeInfo > RouteMap;
439 template <
typename EventT>
440 Connection connect(
const BasicSlot<void, const EventT&>& slot )
442 Connection conn( *
this, slot.clone() );
443 EventT* selectAddRouteOverload = 0;
444 this->addRoute(conn, selectAddRouteOverload);
450 template <
typename R,
typename EventT>
451 void disconnect(
const BasicSlot<R, const EventT&>& slot)
453 this->removeRoute(slot);
456 virtual void onConnectionOpen(
const Connection& c);
458 virtual void onConnectionClose(
const Connection& c);
461 void addRoute(Connection& conn,
const Pt::Event*)
463 this->addRoute( 0,
new IEventRoute(conn) );
466 template <
typename EventT>
467 void addRoute(Connection& conn,
const EventT*)
469 const std::type_info& ti =
typeid(EventT);
470 this->addRoute( &ti,
new EventRoute<EventT>(conn) );
473 void addRoute(
const std::type_info* ti, IEventRoute* route);
475 void removeRoute(
const Slot& slot);
492 void removeRoute(
const std::type_info* ti,
const Slot& slot);
502 template <
typename R,
class EventT>
503 Connection operator +=(Signal<const Pt::Event&>& signal,
const BasicSlot<R, EventT>& slot)
505 return signal.connect( slot );
508 template <
typename R>
509 Connection operator +=(Signal<const Pt::Event&>& signal,
const BasicSlot<R, const Pt::Event&>& slot)
511 return signal.connect( slot );
515 template <
typename R,
class EventT>
516 void operator -=(Signal<const Pt::Event&>& signal,
const BasicSlot<R, EventT>& slot)
518 signal.disconnect( slot );
521 template <
typename R>
522 void operator -=(Signal<const Pt::Event&>& signal,
const BasicSlot<R, const Pt::Event&>& slot)
524 signal.disconnect( slot );