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,
29 const std::size_t size = visitor.startVector();
31 if constexpr (Eigen::Dynamic == t_rows)
37 CPPUT_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,
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,
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,
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,
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,
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,
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 ¶m)
184 writer.startMap(param, 4);
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);
202 template <
class t_Visitor,
typename t_Scalar,
int t_dim,
int t_mode,
int t_options>
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,
210 visitor.equal_ &= (left.isApprox(right, param.template getTolerance<t_Scalar>()));
214 template <
class t_Visitor,
typename t_Scalar,
int t_options>
217 const Eigen::Quaternion<t_Scalar, t_options> &left,
218 const Eigen::Quaternion<t_Scalar, t_options> &right,
222 visitor.equal_ &= (left.isApprox(right, param.template getTolerance<t_Scalar>()));
226 template <
class t_Visitor,
typename t_Scalar,
int t_rows,
int t_cols,
int t_flags>
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,
234 visitor.equal_ &= (left.isApprox(right, param.template getTolerance<t_Scalar>()));
245 template <
class t_Visitor,
typename t_Scalar,
int t_rows,
int t_cols,
int t_flags>
248 Eigen::Matrix<t_Scalar, t_rows, t_cols, t_flags> &entry,
252 if constexpr (Eigen::Dynamic == t_rows)
254 if constexpr (Eigen::Dynamic == t_cols)
260 entry.resize(0, t_cols);
265 if constexpr (Eigen::Dynamic == t_cols)
267 entry.resize(t_rows, 0);
271 entry.setConstant(param.template getDefault<t_Scalar>());
277 template <
class t_Visitor,
typename t_Scalar,
int t_dim,
int t_mode,
int t_options>
280 Eigen::Transform<t_Scalar, t_dim, t_mode, t_options> &entry,
288 template <
class t_Visitor,
typename t_Scalar,
int t_options>
291 Eigen::Quaternion<t_Scalar, t_options> &entry,
305 template <
class t_Visitor,
class t_Left,
class t_Right>
309 const t_Right &right,
311 const typename t_Left::Scalar * =
nullptr,
312 const typename t_Right::Scalar * =
nullptr)
322 template <
class t_Visitor,
class t_Left,
class t_Right>
328 const typename t_Left::Scalar * =
nullptr,
329 const typename t_Right::Scalar * =
nullptr)
#define CPPUT_ASSERT(condition,...)
void apply_compare(t_Visitor &visitor, const t_Left &left, const t_Right &right, const typename t_Visitor::Parameters ¶m)
void apply_copyfrom(t_Visitor &visitor, t_Left &left, const t_Right &right, const typename t_Visitor::Parameters ¶m)
void apply_copyto(t_Visitor &visitor, const t_Left &left, t_Right &right, const typename t_Visitor::Parameters ¶m)
visitor::Parameters Parameters
void apply_defaults(const t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters ¶m, ARILES2_IS_BASE_ENABLER(ariles2::defaults::Base, t_Entry))
void apply_read(t_Visitor &visitor, t_Entry &entry, const typename t_Visitor::Parameters ¶meters, ARILES2_IS_BASE_ENABLER(ariles2::read::Base, t_Entry))
void apply_write(t_Visitor &writer, const t_Entry &entry, const typename t_Visitor::Parameters ¶meters, ARILES2_IS_BASE_ENABLER(ariles2::write::Base, t_Entry))
#define CPPUT_TRACE_FUNCTION