36 #include <Pt/Function.h>
37 #include <Pt/Method.h>
38 #include <Pt/ConstMethod.h>
39 #include <Pt/Connectable.h>
44 class PT_API SignalBase :
public Connectable
49 Sentry(SignalBase* signal);
57 bool operator!()
const
58 {
return _signal == 0; }
68 SignalBase& operator=(
const SignalBase& other);
70 virtual void onConnectionOpen(
const Connection& c);
72 virtual void onConnectionClose(
const Connection& c);
75 void disconnectSlots();
77 void disconnectSlot(
const Slot&);
85 #include <Pt/Signal.tpp>
87 struct PT_API CompareEventTypeInfo
89 bool operator()(
const std::type_info* t1,
90 const std::type_info* t2 )
const;
94 class PT_API Signal<const
Pt::Event&> :
public Connectable
95 ,
protected NonCopyable
99 Sentry(Signal* signal);
107 bool operator!()
const
108 {
return _signal == 0; }
117 IEventRoute(Connection& target)
121 virtual ~IEventRoute() {}
125 typedef Invokable<const Pt::Event&> InvokableT;
126 const InvokableT* invokable =
static_cast<const InvokableT*
>( _target.slot()->callable() );
127 invokable->invoke(ev);
130 Connection& connection()
134 {
return _target.isValid(); }
140 template <
typename EventT>
141 class EventRoute :
public IEventRoute
144 EventRoute(Connection& target)
145 : IEventRoute(target)
150 typedef Invokable<const Pt::Event&> InvokableT;
151 const InvokableT* invokable =
static_cast<const InvokableT*
>( connection().slot()->callable() );
153 const EventT&
event =
static_cast<const EventT&
>(ev);
154 invokable->invoke(event);
158 typedef std::multimap<
const std::type_info*,
160 CompareEventTypeInfo > RouteMap;
169 template <
typename EventT>
170 Connection connect(
const BasicSlot<void, const EventT&>& slot )
172 Connection conn( *
this, slot.clone() );
173 EventT* selectAddRouteOverload = 0;
174 this->addRoute(conn, selectAddRouteOverload);
180 template <
typename R,
typename EventT>
181 void disconnect(
const BasicSlot<R, const EventT&>& slot)
183 this->removeRoute(slot);
186 virtual void onConnectionOpen(
const Connection& c);
188 virtual void onConnectionClose(
const Connection& c);
191 void addRoute(Connection& conn,
const Pt::Event*)
193 this->addRoute( 0,
new IEventRoute(conn) );
196 template <
typename EventT>
197 void addRoute(Connection& conn,
const EventT*)
199 const std::type_info& ti =
typeid(EventT);
200 this->addRoute( &ti,
new EventRoute<EventT>(conn) );
203 void addRoute(
const std::type_info* ti, IEventRoute* route);
205 void removeRoute(
const Slot& slot);
222 void removeRoute(
const std::type_info* ti,
const Slot& slot);
232 template <
typename R,
class EventT>
233 Connection operator +=(Signal<const Pt::Event&>& signal,
const BasicSlot<R, EventT>& slot)
235 return signal.connect( slot );
238 template <
typename R>
239 Connection operator +=(Signal<const Pt::Event&>& signal,
const BasicSlot<R, const Pt::Event&>& slot)
241 return signal.connect( slot );
245 template <
typename R,
class EventT>
246 void operator -=(Signal<const Pt::Event&>& signal,
const BasicSlot<R, EventT>& slot)
248 signal.disconnect( slot );
251 template <
typename R>
252 void operator -=(Signal<const Pt::Event&>& signal,
const BasicSlot<R, const Pt::Event&>& slot)
254 signal.disconnect( slot );