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>
23  void apply_read(
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>
50  void apply_read(
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>
86  void apply_read(
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 
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  {
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 
198 namespace 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 
241 namespace 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 
301 namespace 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
visitor::Parameters Parameters
Definition: count.h:26
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
Definition: basic.h:17
#define CPPUT_TRACE_FUNCTION
Definition: trace.h:126