37#include <Pt/Function.h>
39#include <Pt/ConstMethod.h>
40#include <Pt/Connectable.h>
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&);
188template <
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 )
250 const InvokableT* invokable =
251 static_cast<const InvokableT*
>( it->callable() );
252 invokable->
invoke(args...);
282template <
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;
331template <
typename... As>
341template <
typename R,
typename... As>
351template <
typename R,
typename... As>
357struct PT_API CompareEventTypeInfo
359 bool operator()(
const std::type_info* t1,
360 const std::type_info* t2 )
const;
364class 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() {}
393 virtual void route(
const Pt::Event& ev)
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)
418 virtual void route(
const Pt::Event& ev)
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;
437 void send(
const Pt::Event& ev);
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);
502template <
typename R,
class EventT>
505 return signal.connect(
slot );
511 return signal.connect(
slot );
515template <
typename R,
class EventT>
518 signal.disconnect(
slot );
524 signal.disconnect(
slot );
Base type for various "slot" types.
Definition Slot.h:92
Connection Management for Signal and Slot Objects.
Definition Connectable.h:50
Represents a connection between a Signal/Delegate and a slot.
Definition Connection.h:96
Connection()
Default Constructor.
Interface for invokable entities.
Definition Invokable.h:57
virtual void invoke(As... args) const =0
Invokes the invokable entity with the given arguments.
Adapter for class methods.
Definition Method.h:48
Wraps Signal objects so that they can act as Slots.
Definition Signal.h:284
SignalSlot(Signal< As... > &signal)
Constructs from signal.
Definition Signal.h:288
virtual const Callback * callable() const
Returns the callable converted to the type-erased Callback interface.
Definition Signal.h:299
virtual bool equals(const Slot &rhs) const
Returns true if two slots are equal in value.
Definition Signal.h:317
virtual void onConnect(const Connection &c)
Notifies of connects.
Definition Signal.h:305
virtual void onDisconnect(const Connection &c)
Notifies of disconnects.
Definition Signal.h:311
Slot * clone() const
Clone this object with new.
Definition Signal.h:293
Multicast Signal to call multiple slots.
Definition Signal.h:190
void disconnect(const BasicSlot< R, As... > &slot)
Disconnects from a slot.
Definition Signal.h:226
Signal()
Default constructor.
Definition Signal.h:196
void operator-=(Signal< As... > &signal, const BasicSlot< R, As... > &slot)
Disconnects a Signal fro a slot.
Definition Signal.h:352
void send(As... args)
Invlokes all slots.
Definition Signal.h:237
void disconnect()
Disconnects from current slots.
Definition Signal.h:218
Connection operator+=(Signal< As... > &signal, const BasicSlot< R, As... > &slot)
Connects a Signal to a slot.
Definition Signal.h:342
Connection connect(const BasicSlot< R, As... > &slot)
Connects to a slot.
Definition Signal.h:211
void operator()(As... args)
Invlokes all slots.
Definition Signal.h:268
Signal(const Signal &rhs)
Copy Constructor.
Definition Signal.h:200
Endpoint of a signal/slot connection.
Definition Slot.h:55
SignalSlot< As... > slot(Signal< As... > &signal)
Returns a slot object for the given signal.
Definition Signal.h:332
ConstMethodSlot< R, ClassT, As... > slot(ClassT &object, R(BaseT::*method)(As...) const)
Returns a slot object for the given object/member pair.
Definition ConstMethod.h:172
Core module.
Definition Allocator.h:33