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>
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>
130 template<
class F0,
class F1,
class F2,
class F3,
class F4,
class F5,
class 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>
172 template<
class F0,
class F1,
class F2,
class 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>
264 template<
class F0,
class F1,
class F2,
class F3,
class F4,
class 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, _1)));
291 input_connections_[1] = f1.registerCallback(boost::function<
void(
const M1Event&)>(boost::bind(&Synchronizer::template cb<1>,
this, _1)));
292 input_connections_[2] = f2.registerCallback(boost::function<
void(
const M2Event&)>(boost::bind(&Synchronizer::template cb<2>,
this, _1)));
293 input_connections_[3] = f3.registerCallback(boost::function<
void(
const M3Event&)>(boost::bind(&Synchronizer::template cb<3>,
this, _1)));
294 input_connections_[4] = f4.registerCallback(boost::function<
void(
const M4Event&)>(boost::bind(&Synchronizer::template cb<4>,
this, _1)));
295 input_connections_[5] = f5.registerCallback(boost::function<
void(
const M5Event&)>(boost::bind(&Synchronizer::template cb<5>,
this, _1)));
296 input_connections_[6] = f6.registerCallback(boost::function<
void(
const M6Event&)>(boost::bind(&Synchronizer::template cb<6>,
this, _1)));
297 input_connections_[7] = f7.registerCallback(boost::function<
void(
const M7Event&)>(boost::bind(&Synchronizer::template cb<7>,
this, _1)));
298 input_connections_[8] = f8.registerCallback(boost::function<
void(
const M8Event&)>(boost::bind(&Synchronizer::template cb<8>,
this, _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>
322 return signal_.addCallback(callback, t);
329 void signal(
const M0Event& e0,
const M1Event& e1,
const M2Event& e2,
const M3Event& e3,
const M4Event& e4,
330 const M5Event& e5,
const M6Event& e6,
const M7Event& e7,
const M8Event& e8)
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 Synchronizer(const Policy &policy, F0 &f0, F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5)
Synchronizer(const Policy &policy, F0 &f0, F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 &f6, F7 &f7, F8 &f8)
Synchronizer(F0 &f0, F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 &f6)
void setName(const std::string &name)
Connection registerCallback(const C &callback)
mpl::vector< ros::MessageEvent< M0 const >, ros::MessageEvent< M1 const >, ros::MessageEvent< M2 const >, ros::MessageEvent< M3 const >, ros::MessageEvent< M4 const >, ros::MessageEvent< M5 const >, ros::MessageEvent< M6 const >, ros::MessageEvent< M7 const >, ros::MessageEvent< M8 const > > Events
void add(const boost::shared_ptr< typename mpl::at_c< Messages, i >::type const > &msg)
Policy::Messages Messages
mpl::at_c< Messages, 7 >::type M7
mpl::at_c< Messages, 6 >::type M6
mpl::at_c< Events, 6 >::type M6Event
Synchronizer(const Policy &policy, F0 &f0, F1 &f1, F2 &f2, F3 &f3)
mpl::at_c< Messages, 4 >::type M4
Connection input_connections_[MAX_MESSAGES]
mpl::at_c< Events, 7 >::type M7Event
void signal(const M0Event &e0, const M1Event &e1, const M2Event &e2, const M3Event &e3, const M4Event &e4, const M5Event &e5, const M6Event &e6, const M7Event &e7, const M8Event &e8)
void connectInput(F0 &f0, F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5)
void connectInput(F0 &f0, F1 &f1, F2 &f2, F3 &f3, F4 &f4)
void disconnect()
disconnects this connection
mpl::at_c< Events, 1 >::type M1Event
mpl::fold< Messages, mpl::int_< 0 >, mpl::if_< mpl::not_< boost::is_same< mpl::_2, NullType > >, mpl::next< mpl::_1 >, mpl::_1 > >::type RealTypeCount
void connectInput(F0 &f0, F1 &f1, F2 &f2)
Connection registerCallback(C &callback, T *t)
mpl::at_c< Events, 3 >::type M3Event
mpl::at_c< Events, 5 >::type M5Event
Signal9< M0, M1, M2, M3, M4, M5, M6, M7, M8 > Signal
Connection registerCallback(const C &callback, T *t)
const std::string & getName()
static const uint8_t MAX_MESSAGES
Synchronizer(const Policy &policy, F0 &f0, F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 &f6, F7 &f7)
mpl::at_c< Events, 5 >::type M5Event
mpl::at_c< Events, 2 >::type M2Event
Connection registerCallback(C &callback)
mpl::at_c< Messages, 2 >::type M2
void cb(const typename mpl::at_c< Events, i >::type &evt)
void connectInput(F0 &f0, F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 &f6, F7 &f7)
Synchronizer(F0 &f0, F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5)
Synchronizer(F0 &f0, F1 &f1, F2 &f2, F3 &f3, F4 &f4)
mpl::vector< M0, M1, M2, M3, M4, M5, M6, M7, M8 > Messages
mpl::at_c< Messages, 8 >::type M8
mpl::at_c< Messages, 3 >::type M3
Synchronizer(F0 &f0, F1 &f1, F2 &f2)
Synchronizer(const Policy &policy, F0 &f0, F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 &f6)
Synchronizer(F0 &f0, F1 &f1, F2 &f2, F3 &f3)
mpl::at_c< Events, 0 >::type M0Event
mpl::at_c< Events, 0 >::type M0Event
void connectInput(F0 &f0, F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 &f6)
mpl::at_c< Events, 3 >::type M3Event
void connectInput(F0 &f0, F1 &f1)
Synchronizer(const Policy &policy)
void connectInput(F0 &f0, F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 &f6, F7 &f7, F8 &f8)
Synchronizer(const Policy &policy, F0 &f0, F1 &f1)
mpl::at_c< Events, 4 >::type M4Event
mpl::at_c< Events, 1 >::type M1Event
mpl::at_c< Messages, 0 >::type M0
Synchronizer(F0 &f0, F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 &f6, F7 &f7)
mpl::at_c< Events, 8 >::type M8Event
mpl::at_c< Messages, 1 >::type M1
Encapsulates a connection from one filter to another (or to a user-specified callback) ...
mpl::at_c< Events, 7 >::type M7Event
mpl::at_c< Events, 4 >::type M4Event
mpl::at_c< Messages, 5 >::type M5
Synchronizer(const Policy &policy, F0 &f0, F1 &f1, F2 &f2, F3 &f3, F4 &f4)
void connectInput(F0 &f0, F1 &f1, F2 &f2, F3 &f3)
Synchronizer(F0 &f0, F1 &f1, F2 &f2, F3 &f3, F4 &f4, F5 &f5, F6 &f6, F7 &f7, F8 &f8)
mpl::at_c< Events, 2 >::type M2Event
mpl::at_c< Events, 8 >::type M8Event
Synchronizer(const Policy &policy, F0 &f0, F1 &f1, F2 &f2)
Synchronizer(F0 &f0, F1 &f1)
mpl::at_c< Events, 6 >::type M6Event