pinocchio  3.7.0
A fast and flexible implementation of Rigid Body Dynamics algorithms and their analytical derivatives
 
Loading...
Searching...
No Matches
joint-binary-visitor.hpp
1//
2// Copyright (c) 2019 INRIA
3//
4
5#ifndef __pinocchio_multibody_visitor_joint_binary_visitor_hpp__
6#define __pinocchio_multibody_visitor_joint_binary_visitor_hpp__
7
8#include <boost/variant.hpp>
9
10#include "pinocchio/multibody/joint/joint-base.hpp"
11#include "pinocchio/multibody/visitor/fusion.hpp"
12
13namespace pinocchio
14{
15 namespace fusion
16 {
17 namespace bf = boost::fusion;
18
19 typedef boost::blank NoArg;
20
26 template<typename JointVisitorDerived, typename ReturnType = void>
28 {
29
30 template<typename JointModelDerived1, typename JointModelDerived2, typename ArgsTmp>
31 static ReturnType run(
36 ArgsTmp args)
37 {
39 jdata1, jdata2, args);
40 return visitor(jmodel1.derived(), jmodel2.derived());
41 }
42
43 template<
44 typename Scalar,
45 int Options,
46 template<typename, int> class JointCollectionTpl,
47 typename ArgsTmp>
48 static ReturnType run(
53 ArgsTmp args)
54 {
57 return boost::apply_visitor(visitor, jmodel1, jmodel2);
58 }
59
60 template<typename JointModelDerived1, typename JointModelDerived2>
61 static ReturnType run(
66 {
68 jdata1, jdata2);
69 return visitor(jmodel1.derived(), jmodel2.derived());
70 }
71
72 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
73 static ReturnType run(
78 {
81 return boost::apply_visitor(visitor, jmodel1, jmodel2);
82 }
83
84 template<typename JointModelDerived1, typename JointModelDerived2, typename ArgsTmp>
85 static ReturnType run(
88 ArgsTmp args)
89 {
91 return visitor(jmodel1.derived(), jmodel2.derived());
92 }
93
94 template<
95 typename Scalar,
96 int Options,
97 template<typename, int> class JointCollectionTpl,
98 typename ArgsTmp>
99 static ReturnType run(
102 ArgsTmp args)
103 {
105 return boost::apply_visitor(visitor, jmodel1, jmodel2);
106 }
107
108 template<typename JointModelDerived1, typename JointModelDerived2>
109 static ReturnType run(
112 {
114 return visitor(jmodel1.derived(), jmodel2.derived());
115 }
116
117 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
118 static ReturnType run(
121 {
123 return boost::apply_visitor(visitor, jmodel1, jmodel2);
124 }
125
126 private:
127 template<typename JointModel1, typename JointModel2, typename ArgType>
128 struct InternalVisitorModelAndData : public boost::static_visitor<ReturnType>
129 {
130 typedef typename JointModel1::JointDataDerived JointData1;
131 typedef typename JointModel2::JointDataDerived JointData2;
132
133 InternalVisitorModelAndData(JointData1 & jdata1, JointData2 & jdata2, ArgType args)
134 : jdata1(jdata1)
135 , jdata2(jdata2)
136 , args(args)
137 {
138 }
139
140 template<typename JointModelDerived1, typename JointModelDerived2>
141 ReturnType operator()(
144 {
145 return bf::invoke(
146 &JointVisitorDerived::template algo<JointModelDerived1, JointModelDerived2>,
147 bf::append(
148 boost::ref(jmodel1.derived()), boost::ref(jmodel2.derived()),
149 boost::ref(
150 boost::get<typename JointModelBase<JointModelDerived1>::JointDataDerived>(jdata1)),
151 boost::ref(
152 boost::get<typename JointModelBase<JointModelDerived2>::JointDataDerived>(jdata2)),
153 args));
154 }
155
156 JointData1 & jdata1;
157 JointData2 & jdata2;
158
159 ArgType args;
160 };
161
162 template<typename JointModel1, typename JointModel2>
163 struct InternalVisitorModelAndData<JointModel1, JointModel2, NoArg>
164 : public boost::static_visitor<ReturnType>
165 {
166 typedef typename JointModel1::JointDataDerived JointData1;
167 typedef typename JointModel2::JointDataDerived JointData2;
168
169 InternalVisitorModelAndData(JointData1 & jdata1, JointData2 & jdata2)
170 : jdata1(jdata1)
171 , jdata2(jdata2)
172 {
173 }
174
175 template<typename JointModelDerived1, typename JointModelDerived2>
176 ReturnType operator()(
179 {
180 return bf::invoke(
181 &JointVisitorDerived::template algo<JointModelDerived1, JointModelDerived2>,
182 bf::make_vector(
183 boost::ref(jmodel1.derived()), boost::ref(jmodel2.derived()),
184 boost::ref(
185 boost::get<typename JointModelBase<JointModelDerived1>::JointDataDerived>(jdata1)),
186 boost::ref(boost::get<typename JointModelBase<JointModelDerived2>::JointDataDerived>(
187 jdata2))));
188 }
189
190 JointData1 & jdata1;
191 JointData2 & jdata2;
192 };
193
194 template<typename ArgType, typename Dummy = void>
195 struct InternalVisitorModel : public boost::static_visitor<ReturnType>
196 {
197 InternalVisitorModel(ArgType args)
198 : args(args)
199 {
200 }
201
202 template<typename JointModel1, typename JointModel2>
203 ReturnType operator()(
206 {
207 return bf::invoke(
208 &JointVisitorDerived::template algo<JointModel1, JointModel2>,
209 bf::append(boost::ref(jmodel1.derived()), boost::ref(jmodel2.derived()), args));
210 }
211
212 ArgType args;
213 };
214
215 template<typename Dummy>
216 struct InternalVisitorModel<NoArg, Dummy> : public boost::static_visitor<ReturnType>
217 {
218 InternalVisitorModel()
219 {
220 }
221
222 template<typename JointModel1, typename JointModel2>
223 ReturnType operator()(
226 {
227 return JointVisitorDerived::template algo<JointModel1, JointModel2>(
228 jmodel1.derived(), jmodel2.derived());
229 }
230 };
231
232 }; // struct JointBinaryVisitorBase
233
234 } // namespace fusion
235} // namespace pinocchio
236
237#endif // ifndef __pinocchio_multibody_visitor_joint_binary_visitor_hpp__
Main pinocchio namespace.
Definition treeview.dox:11
Base structure for Binary visitation of two JointModels. This structure provides runners to call the ...