libqi-api  2.4.3.28
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
signal.hxx
Go to the documentation of this file.
1 #pragma once
2 /*
3 ** Copyright (C) 2013 Aldebaran Robotics
4 ** See COPYING for the license
5 */
6 
7 #ifndef _QITYPE_DETAILS_SIGNAL_HXX_
8 #define _QITYPE_DETAILS_SIGNAL_HXX_
9 
10 #include <qi/trackable.hpp>
12 #include <boost/bind.hpp>
14 
15 namespace qi
16 {
17  template <typename T>
18  template <typename ARG0>
19  inline typename boost::enable_if<
20  boost::is_base_of<Actor, typename detail::Unwrap<ARG0>::type>,
21  SignalSubscriber&>::type
22  SignalF<T>::_connectMaybeActor(const ARG0& arg0,
23  const boost::function<T>& cb,
24  const boost::function<void()>& fallbackCb)
25  {
26  SignalSubscriber& s = connect(qi::trackWithFallback(
27  fallbackCb, boost::function<void()>(boost::bind(
29  detail::Unwrap<ARG0>::unwrap(arg0)->strand(), cb)),
30  arg0));
31  // skip a bounce because we schedule on a strand, call will be async
32  // anyway
33  s.setCallType(MetaCallType_Direct);
34  return s;
35  }
36  template <typename T>
37  template <typename ARG0>
38  inline typename boost::disable_if<
39  boost::is_base_of<Actor, typename detail::Unwrap<ARG0>::type>,
40  SignalSubscriber&>::type
41  SignalF<T>::_connectMaybeActor(const ARG0& arg0,
42  const boost::function<T>& cb,
43  const boost::function<void()>& fallbackCb)
44  {
45  return connect(qi::trackWithFallback(fallbackCb, cb, arg0));
46  }
47 
48 #define genConnect(n, ATYPEDECL, ATYPES, ADECL, AUSE, comma) \
49  template <typename T> \
50  template <typename F, typename P comma ATYPEDECL> \
51  SignalSubscriber& SignalF<T>::connect(const F& func, \
52  const P& p comma ADECL) \
53  { \
54  int curId; \
55  SignalLink* trackLink; \
56  createNewTrackLink(curId, trackLink); \
57  SignalSubscriber& s = _connectMaybeActor<P>( \
58  p, qi::bind<T>(func, p comma AUSE), \
59  qi::track(boost::function<void()>(boost::bind( \
60  &SignalF<T>::disconnectTrackLink, this, curId)), \
61  boost::weak_ptr<SignalBasePrivate>(_p))); \
62  *trackLink = s; \
63  return s; \
64  }
66 #undef genConnect
67 
68  template<typename T>
70  {
72  }
73  template<typename T>
75  {
76  return SignalBase::connect(sub);
77  }
78  template<typename T>
79  template<typename U>
80  SignalSubscriber& SignalF<T>::connect(SignalF<U>& signal)
81  {
82  int curId;
83  SignalLink* trackLink;
84  createNewTrackLink(curId, trackLink);
85  SignalSubscriber& s = connect(qi::trackWithFallback(
86  boost::bind(&SignalF<T>::disconnectTrackLink, this, curId),
87  (boost::function<U>&)signal,
88  boost::weak_ptr<SignalBasePrivate>(signal._p)));
89  *trackLink = s;
90  return s;
91  }
92 
93  template<typename T>
94  template<QI_SIGNAL_TEMPLATE_DECL>
95  SignalSubscriber& SignalF<T>::connect(Signal<QI_SIGNAL_TEMPLATE>& signal)
96  {
97  typedef typename detail::VoidFunctionType<QI_SIGNAL_TEMPLATE>::type ftype;
98  int curId;
99  SignalLink* trackLink;
100  createNewTrackLink(curId, trackLink);
101  SignalSubscriber& s = connect(qi::trackWithFallback(
102  boost::bind(&SignalF<T>::disconnectTrackLink, this, curId),
103  (boost::function<ftype>&)signal,
104  boost::weak_ptr<SignalBasePrivate>(signal._p)));
105  *trackLink = s;
106  return s;
107  }
108 
109  template<typename T>
110  SignalSubscriber& SignalF<T>::connect(const boost::function<T>& fun)
111  {
112  return connect(AnyFunction::from(fun));
113  }
114  template<typename F>
115  SignalSubscriber& SignalBase::connect(const boost::function<F>& fun)
116  {
117  return connect(AnyFunction::from(fun));
118  }
119  template<typename T>
120  template<typename CALLABLE>
122  {
123  return connect((boost::function<T>)c);
124  }
125  template<typename T>
126  SignalSubscriber& SignalF<T>::connect(const AnyObject& obj, const std::string& slot)
127  {
128  return SignalBase::connect(obj, slot);
129  }
130 
131  template<typename T>
132  SignalSubscriber& SignalF<T>::connect(const AnyObject& obj, unsigned int slot)
133  {
134  return connect(SignalSubscriber(obj, slot));
135  }
136 
137  namespace detail
138  {
139 
140  template<typename T> class BounceToSignalBase
141  {
142  // This default should not be instanciated
143  BOOST_STATIC_ASSERT(sizeof(T) < 0);
144  public:
146  {
147  }
148  };
149  #define pushArg(z, n, _) \
150  args.push_back(AutoAnyReference(p ##n));
151  #define makeBounce(n, argstypedecl, argstype, argsdecl, argsues, comma) \
152  template<typename R comma argstypedecl> \
153  class BounceToSignalBase<R(argstype)> { \
154  public: \
155  BounceToSignalBase(SignalBase& signalBase) : signalBase(signalBase) {} \
156  R operator()(argsdecl) { \
157  AnyReferenceVector args; \
158  BOOST_PP_REPEAT(n, pushArg, _); \
159  signalBase.trigger(args); \
160  } \
161  private: \
162  SignalBase& signalBase; \
163  };
165  #undef makeBounce
166  #undef pushArg
167 
168  } // detail
169 
170  template<typename T>
172  : SignalBase(onSubscribers)
173  {
174  * (boost::function<T>*)this = detail::BounceToSignalBase<T>(*this);
175  _setSignature(detail::functionArgumentsSignature<T>());
176  }
177 
178 
179  template<typename T>
181  {
182  return detail::functionArgumentsSignature<T>();
183  }
184 
185  inline
187  {
188  threadingModel = ct;
189  return *this;
190  }
191 } // qi
192 #endif // _QITYPE_DETAILS_SIGNAL_HXX_
SignalSubscriber & setCallType(MetaCallType ct)
Definition: signal.hxx:186
static AnyFunction from(F func)
BounceToSignalBase(SignalBase &sb)
Definition: signal.hxx:145
boost::function< RF > bind(const AF &fun,...)
#define genConnect(n, ATYPEDECL, ATYPES, ADECL, AUSE, comma)
Definition: signal.hxx:48
void _setSignature(const Signature &s)
void post(const boost::function< void()> &callback)
post a callback to be executed as soon as possible
SignalSubscriber & connect(...)
Definition: signal.hxx:69
virtual qi::Signature signature() const
Definition: signal.hxx:180
Force a synchronous call.
Definition: typeobject.hpp:23
#define makeBounce(n, argstypedecl, argstype, argsdecl, argsues, comma)
Definition: signal.hxx:151
MetaCallType
Definition: typeobject.hpp:19
boost::function< void(bool)> OnSubscribers
Definition: signal.hpp:41
MetaCallType threadingModel
Definition: signal.hpp:295
boost::function< F > trackWithFallback(boost::function< void()> onFail, const boost::function< F > &f, const ARG0 &arg0)
Wrap given function f with a tracking check on arg0, which must be a weak pointer or a Trackable inst...
Definition: trackable.hxx:212
Object< Empty > AnyObject
Definition: anyobject.hpp:21
SignalSubscriber & connect(const boost::function< F > &func)
Definition: signal.hxx:115
qi::uint64_t SignalLink
Definition: signal.hpp:33
SignalF(OnSubscribers onSubscribers=OnSubscribers())
Definition: signal.hxx:171
#define QI_GEN(f)
Definition: preproc.hpp:476