GCC Code Coverage Report


Directory: ./
File: include/pinocchio/multibody/visitor/joint-binary-visitor.hpp
Date: 2025-02-12 21:03:38
Exec Total Coverage
Lines: 47 48 97.9%
Branches: 16 32 50.0%

Line Branch Exec Source
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
13 namespace pinocchio
14 {
15 namespace fusion
16 {
17 namespace bf = boost::fusion;
18
19 typedef boost::blank NoArg;
20
21 ///
22 /// \brief Base structure for \b Binary visitation of two JointModels.
23 /// This structure provides runners to call the right visitor according to the number of
24 /// arguments. This should be used when deriving new rigid body algorithms.
25 ///
26 template<typename JointVisitorDerived, typename ReturnType = void>
27 struct JointBinaryVisitorBase
28 {
29
30 template<typename JointModelDerived1, typename JointModelDerived2, typename ArgsTmp>
31 static ReturnType run(
32 const JointModelBase<JointModelDerived1> & jmodel1,
33 const JointModelBase<JointModelDerived2> & jmodel2,
34 typename JointModelBase<JointModelDerived1>::JointDataDerived & jdata1,
35 typename JointModelBase<JointModelDerived2>::JointDataDerived & jdata2,
36 ArgsTmp args)
37 {
38 InternalVisitorModelAndData<JointModelDerived1, JointModelDerived2, ArgsTmp> visitor(
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 26 static ReturnType run(
49 const JointModelTpl<Scalar, Options, JointCollectionTpl> & jmodel1,
50 const JointModelTpl<Scalar, Options, JointCollectionTpl> & jmodel2,
51 JointDataTpl<Scalar, Options, JointCollectionTpl> & jdata1,
52 JointDataTpl<Scalar, Options, JointCollectionTpl> & jdata2,
53 ArgsTmp args)
54 {
55 typedef JointModelTpl<Scalar, Options, JointCollectionTpl> JointModel;
56
2/4
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 5 not taken.
26 InternalVisitorModelAndData<JointModel, JointModel, ArgsTmp> visitor(jdata1, jdata2, args);
57
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
52 return boost::apply_visitor(visitor, jmodel1, jmodel2);
58 }
59
60 template<typename JointModelDerived1, typename JointModelDerived2>
61 static ReturnType run(
62 const JointModelBase<JointModelDerived1> & jmodel1,
63 const JointModelBase<JointModelDerived2> & jmodel2,
64 typename JointModelBase<JointModelDerived1>::JointDataDerived & jdata1,
65 typename JointModelBase<JointModelDerived2>::JointDataDerived & jdata2)
66 {
67 InternalVisitorModelAndData<JointModelDerived1, JointModelDerived2, NoArg> visitor(
68 jdata1, jdata2);
69 return visitor(jmodel1.derived(), jmodel2.derived());
70 }
71
72 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
73 26 static ReturnType run(
74 const JointModelTpl<Scalar, Options, JointCollectionTpl> & jmodel1,
75 const JointModelTpl<Scalar, Options, JointCollectionTpl> & jmodel2,
76 JointDataTpl<Scalar, Options, JointCollectionTpl> & jdata1,
77 JointDataTpl<Scalar, Options, JointCollectionTpl> & jdata2)
78 {
79 typedef JointModelTpl<Scalar, Options, JointCollectionTpl> JointModel;
80 26 InternalVisitorModelAndData<JointModel, JointModel, NoArg> visitor(jdata1, jdata2);
81
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
52 return boost::apply_visitor(visitor, jmodel1, jmodel2);
82 }
83
84 template<typename JointModelDerived1, typename JointModelDerived2, typename ArgsTmp>
85 static ReturnType run(
86 const JointModelBase<JointModelDerived1> & jmodel1,
87 const JointModelBase<JointModelDerived2> & jmodel2,
88 ArgsTmp args)
89 {
90 InternalVisitorModel<ArgsTmp> visitor(args);
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 26 static ReturnType run(
100 const JointModelTpl<Scalar, Options, JointCollectionTpl> & jmodel1,
101 const JointModelTpl<Scalar, Options, JointCollectionTpl> & jmodel2,
102 ArgsTmp args)
103 {
104
2/4
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 5 not taken.
26 InternalVisitorModel<ArgsTmp> visitor(args);
105
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
52 return boost::apply_visitor(visitor, jmodel1, jmodel2);
106 }
107
108 template<typename JointModelDerived1, typename JointModelDerived2>
109 static ReturnType run(
110 const JointModelBase<JointModelDerived1> & jmodel1,
111 const JointModelBase<JointModelDerived2> & jmodel2)
112 {
113 InternalVisitorModel<NoArg> visitor;
114 return visitor(jmodel1.derived(), jmodel2.derived());
115 }
116
117 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
118 26 static ReturnType run(
119 const JointModelTpl<Scalar, Options, JointCollectionTpl> & jmodel1,
120 const JointModelTpl<Scalar, Options, JointCollectionTpl> & jmodel2)
121 {
122 26 InternalVisitorModel<NoArg> visitor;
123
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
52 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 26 InternalVisitorModelAndData(JointData1 & jdata1, JointData2 & jdata2, ArgType args)
134 26 : jdata1(jdata1)
135 26 , jdata2(jdata2)
136 26 , args(args)
137 {
138 26 }
139
140 template<typename JointModelDerived1, typename JointModelDerived2>
141 52 ReturnType operator()(
142 const JointModelBase<JointModelDerived1> & jmodel1,
143 const JointModelBase<JointModelDerived2> & jmodel2) const
144 {
145
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
52 return bf::invoke(
146 &JointVisitorDerived::template algo<JointModelDerived1, JointModelDerived2>,
147 bf::append(
148
1/2
✓ Branch 2 taken 26 times.
✗ Branch 3 not taken.
104 boost::ref(jmodel1.derived()), boost::ref(jmodel2.derived()),
149 52 boost::ref(
150 52 boost::get<typename JointModelBase<JointModelDerived1>::JointDataDerived>(jdata1)),
151
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
52 boost::ref(
152 52 boost::get<typename JointModelBase<JointModelDerived2>::JointDataDerived>(jdata2)),
153 104 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 26 InternalVisitorModelAndData(JointData1 & jdata1, JointData2 & jdata2)
170 26 : jdata1(jdata1)
171 26 , jdata2(jdata2)
172 {
173 26 }
174
175 template<typename JointModelDerived1, typename JointModelDerived2>
176 52 ReturnType operator()(
177 const JointModelBase<JointModelDerived1> & jmodel1,
178 const JointModelBase<JointModelDerived2> & jmodel2) const
179 {
180
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
52 return bf::invoke(
181 &JointVisitorDerived::template algo<JointModelDerived1, JointModelDerived2>,
182 bf::make_vector(
183
1/2
✓ Branch 2 taken 26 times.
✗ Branch 3 not taken.
104 boost::ref(jmodel1.derived()), boost::ref(jmodel2.derived()),
184 52 boost::ref(
185 52 boost::get<typename JointModelBase<JointModelDerived1>::JointDataDerived>(jdata1)),
186
1/2
✓ Branch 2 taken 26 times.
✗ Branch 3 not taken.
104 boost::ref(boost::get<typename JointModelBase<JointModelDerived2>::JointDataDerived>(
187 104 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 26 InternalVisitorModel(ArgType args)
198 26 : args(args)
199 {
200 26 }
201
202 template<typename JointModel1, typename JointModel2>
203 52 ReturnType operator()(
204 const JointModelBase<JointModel1> & jmodel1,
205 const JointModelBase<JointModel2> & jmodel2) const
206 {
207
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
52 return bf::invoke(
208 &JointVisitorDerived::template algo<JointModel1, JointModel2>,
209
1/2
✓ Branch 3 taken 26 times.
✗ Branch 4 not taken.
208 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 26 InternalVisitorModel()
219 {
220 26 }
221
222 template<typename JointModel1, typename JointModel2>
223 26 ReturnType operator()(
224 const JointModelBase<JointModel1> & jmodel1,
225 const JointModelBase<JointModel2> & jmodel2) const
226 {
227 26 return JointVisitorDerived::template algo<JointModel1, JointModel2>(
228 52 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__
238