35 #ifndef MESSAGE_FILTERS_SYNCHRONIZER_H
36 #define MESSAGE_FILTERS_SYNCHRONIZER_H
38 #include <boost/tuple/tuple.hpp>
39 #include <boost/shared_ptr.hpp>
40 #include <boost/function.hpp>
41 #include <boost/thread/mutex.hpp>
43 #include <boost/bind.hpp>
44 #include <boost/type_traits/is_same.hpp>
45 #include <boost/noncopyable.hpp>
46 #include <boost/mpl/or.hpp>
47 #include <boost/mpl/at.hpp>
48 #include <boost/mpl/vector.hpp>
49 #include <boost/function_types/function_arity.hpp>
50 #include <boost/function_types/is_nonmember_callable_builtin.hpp>
65 namespace mpl = boost::mpl;
67 template<
class Policy>
68 class Synchronizer :
public boost::noncopyable,
public Policy
71 typedef typename Policy::Messages
Messages;
72 typedef typename Policy::Events
Events;
73 typedef typename Policy::Signal
Signal;
74 typedef typename mpl::at_c<Messages, 0>::type
M0;
75 typedef typename mpl::at_c<Messages, 1>::type
M1;
76 typedef typename mpl::at_c<Messages, 2>::type
M2;
77 typedef typename mpl::at_c<Messages, 3>::type
M3;
78 typedef typename mpl::at_c<Messages, 4>::type
M4;
79 typedef typename mpl::at_c<Messages, 5>::type
M5;
80 typedef typename mpl::at_c<Messages, 6>::type
M6;
81 typedef typename mpl::at_c<Messages, 7>::type
M7;
82 typedef typename mpl::at_c<Messages, 8>::type
M8;
83 typedef typename mpl::at_c<Events, 0>::type
M0Event;
84 typedef typename mpl::at_c<Events, 1>::type
M1Event;
85 typedef typename mpl::at_c<Events, 2>::type
M2Event;
86 typedef typename mpl::at_c<Events, 3>::type
M3Event;
87 typedef typename mpl::at_c<Events, 4>::type
M4Event;
88 typedef typename mpl::at_c<Events, 5>::type
M5Event;
89 typedef typename mpl::at_c<Events, 6>::type
M6Event;
90 typedef typename mpl::at_c<Events, 7>::type
M7Event;
91 typedef typename mpl::at_c<Events, 8>::type
M8Event;
95 template<
class F0,
class F1>
102 template<
class F0,
class F1,
class F2>
109 template<
class F0,
class F1,
class F2,
class F3>
116 template<
class F0,
class F1,
class F2,
class F3,
class F4>
123 template<
class F0,
class F1,
class F2,
class F3,
class F4,
class F5>
124 Synchronizer(F0& f0, F1& f1, F2& f2, F3& f3, F4& f4, F5& f5)
130 template<
class F0,
class F1,
class F2,
class F3,
class F4,
class F5,
class F6>
131 Synchronizer(F0& f0, F1& f1, F2& f2, F3& f3, F4& f4, F5& f5, F6& f6)
137 template<
class F0,
class F1,
class F2,
class F3,
class F4,
class F5,
class F6,
class F7>
138 Synchronizer(F0& f0, F1& f1, F2& f2, F3& f3, F4& f4, F5& f5, F6& f6, F7& f7)
144 template<
class F0,
class F1,
class F2,
class F3,
class F4,
class F5,
class F6,
class F7,
class F8>
145 Synchronizer(F0& f0, F1& f1, F2& f2, F3& f3, F4& f4, F5& f5, F6& f6, F7& f7, F8& f8)
156 template<
class F0,
class F1>
164 template<
class F0,
class F1,
class F2>
165 Synchronizer(
const Policy& policy, F0& f0, F1& f1, F2& f2)
172 template<
class F0,
class F1,
class F2,
class F3>
173 Synchronizer(
const Policy& policy, F0& f0, F1& f1, F2& f2, F3& f3)
180 template<
class F0,
class F1,
class F2,
class F3,
class F4>
181 Synchronizer(
const Policy& policy, F0& f0, F1& f1, F2& f2, F3& f3, F4& f4)
188 template<
class F0,
class F1,
class F2,
class F3,
class F4,
class F5>
189 Synchronizer(
const Policy& policy, F0& f0, F1& f1, F2& f2, F3& f3, F4& f4, F5& f5)
196 template<
class F0,
class F1,
class F2,
class F3,
class F4,
class F5,
class F6>
197 Synchronizer(
const Policy& policy, F0& f0, F1& f1, F2& f2, F3& f3, F4& f4, F5& f5, F6& f6)
204 template<
class F0,
class F1,
class F2,
class F3,
class F4,
class F5,
class F6,
class F7>
205 Synchronizer(
const Policy& policy, F0& f0, F1& f1, F2& f2, F3& f3, F4& f4, F5& f5, F6& f6, F7& f7)
212 template<
class F0,
class F1,
class F2,
class F3,
class F4,
class F5,
class F6,
class F7,
class F8>
213 Synchronizer(
const Policy& policy, F0& f0, F1& f1, F2& f2, F3& f3, F4& f4, F5& f5, F6& f6, F7& f7, F8& f8)
233 Policy::initParent(
this);
236 template<
class F0,
class F1>
243 template<
class F0,
class F1,
class F2>
250 template<
class F0,
class F1,
class F2,
class F3>
257 template<
class F0,
class F1,
class F2,
class F3,
class F4>
258 void connectInput(F0& f0, F1& f1, F2& f2, F3& f3, F4& f4)
264 template<
class F0,
class F1,
class F2,
class F3,
class F4,
class F5>
265 void connectInput(F0& f0, F1& f1, F2& f2, F3& f3, F4& f4, F5& f5)
271 template<
class F0,
class F1,
class F2,
class F3,
class F4,
class F5,
class F6>
272 void connectInput(F0& f0, F1& f1, F2& f2, F3& f3, F4& f4, F5& f5, F6& f6)
278 template<
class F0,
class F1,
class F2,
class F3,
class F4,
class F5,
class F6,
class F7>
279 void connectInput(F0& f0, F1& f1, F2& f2, F3& f3, F4& f4, F5& f5, F6& f6, F7& f7)
285 template<
class F0,
class F1,
class F2,
class F3,
class F4,
class F5,
class F6,
class F7,
class F8>
286 void connectInput(F0& f0, F1& f1, F2& f2, F3& f3, F4& f4, F5& f5, F6& f6, F7& f7, F8& f8)
290 input_connections_[0] = f0.registerCallback(boost::function<
void(
const M0Event&)>(boost::bind(&Synchronizer::template cb<0>,
this, boost::placeholders::_1)));
291 input_connections_[1] = f1.registerCallback(boost::function<
void(
const M1Event&)>(boost::bind(&Synchronizer::template cb<1>,
this, boost::placeholders::_1)));
292 input_connections_[2] = f2.registerCallback(boost::function<
void(
const M2Event&)>(boost::bind(&Synchronizer::template cb<2>,
this, boost::placeholders::_1)));
293 input_connections_[3] = f3.registerCallback(boost::function<
void(
const M3Event&)>(boost::bind(&Synchronizer::template cb<3>,
this, boost::placeholders::_1)));
294 input_connections_[4] = f4.registerCallback(boost::function<
void(
const M4Event&)>(boost::bind(&Synchronizer::template cb<4>,
this, boost::placeholders::_1)));
295 input_connections_[5] = f5.registerCallback(boost::function<
void(
const M5Event&)>(boost::bind(&Synchronizer::template cb<5>,
this, boost::placeholders::_1)));
296 input_connections_[6] = f6.registerCallback(boost::function<
void(
const M6Event&)>(boost::bind(&Synchronizer::template cb<6>,
this, boost::placeholders::_1)));
297 input_connections_[7] = f7.registerCallback(boost::function<
void(
const M7Event&)>(boost::bind(&Synchronizer::template cb<7>,
this, boost::placeholders::_1)));
298 input_connections_[8] = f8.registerCallback(boost::function<
void(
const M8Event&)>(boost::bind(&Synchronizer::template cb<8>,
this, boost::placeholders::_1)));
304 return signal_.addCallback(callback);
310 return signal_.addCallback(callback);
313 template<
class C,
typename T>
316 return signal_.addCallback(callback, t);
319 template<
class C,
typename T>
332 signal_.call(e0, e1, e2, e3, e4, e5, e6, e7, e8);
335 Policy*
getPolicy() {
return static_cast<Policy*
>(
this); }
342 this->
template add<i>(
typename mpl::at_c<Events, i>::type(msg));
356 void cb(
const typename mpl::at_c<Events, i>::type& evt)
358 this->
template add<i>(evt);
370 template<
typename M0,
typename M1,
typename M2,
typename M3,
typename M4,
371 typename M5,
typename M6,
typename M7,
typename M8>
374 typedef mpl::vector<M0, M1, M2, M3, M4, M5, M6, M7, M8>
Messages;
379 typedef typename mpl::fold<Messages, mpl::int_<0>, mpl::if_<mpl::not_<boost::is_same<mpl::_2, NullType> >, mpl::next<mpl::_1>, mpl::_1> >::type
RealTypeCount;
380 typedef typename mpl::at_c<Events, 0>::type
M0Event;
381 typedef typename mpl::at_c<Events, 1>::type
M1Event;
382 typedef typename mpl::at_c<Events, 2>::type
M2Event;
383 typedef typename mpl::at_c<Events, 3>::type
M3Event;
384 typedef typename mpl::at_c<Events, 4>::type
M4Event;
385 typedef typename mpl::at_c<Events, 5>::type
M5Event;
386 typedef typename mpl::at_c<Events, 6>::type
M6Event;
387 typedef typename mpl::at_c<Events, 7>::type
M7Event;
388 typedef typename mpl::at_c<Events, 8>::type
M8Event;
393 #endif // MESSAGE_FILTERS_SYNCHRONIZER_H