14 #include <Eigen/Geometry>
15 #include "../visitors/serialization.h"
16 #include "../internal/helpers.h"
22 template <
class t_Visitor,
typename t_Scalar,
int t_rows,
int t_flags>
25 Eigen::Matrix<t_Scalar, t_rows, 1, t_flags> &entry,
26 const typename t_Visitor::Parameters ¶m)
28 ARILES2_TRACE_FUNCTION;
29 const std::size_t size = visitor.startVector();
31 if (Eigen::Dynamic == t_rows)
37 ARILES2_ASSERT((
static_cast<int>(size) == t_rows),
"Wrong entry size.");
40 for (EIGEN_DEFAULT_DENSE_INDEX_TYPE i = 0; i < (Eigen::Dynamic == t_rows ? entry.rows() : t_rows); ++i)
42 visitor.visitVectorElement(entry[i], param);
49 template <
class t_Visitor,
typename t_Scalar,
int t_rows,
int t_cols,
int t_flags>
52 Eigen::Matrix<t_Scalar, t_rows, t_cols, t_flags> &entry,
53 const typename t_Visitor::Parameters ¶meters)
55 ARILES2_TRACE_FUNCTION;
56 const bool dynamic = Eigen::Dynamic == t_rows or Eigen::Dynamic == t_cols;
57 std::size_t num_rows = Eigen::Dynamic == t_rows ? 0 :
static_cast<std::size_t
>(t_cols);
58 std::size_t num_cols = Eigen::Dynamic == t_cols ? 0 :
static_cast<std::size_t
>(t_rows);
60 visitor.startMatrix(num_cols, num_rows, dynamic, parameters);
63 Eigen::Dynamic == t_cols ||
static_cast<std::size_t
>(t_cols) == num_cols,
64 "Wrong number of columns.");
66 Eigen::Dynamic == t_rows ||
static_cast<std::size_t
>(t_rows) == num_rows,
"Wrong number of rows.");
69 entry.resize(num_rows, num_cols);
71 for (std::size_t i = 0; i < num_rows; ++i)
73 visitor.startMatrixRow(i, num_cols, parameters);
74 for (std::size_t j = 0; j < num_cols; ++j)
76 visitor.visitMatrixElement(entry(i, j), parameters);
78 visitor.endMatrixRow(parameters);
81 visitor.endMatrix(dynamic, parameters);
85 template <
class t_Visitor,
typename t_Scalar,
int t_dim,
int t_mode,
int t_options>
88 Eigen::Transform<t_Scalar, t_dim, t_mode, t_options> &entry,
89 const typename t_Visitor::Parameters ¶m)
91 ARILES2_TRACE_FUNCTION;
94 Eigen::Dynamic == t_dim ? Eigen::Dynamic : t_dim + 1,
95 Eigen::Dynamic == t_dim ? Eigen::Dynamic : t_dim + 1>
98 entry.matrix() = raw_matrix;
102 template <
class t_Visitor,
typename t_Scalar,
int t_options>
105 Eigen::Quaternion<t_Scalar, t_options> &entry,
106 const typename t_Visitor::Parameters ¶meters)
108 ARILES2_TRACE_FUNCTION;
110 typename t_Visitor::Parameters param = parameters;
111 param.allow_missing_entries_ =
false;
113 visitor.startMap(t_Visitor::SIZE_LIMIT_EQUAL, 4);
114 visitor.visitMapEntry(entry.x(),
"x", param,
true);
115 visitor.visitMapEntry(entry.y(),
"y", param,
true);
116 visitor.visitMapEntry(entry.z(),
"z", param,
true);
117 visitor.visitMapEntry(entry.w(),
"w", param,
true);
128 template <
class t_Visitor,
typename t_Scalar,
int t_rows,
int t_flags>
131 const Eigen::Matrix<t_Scalar, t_rows, 1, t_flags> &entry,
132 const typename t_Visitor::Parameters ¶m)
134 ARILES2_TRACE_FUNCTION;
135 writer.startVector(entry.rows());
136 for (EIGEN_DEFAULT_DENSE_INDEX_TYPE i = 0; i < (Eigen::Dynamic == t_rows ? entry.rows() : t_rows); ++i)
138 writer.visitVectorElement(entry[i], param);
144 template <
class t_Visitor,
typename t_Scalar,
int t_rows,
int t_cols,
int t_flags>
147 const Eigen::Matrix<t_Scalar, t_rows, t_cols, t_flags> &entry,
148 const typename t_Visitor::Parameters ¶m)
150 const EIGEN_DEFAULT_DENSE_INDEX_TYPE rows = entry.rows();
151 const EIGEN_DEFAULT_DENSE_INDEX_TYPE cols = entry.cols();
153 const bool dynamic = Eigen::Dynamic == t_rows or Eigen::Dynamic == t_cols;
154 writer.startMatrix(dynamic, cols, rows, param);
155 for (EIGEN_DEFAULT_DENSE_INDEX_TYPE i = 0; i < rows; ++i)
157 writer.startMatrixRow(cols, param);
158 for (EIGEN_DEFAULT_DENSE_INDEX_TYPE j = 0; j < cols; ++j)
160 writer.visitMatrixElement(entry(i, j), param);
162 writer.endMatrixRow(param);
164 writer.endMatrix(dynamic, param);
168 template <
class t_Visitor,
typename t_Scalar,
int t_dim,
int t_mode,
int t_options>
171 const Eigen::Transform<t_Scalar, t_dim, t_mode, t_options> &entry,
172 const typename t_Visitor::Parameters ¶m)
174 ARILES2_TRACE_FUNCTION;
179 template <
class t_Visitor,
typename t_Scalar,
int t_options,
class t_Flags>
182 const Eigen::Quaternion<t_Scalar, t_options> &entry,
183 const t_Flags ¶m)
185 ARILES2_TRACE_FUNCTION;
187 writer.startMap(param, 4);
189 writer.visitMapEntry(entry.x(),
"x", param);
190 writer.visitMapEntry(entry.y(),
"y", param);
191 writer.visitMapEntry(entry.z(),
"z", param);
192 writer.visitMapEntry(entry.w(),
"w", param);
205 template <
class t_Visitor,
typename t_Scalar,
int t_dim,
int t_mode,
int t_options>
208 const Eigen::Transform<t_Scalar, t_dim, t_mode, t_options> &left,
209 const Eigen::Transform<t_Scalar, t_dim, t_mode, t_options> &right,
210 const typename t_Visitor::Parameters ¶m)
212 ARILES2_TRACE_FUNCTION;
213 visitor.equal_ &= (left.isApprox(right, param.template getTolerance<t_Scalar>()));
217 template <
class t_Visitor,
typename t_Scalar,
int t_options>
220 const Eigen::Quaternion<t_Scalar, t_options> &left,
221 const Eigen::Quaternion<t_Scalar, t_options> &right,
222 const typename t_Visitor::Parameters ¶m)
224 ARILES2_TRACE_FUNCTION;
225 visitor.equal_ &= (left.isApprox(right, param.template getTolerance<t_Scalar>()));
229 template <
class t_Visitor,
typename t_Scalar,
int t_rows,
int t_cols,
int t_flags>
232 const Eigen::Matrix<t_Scalar, t_rows, t_cols, t_flags> &left,
233 const Eigen::Matrix<t_Scalar, t_rows, t_cols, t_flags> &right,
234 const typename t_Visitor::Parameters ¶m)
236 ARILES2_TRACE_FUNCTION;
237 visitor.equal_ &= (left.isApprox(right, param.template getTolerance<t_Scalar>()));
248 template <
class t_Visitor,
typename t_Scalar,
int t_rows,
int t_cols,
int t_flags>
251 Eigen::Matrix<t_Scalar, t_rows, t_cols, t_flags> &entry,
252 const typename t_Visitor::Parameters ¶m)
254 ARILES2_TRACE_FUNCTION;
255 if (Eigen::Dynamic == t_rows)
257 if (Eigen::Dynamic == t_cols)
263 entry.resize(0, t_cols);
268 if (Eigen::Dynamic == t_cols)
270 entry.resize(t_rows, 0);
274 entry.setConstant(param.template getDefault<t_Scalar>());
280 template <
class t_Visitor,
typename t_Scalar,
int t_dim,
int t_mode,
int t_options>
283 Eigen::Transform<t_Scalar, t_dim, t_mode, t_options> &entry,
284 const typename t_Visitor::Parameters & )
286 ARILES2_TRACE_FUNCTION;
291 template <
class t_Visitor,
typename t_Scalar,
int t_options>
294 Eigen::Quaternion<t_Scalar, t_options> &entry,
295 const typename t_Visitor::Parameters & )
297 ARILES2_TRACE_FUNCTION;
308 template <
class t_Visitor,
class t_Left,
class t_Right>
312 const t_Right &right,
313 const typename t_Visitor::Parameters & ,
314 const typename t_Left::Scalar * = NULL,
315 const typename t_Right::Scalar * = NULL)
317 ARILES2_TRACE_FUNCTION;
325 template <
class t_Visitor,
class t_Left,
class t_Right>
330 const typename t_Visitor::Parameters & ,
331 const typename t_Left::Scalar * = NULL,
332 const typename t_Right::Scalar * = NULL)
334 ARILES2_TRACE_FUNCTION;