7 #ifndef _QITYPE_DETAIL_SIGNAL_HXX_
8 #define _QITYPE_DETAIL_SIGNAL_HXX_
12 #include <boost/bind.hpp>
18 template <
typename F,
typename Arg0,
typename... Args>
22 connect(
qi::bind(std::forward<F>(func), std::forward<Arg0>(arg0), std::forward<Args>(args)...));
29 auto execContext = executionContext();
46 template<
class ForcedSignalType,
class SignalType>
47 SignalSubscriber SignalF<T>::connectSignal(SignalType& signal)
51 createNewTrackLink(curId, trackLink);
53 boost::weak_ptr<SignalBasePrivate> maybeThisSignalPrivate(this->_p);
55 auto onSignalLost = [=]{
56 if (
auto thisSignalPrivate = maybeThisSignalPrivate.lock())
58 disconnectTrackLink(curId);
63 std::move(onSignalLost),
64 static_cast<ForcedSignalType&>(signal),
65 boost::weak_ptr<SignalBasePrivate>(signal._p));
67 SignalSubscriber s = connect(std::move(forwardSignalCall));
77 return connectSignal<boost::function<U>>(signal);
81 template <
typename... P>
84 typedef void(ftype)(P...);
85 return connectSignal<boost::function<ftype>>(signal);
113 return connect(SignalSubscriber(obj, slot));
122 static_assert(
sizeof(T) < 0,
"You can't instanciate BounceToSignalBase");
128 #define pushArg(z, n, _) \
129 args.push_back(AutoAnyReference(p ##n));
130 #define makeBounce(n, argstypedecl, argstype, argsdecl, argsues, comma) \
131 template<typename R comma argstypedecl> \
132 class BounceToSignalBase<R(argstype)> { \
134 BounceToSignalBase(SignalBase& signalBase) : signalBase(signalBase) {} \
135 R operator()(argsdecl) { \
136 AnyReferenceVector args; \
137 BOOST_PP_REPEAT(n, pushArg, _); \
138 signalBase.trigger(args); \
141 SignalBase& signalBase; \
151 :
SignalF(nullptr, std::move(onSubscribers))
167 return detail::functionArgumentsSignature<T>();
170 #endif // _QITYPE_DETAIL_SIGNAL_HXX_
auto trackWithFallback(boost::function< void()> onFail, F &&f, T &&toTrack) -> decltype(detail::BindTransform< T >::wrap(std::forward< T >(toTrack), std::forward< F >(f), std::move(onFail)))
BounceToSignalBase(SignalBase &sb)
void _setSignature(const Signature &s)
Honor the default behavior.
virtual qi::Signature signature() const
boost::function< Future< void >(bool)> OnSubscribers
Force a synchronous call.
#define makeBounce(n, argstypedecl, argstype, argsdecl, argsues, comma)
SignalSubscriber connect(boost::function< F > func)
Object< Empty > AnyObject
static AnyFunction from(F &&func)
SignalSubscriber connect(...)
SignalF(OnSubscribers onSubscribers=OnSubscribers())
std::enable_if< std::is_function< RF >::value, boost::function< RF > >::type bind(AF &&fun, Arg0 &&arg0, Args &&...args)