5 #ifndef __pinocchio_multibody_visitior_joint_unary_visitor_hpp__
6 #define __pinocchio_multibody_visitior_joint_unary_visitor_hpp__
8 #include <boost/variant.hpp>
10 #include "pinocchio/multibody/joint/joint-base.hpp"
11 #include "pinocchio/multibody/visitor/fusion.hpp"
17 namespace bf = boost::fusion;
19 typedef boost::blank NoArg;
26 template<
typename Jo
intVisitorDerived,
typename ReturnType =
void>
30 template<
typename Scalar,
int Options,
template<
typename,
int>
class JointCollectionTpl,
typename ArgsTmp>
35 InternalVisitorModelAndData<JointModelTpl<Scalar,Options,JointCollectionTpl>,ArgsTmp> visitor(jdata,args);
36 return boost::apply_visitor(visitor,jmodel);
39 template<
typename Scalar,
int Options,
template<
typename,
int>
class JointCollectionTpl>
43 InternalVisitorModelAndData<JointModelTpl<Scalar,Options,JointCollectionTpl>,NoArg> visitor(jdata);
44 return boost::apply_visitor(visitor,jmodel);
47 template<
typename Jo
intModelDerived,
typename ArgsTmp>
52 InternalVisitorModelAndData<JointModelDerived,ArgsTmp> visitor(jdata,args);
53 return visitor(jmodel.derived());
56 template<
typename Jo
intModelDerived>
60 InternalVisitorModelAndData<JointModelDerived,NoArg> visitor(jdata);
61 return visitor(jmodel.derived());
64 template<
typename Scalar,
int Options,
template<
typename,
int>
class JointCollectionTpl,
typename ArgsTmp>
68 InternalVisitorModel<ArgsTmp> visitor(args);
69 return boost::apply_visitor(visitor,jmodel);
72 template<
typename Scalar,
int Options,
template<
typename,
int>
class JointCollectionTpl,
typename ArgsTmp>
76 InternalVisitorModel<ArgsTmp> visitor(args);
77 return boost::apply_visitor(visitor,jdata);
80 template<
typename Scalar,
int Options,
template<
typename,
int>
class JointCollectionTpl>
83 InternalVisitorModel<NoArg> visitor;
84 return boost::apply_visitor(visitor,jmodel);
87 template<
typename Scalar,
int Options,
template<
typename,
int>
class JointCollectionTpl>
90 InternalVisitorModel<NoArg> visitor;
91 return boost::apply_visitor(visitor,jdata);
94 template<
typename Jo
intModelDerived,
typename ArgsTmp>
98 InternalVisitorModel<ArgsTmp> visitor(args);
99 return visitor(jmodel.derived());
102 template<
typename Jo
intDataDerived,
typename ArgsTmp>
106 InternalVisitorModel<ArgsTmp> visitor(args);
107 return visitor(jdata.derived());
110 template<
typename Jo
intModelDerived>
113 InternalVisitorModel<NoArg> visitor;
114 return visitor(jmodel.derived());
117 template<
typename Jo
intDataDerived>
120 InternalVisitorModel<NoArg> visitor;
121 return visitor(jdata.derived());
126 template<
typename Jo
intModel,
typename ArgType>
127 struct InternalVisitorModelAndData
128 :
public boost::static_visitor<ReturnType>
130 typedef typename JointModel::JointDataDerived
JointData;
132 InternalVisitorModelAndData(
JointData & jdata, ArgType args)
133 : jdata(jdata), args(args)
136 template<
typename Jo
intModelDerived>
139 return bf::invoke(&JointVisitorDerived::template algo<JointModelDerived>,
140 bf::append(boost::ref(jmodel.derived()),
151 template<
typename Jo
intModel>
152 struct InternalVisitorModelAndData<
JointModel,NoArg>
153 :
public boost::static_visitor<ReturnType>
155 typedef typename JointModel::JointDataDerived
JointData;
157 InternalVisitorModelAndData(
JointData & jdata)
161 template<
typename Jo
intModelDerived>
164 return bf::invoke(&JointVisitorDerived::template algo<JointModelDerived>,
165 bf::make_vector(boost::ref(jmodel.derived()),
172 template<
typename ArgType,
typename Dummy =
void>
173 struct InternalVisitorModel
174 :
public boost::static_visitor<ReturnType>
176 InternalVisitorModel(ArgType args)
180 template<
typename Jo
intModelDerived>
183 return bf::invoke(&JointVisitorDerived::template algo<JointModelDerived>,
184 bf::append(boost::ref(jmodel.derived()),
188 template<
typename Jo
intDataDerived>
191 return bf::invoke(&JointVisitorDerived::template algo<JointDataDerived>,
192 bf::append(boost::ref(jdata.derived()),
201 template<
typename Dummy>
202 struct InternalVisitorModel<NoArg,Dummy>
203 :
public boost::static_visitor<ReturnType>
205 InternalVisitorModel() {}
207 template<
typename Jo
intModelDerived>
210 return JointVisitorDerived::template algo<JointModelDerived>(jmodel.derived());
213 template<
typename Jo
intDataDerived>
216 return JointVisitorDerived::template algo<JointDataDerived>(jdata.derived());
224 template<
typename Jo
intVisitorDerived,
typename ReturnType =
void>
235 #endif // ifndef __pinocchio_multibody_visitior_joint_unary_visitor_hpp__