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 
17 namespace ariles
18 {
19  namespace read
20  {
21  template <class t_Visitor, typename t_Scalar, int t_rows, int t_flags>
23  t_Visitor &visitor,
24  Eigen::Matrix<t_Scalar, t_rows, 1, t_flags> &entry,
25  const typename t_Visitor::Parameters &param)
26  {
28  std::size_t size = visitor.startArray();
29 
30  if (Eigen::Dynamic == t_rows)
31  {
32  entry.resize(size);
33  }
34  else
35  {
36  ARILES_ASSERT((static_cast<int>(size) == t_rows), "Wrong entry size.");
37  }
38 
39  for (EIGEN_DEFAULT_DENSE_INDEX_TYPE i = 0; i < (Eigen::Dynamic == t_rows ? entry.rows() : t_rows); ++i)
40  {
41  apply_read(visitor, entry[i], param);
42  visitor.shiftArray();
43  }
44  visitor.endArray();
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  if (Eigen::Dynamic == t_rows || Eigen::Dynamic == t_cols
58  {
59  EIGEN_DEFAULT_DENSE_INDEX_TYPE num_rows;
60  EIGEN_DEFAULT_DENSE_INDEX_TYPE num_cols;
61 
62 
63  ariles::ConfigurableFlags param = parameters;
65 
66  visitor.template startMap<t_Visitor::SIZE_LIMIT_EQUAL>(3);
67  visitor(num_cols, "cols", param);
68  ARILES_ASSERT(Eigen::Dynamic == t_cols || t_cols == num_cols, "Wrong number of columns.");
69  visitor(num_rows, "rows", param);
70  ARILES_ASSERT(Eigen::Dynamic == t_rows || t_rows == num_rows, "Wrong number of rows.");
71 
72 
73  Eigen::Matrix<t_Scalar, Eigen::Dynamic, 1> v;
74  visitor(v, "data", param);
75  visitor.endMap();
76 
77  ARILES_ASSERT(v.rows() == num_rows * num_cols, "Wrong entry size.");
78 
79  Eigen::Map<Eigen::Matrix<t_Scalar, t_rows, t_cols, Eigen::RowMajor> > map(v.data(), num_rows, num_cols);
80  entry = map;
81  }
82  else
83  {
84  Eigen::Matrix<t_Scalar, t_rows * t_cols, 1> v;
85 
86  apply_read(visitor, v, parameters);
87 
88  Eigen::Map<Eigen::Matrix<double, t_rows, t_cols, Eigen::RowMajor> > map(v.data(), t_rows, t_cols);
89  entry = map;
90  }
91  }
92 
93 
94  template <class t_Visitor, typename t_Scalar, int t_dim, int t_mode, int t_options>
96  t_Visitor &visitor,
97  Eigen::Transform<t_Scalar, t_dim, t_mode, t_options> &entry,
98  const typename t_Visitor::Parameters &param)
99  {
101  Eigen::Matrix<
102  t_Scalar,
103  Eigen::Dynamic == t_dim ? Eigen::Dynamic : t_dim + 1,
104  Eigen::Dynamic == t_dim ? Eigen::Dynamic : t_dim + 1>
105  raw_matrix;
106  apply_read(visitor, raw_matrix, param);
107  entry.matrix() = raw_matrix;
108  }
109 
110 
111  template <class t_Visitor, typename t_Scalar, int t_options>
113  t_Visitor &visitor,
114  Eigen::Quaternion<t_Scalar, t_options> &entry,
115  const typename t_Visitor::Parameters &parameters)
116  {
118 
119  ariles::ConfigurableFlags param = parameters;
121 
122  visitor.template startMap<t_Visitor::SIZE_LIMIT_EQUAL>(4);
123  visitor(entry.x(), "x", param);
124  visitor(entry.y(), "y", param);
125  visitor(entry.z(), "z", param);
126  visitor(entry.w(), "w", param);
127  visitor.endMap();
128  }
129  } // namespace read
130 } // namespace ariles
131 
132 
133 namespace ariles
134 {
135  namespace write
136  {
137  template <class t_Visitor, typename t_Scalar, int t_rows, int t_flags>
139  t_Visitor &writer,
140  const Eigen::Matrix<t_Scalar, t_rows, 1, t_flags> &entry,
141  const typename t_Visitor::Parameters & /*param*/)
142  {
144  if (writer.getSerializationFeatures().isSet(serialization::Features::NATIVE_MATRIX_SUPPORTED))
145  {
146  writer.startMatrix(true);
147  for (EIGEN_DEFAULT_DENSE_INDEX_TYPE i = 0; i < (Eigen::Dynamic == t_rows ? entry.rows() : t_rows); ++i)
148  {
149  writer.startMatrixRow();
150  writer.writeElement(entry(i));
151  writer.endMatrixRow();
152  }
153  writer.endMatrix();
154  }
155  else
156  {
157  writer.startArray(entry.rows(), true);
158  for (EIGEN_DEFAULT_DENSE_INDEX_TYPE i = 0; i < entry.rows(); ++i)
159  {
160  writer.writeElement(entry[i]);
161  writer.shiftArray();
162  }
163  writer.endArray();
164  }
165  }
166 
167 
168 
169  template <class t_Visitor, typename t_Scalar, int t_rows, int t_cols, int t_flags>
171  t_Visitor &writer,
172  const Eigen::Matrix<t_Scalar, t_rows, t_cols, t_flags> &entry,
173  const typename t_Visitor::Parameters &param)
174  {
176  if (writer.getSerializationFeatures().isSet(serialization::Features::NATIVE_MATRIX_SUPPORTED))
177  {
178  writer.startMatrix();
179  for (EIGEN_DEFAULT_DENSE_INDEX_TYPE i = 0; i < (Eigen::Dynamic == t_rows ? entry.rows() : t_rows); ++i)
180  {
181  writer.startMatrixRow();
182  for (EIGEN_DEFAULT_DENSE_INDEX_TYPE j = 0; j < (Eigen::Dynamic == t_cols ? entry.cols() : t_cols);
183  ++j)
184  {
185  writer.writeElement(entry(i, j));
186  }
187  writer.endMatrixRow();
188  }
189  writer.endMatrix();
190  }
191  else
192  {
193  if (Eigen::Dynamic == t_rows || Eigen::Dynamic == t_cols
195  {
196  writer.startMap(3);
197 
198  writer(entry.cols(), "cols", param);
199  writer(entry.rows(), "rows", param);
200 
201 
202  writer.descend("data");
203  writer.startArray(entry.size(), true);
204  for (EIGEN_DEFAULT_DENSE_INDEX_TYPE i = 0; i < entry.rows(); ++i)
205  {
206  for (EIGEN_DEFAULT_DENSE_INDEX_TYPE j = 0; j < entry.cols(); ++j)
207  {
208  writer.writeElement(entry(i, j));
209  writer.shiftArray();
210  }
211  }
212  writer.endArray();
213  writer.ascend();
214 
215  writer.endMap();
216  }
217  else
218  {
219  writer.startArray(entry.size(), true);
220  for (EIGEN_DEFAULT_DENSE_INDEX_TYPE i = 0; i < t_rows; ++i)
221  {
222  for (EIGEN_DEFAULT_DENSE_INDEX_TYPE j = 0; j < t_cols; ++j)
223  {
224  writer.writeElement(entry(i, j));
225  writer.shiftArray();
226  }
227  }
228  writer.endArray();
229  }
230  }
231  }
232 
233 
234  template <class t_Visitor, typename t_Scalar, int t_dim, int t_mode, int t_options>
236  t_Visitor &writer,
237  const Eigen::Transform<t_Scalar, t_dim, t_mode, t_options> &entry,
238  const typename t_Visitor::Parameters &param)
239  {
241  apply_write(writer, entry.matrix(), param);
242  }
243 
244 
245  template <class t_Visitor, typename t_Scalar, int t_options, class t_Flags>
247  t_Visitor &writer,
248  const Eigen::Quaternion<t_Scalar, t_options> &entry,
249  const t_Flags &param)
250  {
252 
253  writer.startMap(4);
254 
255  writer(entry.x(), "x", param);
256  writer(entry.y(), "y", param);
257  writer(entry.z(), "z", param);
258  writer(entry.w(), "w", param);
259 
260  writer.endMap();
261  }
262  } // namespace write
263 } // namespace ariles
264 
265 
266 
267 namespace ariles
268 {
269  namespace compare
270  {
271  template <class t_Visitor, typename t_Scalar, int t_dim, int t_mode, int t_options>
273  t_Visitor &visitor,
274  const Eigen::Transform<t_Scalar, t_dim, t_mode, t_options> &left,
275  const Eigen::Transform<t_Scalar, t_dim, t_mode, t_options> &right,
276  const typename t_Visitor::Parameters &param)
277  {
279  visitor.equal_ &= (left.isApprox(right, param.template getTolerance<t_Scalar>()));
280  }
281 
282 
283  template <class t_Visitor, typename t_Scalar, int t_options>
285  t_Visitor &visitor,
286  const Eigen::Quaternion<t_Scalar, t_options> &left,
287  const Eigen::Quaternion<t_Scalar, t_options> &right,
288  const typename t_Visitor::Parameters &param)
289  {
291  visitor.equal_ &= (left.isApprox(right, param.template getTolerance<t_Scalar>()));
292  }
293 
294 
295  template <class t_Visitor, typename t_Scalar, int t_rows, int t_cols, int t_flags>
297  t_Visitor &visitor,
298  const Eigen::Matrix<t_Scalar, t_rows, t_cols, t_flags> &left,
299  const Eigen::Matrix<t_Scalar, t_rows, t_cols, t_flags> &right,
300  const typename t_Visitor::Parameters &param)
301  {
303  visitor.equal_ &= (left.isApprox(right, param.template getTolerance<t_Scalar>()));
304  }
305  } // namespace compare
306 } // namespace ariles
307 
308 
309 
310 namespace ariles
311 {
312  namespace defaults
313  {
314  template <class t_Visitor, typename t_Scalar, int t_rows, int t_cols, int t_flags>
316  const t_Visitor & /*visitor*/,
317  Eigen::Matrix<t_Scalar, t_rows, t_cols, t_flags> &entry,
318  const typename t_Visitor::Parameters &param)
319  {
321  if (Eigen::Dynamic == t_rows)
322  {
323  if (Eigen::Dynamic == t_cols)
324  {
325  entry.resize(0, 0);
326  }
327  else
328  {
329  entry.resize(0, t_cols);
330  }
331  }
332  else
333  {
334  if (Eigen::Dynamic == t_cols)
335  {
336  entry.resize(t_rows, 0);
337  }
338  else
339  {
340  entry.setConstant(param.template getDefault<t_Scalar>());
341  }
342  }
343  }
344 
345 
346  template <class t_Visitor, typename t_Scalar, int t_dim, int t_mode, int t_options>
348  const t_Visitor & /*visitor*/,
349  Eigen::Transform<t_Scalar, t_dim, t_mode, t_options> &entry,
350  const typename t_Visitor::Parameters & /*param*/)
351  {
353  entry.setIdentity();
354  }
355 
356 
357  template <class t_Visitor, typename t_Scalar, int t_options>
359  const t_Visitor & /*visitor*/,
360  Eigen::Quaternion<t_Scalar, t_options> &entry,
361  const typename t_Visitor::Parameters & /*param*/)
362  {
364  entry.setIdentity();
365  }
366  } // namespace defaults
367 } // namespace ariles
void ARILES_VISIBILITY_ATTRIBUTE apply_compare(t_Visitor &visitor, const t_Left &left, const t_Right &right, const typename t_Visitor::Parameters &param, ARILES_IS_BASE_ENABLER(ariles::Ariles, t_Left))
Definition: basic.h:149
#define ARILES_TRACE_FUNCTION
Definition: trace.h:118
void ARILES_VISIBILITY_ATTRIBUTE apply_defaults(const t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters &param, ARILES_IS_BASE_ENABLER(ariles::defaults::Base, t_Entry))
Definition: basic.h:234
void ARILES_VISIBILITY_ATTRIBUTE apply_write(t_Visitor &writer, const t_Entry &entry, const typename t_Visitor::Parameters &param, ARILES_IS_BASE_ENABLER(ariles::write::Base, t_Entry))
Definition: basic.h:96
#define ARILES_VISIBILITY_ATTRIBUTE
Definition: helpers.h:69
void ARILES_VISIBILITY_ATTRIBUTE apply_read(t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters &parameters, ARILES_IS_BASE_ENABLER(ariles::read::Base, t_Entry))
Definition: basic.h:22
Definition: basic.h:17