Ariles
Loading...
Searching...
No Matches
eigen.h
Go to the documentation of this file.
1/**
2 @file
3 @author Alexander Sherikov
4
5 @copyright 2017-2018 Alexander Sherikov, Licensed under the Apache License, Version 2.0.
6 (see @ref LICENSE or http://www.apache.org/licenses/LICENSE-2.0)
7
8 @brief
9*/
10
11#pragma once
12
13#include <Eigen/Core>
14#include <Eigen/Geometry>
15#include "../visitors/serialization.h"
16#include "../internal/helpers.h"
17
18namespace ariles2
19{
20 namespace read
21 {
22 template <class t_Visitor, typename t_Scalar, int t_rows, int t_flags>
24 t_Visitor &visitor,
25 Eigen::Matrix<t_Scalar, t_rows, 1, t_flags> &entry,
26 const typename t_Visitor::Parameters &param)
27 {
29 const std::size_t size = visitor.startVector();
30
31 if constexpr (Eigen::Dynamic == t_rows)
32 {
33 entry.resize(size);
34 }
35 else
36 {
37 CPPUT_ASSERT((static_cast<int>(size) == t_rows), "Wrong entry size.");
38 }
39
40 for (EIGEN_DEFAULT_DENSE_INDEX_TYPE i = 0; i < (Eigen::Dynamic == t_rows ? entry.rows() : t_rows); ++i)
41 {
42 visitor.visitVectorElement(entry[i], param);
43 }
44 visitor.endVector();
45 }
46
47
48
49 template <class t_Visitor, typename t_Scalar, int t_rows, int t_cols, int t_flags>
51 t_Visitor &visitor,
52 Eigen::Matrix<t_Scalar, t_rows, t_cols, t_flags> &entry,
53 const typename t_Visitor::Parameters &parameters)
54 {
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);
59
60 visitor.startMatrix(num_cols, num_rows, dynamic, parameters);
61
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.");
67
68
69 entry.resize(num_rows, num_cols);
70
71 for (std::size_t i = 0; i < num_rows; ++i)
72 {
73 visitor.startMatrixRow(i, num_cols, parameters);
74 for (std::size_t j = 0; j < num_cols; ++j)
75 {
76 visitor.visitMatrixElement(entry(i, j), parameters);
77 }
78 visitor.endMatrixRow(parameters);
79 }
80
81 visitor.endMatrix(dynamic, parameters);
82 }
83
84
85 template <class t_Visitor, typename t_Scalar, int t_dim, int t_mode, int t_options>
87 t_Visitor &visitor,
88 Eigen::Transform<t_Scalar, t_dim, t_mode, t_options> &entry,
89 const typename t_Visitor::Parameters &param)
90 {
92 Eigen::Matrix<
93 t_Scalar,
94 Eigen::Dynamic == t_dim ? Eigen::Dynamic : t_dim + 1,
95 Eigen::Dynamic == t_dim ? Eigen::Dynamic : t_dim + 1>
96 raw_matrix;
97 apply_read(visitor, raw_matrix, param);
98 entry.matrix() = raw_matrix;
99 }
100
101
102 template <class t_Visitor, typename t_Scalar, int t_options>
104 t_Visitor &visitor,
105 Eigen::Quaternion<t_Scalar, t_options> &entry,
106 const typename t_Visitor::Parameters &parameters)
107 {
109
110 typename t_Visitor::Parameters param = parameters;
111 param.allow_missing_entries_ = false;
112
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);
118 visitor.endMap();
119 }
120 } // namespace read
121} // namespace ariles2
122
123
124namespace ariles2
125{
126 namespace write
127 {
128 template <class t_Visitor, typename t_Scalar, int t_rows, int t_flags>
130 t_Visitor &writer,
131 const Eigen::Matrix<t_Scalar, t_rows, 1, t_flags> &entry,
132 const typename t_Visitor::Parameters &param)
133 {
135 writer.startVector(entry.rows());
136 for (EIGEN_DEFAULT_DENSE_INDEX_TYPE i = 0; i < (Eigen::Dynamic == t_rows ? entry.rows() : t_rows); ++i)
137 {
138 writer.visitVectorElement(entry[i], param);
139 }
140 writer.endVector();
141 }
142
143
144 template <class t_Visitor, typename t_Scalar, int t_rows, int t_cols, int t_flags>
146 t_Visitor &writer,
147 const Eigen::Matrix<t_Scalar, t_rows, t_cols, t_flags> &entry,
148 const typename t_Visitor::Parameters &param)
149 {
150 const EIGEN_DEFAULT_DENSE_INDEX_TYPE rows = entry.rows();
151 const EIGEN_DEFAULT_DENSE_INDEX_TYPE cols = entry.cols();
152
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)
156 {
157 writer.startMatrixRow(cols, param);
158 for (EIGEN_DEFAULT_DENSE_INDEX_TYPE j = 0; j < cols; ++j)
159 {
160 writer.visitMatrixElement(entry(i, j), param);
161 }
162 writer.endMatrixRow(param);
163 }
164 writer.endMatrix(dynamic, param);
165 }
166
167
168 template <class t_Visitor, typename t_Scalar, int t_dim, int t_mode, int t_options>
170 t_Visitor &writer,
171 const Eigen::Transform<t_Scalar, t_dim, t_mode, t_options> &entry,
172 const typename t_Visitor::Parameters &param)
173 {
175 apply_write(writer, entry.matrix(), param);
176 }
177
178
179 template <class t_Visitor, typename t_Scalar, int t_options, class t_Flags>
180 void apply_write(t_Visitor &writer, const Eigen::Quaternion<t_Scalar, t_options> &entry, const t_Flags &param)
181 {
183
184 writer.startMap(param, 4);
185
186 writer.visitMapEntry(entry.x(), "x", param);
187 writer.visitMapEntry(entry.y(), "y", param);
188 writer.visitMapEntry(entry.z(), "z", param);
189 writer.visitMapEntry(entry.w(), "w", param);
190
191 writer.endMap();
192 }
193 } // namespace write
194} // namespace ariles2
195
196
197
198namespace ariles2
199{
200 namespace compare
201 {
202 template <class t_Visitor, typename t_Scalar, int t_dim, int t_mode, int t_options>
204 t_Visitor &visitor,
205 const Eigen::Transform<t_Scalar, t_dim, t_mode, t_options> &left,
206 const Eigen::Transform<t_Scalar, t_dim, t_mode, t_options> &right,
207 const typename t_Visitor::Parameters &param)
208 {
210 visitor.equal_ &= (left.isApprox(right, param.template getTolerance<t_Scalar>()));
211 }
212
213
214 template <class t_Visitor, typename t_Scalar, int t_options>
216 t_Visitor &visitor,
217 const Eigen::Quaternion<t_Scalar, t_options> &left,
218 const Eigen::Quaternion<t_Scalar, t_options> &right,
219 const typename t_Visitor::Parameters &param)
220 {
222 visitor.equal_ &= (left.isApprox(right, param.template getTolerance<t_Scalar>()));
223 }
224
225
226 template <class t_Visitor, typename t_Scalar, int t_rows, int t_cols, int t_flags>
228 t_Visitor &visitor,
229 const Eigen::Matrix<t_Scalar, t_rows, t_cols, t_flags> &left,
230 const Eigen::Matrix<t_Scalar, t_rows, t_cols, t_flags> &right,
231 const typename t_Visitor::Parameters &param)
232 {
234 visitor.equal_ &= (left.isApprox(right, param.template getTolerance<t_Scalar>()));
235 }
236 } // namespace compare
237} // namespace ariles2
238
239
240
241namespace ariles2
242{
243 namespace defaults
244 {
245 template <class t_Visitor, typename t_Scalar, int t_rows, int t_cols, int t_flags>
247 const t_Visitor & /*visitor*/,
248 Eigen::Matrix<t_Scalar, t_rows, t_cols, t_flags> &entry,
249 const typename t_Visitor::Parameters &param)
250 {
252 if constexpr (Eigen::Dynamic == t_rows)
253 {
254 if constexpr (Eigen::Dynamic == t_cols)
255 {
256 entry.resize(0, 0);
257 }
258 else
259 {
260 entry.resize(0, t_cols);
261 }
262 }
263 else
264 {
265 if constexpr (Eigen::Dynamic == t_cols)
266 {
267 entry.resize(t_rows, 0);
268 }
269 else
270 {
271 entry.setConstant(param.template getDefault<t_Scalar>());
272 }
273 }
274 }
275
276
277 template <class t_Visitor, typename t_Scalar, int t_dim, int t_mode, int t_options>
279 const t_Visitor & /*visitor*/,
280 Eigen::Transform<t_Scalar, t_dim, t_mode, t_options> &entry,
281 const typename t_Visitor::Parameters & /*param*/)
282 {
284 entry.setIdentity();
285 }
286
287
288 template <class t_Visitor, typename t_Scalar, int t_options>
290 const t_Visitor & /*visitor*/,
291 Eigen::Quaternion<t_Scalar, t_options> &entry,
292 const typename t_Visitor::Parameters & /*param*/)
293 {
295 entry.setIdentity();
296 }
297 } // namespace defaults
298} // namespace ariles2
299
300
301namespace ariles2
302{
303 namespace copyfrom
304 {
305 template <class t_Visitor, class t_Left, class t_Right>
307 t_Visitor & /*visitor*/,
308 t_Left &left,
309 const t_Right &right,
310 const typename t_Visitor::Parameters & /*param*/,
311 const typename t_Left::Scalar * = nullptr,
312 const typename t_Right::Scalar * = nullptr)
313 {
315 left = right;
316 }
317 } // namespace copyfrom
318
319
320 namespace copyto
321 {
322 template <class t_Visitor, class t_Left, class t_Right>
324 t_Visitor & /*visitor*/,
325 const t_Left &left,
326 t_Right &right,
327 const typename t_Visitor::Parameters & /*param*/,
328 const typename t_Left::Scalar * = nullptr,
329 const typename t_Right::Scalar * = nullptr)
330 {
332 right = left;
333 }
334 } // namespace copyto
335} // namespace ariles2
#define CPPUT_ASSERT(condition,...)
Definition exception.h:32
void apply_compare(t_Visitor &visitor, const t_Left &left, const t_Right &right, const typename t_Visitor::Parameters &param)
Definition basic.h:140
void apply_copyfrom(t_Visitor &visitor, t_Left &left, const t_Right &right, const typename t_Visitor::Parameters &param)
Definition basic.h:307
void apply_copyto(t_Visitor &visitor, const t_Left &left, t_Right &right, const typename t_Visitor::Parameters &param)
Definition basic.h:353
void apply_defaults(const t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters &param, ARILES2_IS_BASE_ENABLER(ariles2::defaults::Base, t_Entry))
Definition basic.h:232
void apply_read(t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters &parameters, ARILES2_IS_BASE_ENABLER(ariles2::read::Base, t_Entry))
Definition basic.h:21
void apply_write(t_Visitor &writer, const t_Entry &entry, const typename t_Visitor::Parameters &parameters, ARILES2_IS_BASE_ENABLER(ariles2::write::Base, t_Entry))
Definition basic.h:82
#define CPPUT_TRACE_FUNCTION
Definition trace.h:126