Ariles
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 
18 namespace 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  {
28  ARILES2_TRACE_FUNCTION;
29  const std::size_t size = visitor.startVector();
30 
31  if (Eigen::Dynamic == t_rows)
32  {
33  entry.resize(size);
34  }
35  else
36  {
37  ARILES2_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  {
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);
59 
60  visitor.startMatrix(num_cols, num_rows, dynamic, parameters);
61 
62  ARILES2_ASSERT(
63  Eigen::Dynamic == t_cols || static_cast<std::size_t>(t_cols) == num_cols,
64  "Wrong number of columns.");
65  ARILES2_ASSERT(
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  {
91  ARILES2_TRACE_FUNCTION;
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  {
108  ARILES2_TRACE_FUNCTION;
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 
124 namespace 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  {
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)
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  {
174  ARILES2_TRACE_FUNCTION;
175  apply_write(writer, entry.matrix(), param);
176  }
177 
178 
179  template <class t_Visitor, typename t_Scalar, int t_options, class t_Flags>
181  t_Visitor &writer,
182  const Eigen::Quaternion<t_Scalar, t_options> &entry,
183  const t_Flags &param)
184  {
185  ARILES2_TRACE_FUNCTION;
186 
187  writer.startMap(param, 4);
188 
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);
193 
194  writer.endMap();
195  }
196  } // namespace write
197 } // namespace ariles2
198 
199 
200 
201 namespace ariles2
202 {
203  namespace compare
204  {
205  template <class t_Visitor, typename t_Scalar, int t_dim, int t_mode, int t_options>
207  t_Visitor &visitor,
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 &param)
211  {
212  ARILES2_TRACE_FUNCTION;
213  visitor.equal_ &= (left.isApprox(right, param.template getTolerance<t_Scalar>()));
214  }
215 
216 
217  template <class t_Visitor, typename t_Scalar, int t_options>
219  t_Visitor &visitor,
220  const Eigen::Quaternion<t_Scalar, t_options> &left,
221  const Eigen::Quaternion<t_Scalar, t_options> &right,
222  const typename t_Visitor::Parameters &param)
223  {
224  ARILES2_TRACE_FUNCTION;
225  visitor.equal_ &= (left.isApprox(right, param.template getTolerance<t_Scalar>()));
226  }
227 
228 
229  template <class t_Visitor, typename t_Scalar, int t_rows, int t_cols, int t_flags>
231  t_Visitor &visitor,
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 &param)
235  {
236  ARILES2_TRACE_FUNCTION;
237  visitor.equal_ &= (left.isApprox(right, param.template getTolerance<t_Scalar>()));
238  }
239  } // namespace compare
240 } // namespace ariles2
241 
242 
243 
244 namespace ariles2
245 {
246  namespace defaults
247  {
248  template <class t_Visitor, typename t_Scalar, int t_rows, int t_cols, int t_flags>
250  const t_Visitor & /*visitor*/,
251  Eigen::Matrix<t_Scalar, t_rows, t_cols, t_flags> &entry,
252  const typename t_Visitor::Parameters &param)
253  {
254  ARILES2_TRACE_FUNCTION;
255  if (Eigen::Dynamic == t_rows)
256  {
257  if (Eigen::Dynamic == t_cols)
258  {
259  entry.resize(0, 0);
260  }
261  else
262  {
263  entry.resize(0, t_cols);
264  }
265  }
266  else
267  {
268  if (Eigen::Dynamic == t_cols)
269  {
270  entry.resize(t_rows, 0);
271  }
272  else
273  {
274  entry.setConstant(param.template getDefault<t_Scalar>());
275  }
276  }
277  }
278 
279 
280  template <class t_Visitor, typename t_Scalar, int t_dim, int t_mode, int t_options>
282  const t_Visitor & /*visitor*/,
283  Eigen::Transform<t_Scalar, t_dim, t_mode, t_options> &entry,
284  const typename t_Visitor::Parameters & /*param*/)
285  {
286  ARILES2_TRACE_FUNCTION;
287  entry.setIdentity();
288  }
289 
290 
291  template <class t_Visitor, typename t_Scalar, int t_options>
293  const t_Visitor & /*visitor*/,
294  Eigen::Quaternion<t_Scalar, t_options> &entry,
295  const typename t_Visitor::Parameters & /*param*/)
296  {
297  ARILES2_TRACE_FUNCTION;
298  entry.setIdentity();
299  }
300  } // namespace defaults
301 } // namespace ariles2
302 
303 
304 namespace ariles2
305 {
306  namespace copyfrom
307  {
308  template <class t_Visitor, class t_Left, class t_Right>
310  t_Visitor & /*visitor*/,
311  t_Left &left,
312  const t_Right &right,
313  const typename t_Visitor::Parameters & /*param*/,
314  const typename t_Left::Scalar * = NULL,
315  const typename t_Right::Scalar * = NULL)
316  {
317  ARILES2_TRACE_FUNCTION;
318  left = right;
319  }
320  } // namespace copyfrom
321 
322 
323  namespace copyto
324  {
325  template <class t_Visitor, class t_Left, class t_Right>
327  t_Visitor & /*visitor*/,
328  const t_Left &left,
329  t_Right &right,
330  const typename t_Visitor::Parameters & /*param*/,
331  const typename t_Left::Scalar * = NULL,
332  const typename t_Right::Scalar * = NULL)
333  {
334  ARILES2_TRACE_FUNCTION;
335  right = left;
336  }
337  } // namespace copyto
338 } // namespace ariles2
ariles2::copyfrom::apply_copyfrom
void ARILES2_VISIBILITY_ATTRIBUTE apply_copyfrom(t_Visitor &visitor, t_Left &left, const t_Right &right, const typename t_Visitor::Parameters &param, ARILES2_IS_BASE_ENABLER(ariles2::Ariles, t_Left))
Definition: basic.h:323
ariles2
Definition: basic.h:16
ariles2::write::apply_write
void ARILES2_VISIBILITY_ATTRIBUTE 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:85
t_Visitor
ariles2::compare::apply_compare
void ARILES2_VISIBILITY_ATTRIBUTE apply_compare(t_Visitor &visitor, const t_Left &left, const t_Right &right, const typename t_Visitor::Parameters &param, ARILES2_IS_BASE_ENABLER(ariles2::Ariles, t_Left))
Definition: basic.h:146
ARILES2_VISIBILITY_ATTRIBUTE
#define ARILES2_VISIBILITY_ATTRIBUTE
Definition: helpers.h:138
ariles2::read::apply_read
void ARILES2_VISIBILITY_ATTRIBUTE 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
ariles2::copyto::apply_copyto
void ARILES2_VISIBILITY_ATTRIBUTE apply_copyto(t_Visitor &visitor, const t_Left &left, t_Right &right, const typename t_Visitor::Parameters &param, ARILES2_IS_BASE_ENABLER(ariles2::Ariles, t_Left))
Definition: basic.h:369
ariles2::defaults::apply_defaults
void ARILES2_VISIBILITY_ATTRIBUTE 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:237