19 #ifndef __se3_visitor_hpp__ 20 #define __se3_visitor_hpp__ 22 #define BOOST_FUSION_INVOKE_MAX_ARITY 10 23 #include <boost/fusion/include/invoke.hpp> 24 #include <boost/fusion/include/algorithm.hpp> 25 #include "pinocchio/multibody/joint/joint-variant.hpp" 32 template<
typename T,
typename V>
33 typename result_of::push_front<V const, T>::type
34 append(T
const& t,V
const& v) {
return push_front(v,t); }
37 template<
typename T1,
typename T2,
typename V>
38 typename result_of::push_front<typename result_of::push_front<V const, T2>::type
const, T1>::type
39 append2(T1
const& t1,T2
const& t2,V
const& v) {
return push_front(push_front(v,t2),t1); }
50 template<
typename Visitor>
56 JointDataVariant& jdataSpec =
static_cast<const Visitor*
>(
this)->jdata;
58 bf::invoke(&Visitor::template algo<D>,
59 bf::append2(boost::ref(jmodel),
60 boost::ref(boost::get<typename D::JointDataDerived>(jdataSpec)),
61 static_cast<const Visitor*>(
this)->args));
64 template<
typename ArgsTmp>
65 static void run(
const JointModelVariant & jmodel,
66 JointDataVariant & jdata,
69 return boost::apply_visitor( Visitor(jdata,args),jmodel );
74 template<
typename Visitor>
80 bf::invoke(&Visitor::template algo<D>,
81 bf::append(boost::ref(jmodel),
82 static_cast<const Visitor*>(
this)->args));
85 template<
typename ArgsTmp>
86 static void run(
const JointModelVariant & jmodel,
89 return boost::apply_visitor( Visitor(args),jmodel );
96 #define JOINT_VISITOR_INIT(VISITOR) \ 97 VISITOR( JointDataVariant & jdata,ArgsType args ) : jdata(jdata),args(args) {} \ 98 using se3::fusion::JointVisitor< VISITOR >::run; \ 99 JointDataVariant & jdata; \ 103 #define JOINT_MODEL_VISITOR_INIT(VISITOR) \ 104 VISITOR(ArgsType args ) : args(args) {} \ 105 using se3::fusion::JointModelVisitor< VISITOR >::run; \ 108 #endif // ifndef __se3_visitor_hpp__