gtsam_points
Loading...
Searching...
No Matches
type_conversion.hpp
Go to the documentation of this file.
1#ifndef GLK_TYPE_CONVERSION_HPP
2#define GLK_TYPE_CONVERSION_HPP
3
4#include <vector>
5#include <type_traits>
6#include <Eigen/Core>
7
8namespace glk {
9
10template <typename Dst, typename Src>
11std::vector<Dst> convert_scalars(const Src* data, int num_data) {
12 std::vector<Dst> converted(num_data);
13 std::copy(data, data + num_data, converted.begin());
14 return converted;
15}
16
17template <typename Dst_Scalar, int Dst_Dim, typename Src_Scalar, int Src_Dim, template <class> class Allocator>
18std::enable_if_t<
19 std::is_same<Dst_Scalar, Src_Scalar>::value && Dst_Dim == Src_Dim,
20 std::vector<Eigen::Matrix<Dst_Scalar, Dst_Dim, 1>, Allocator<Eigen::Matrix<Dst_Scalar, Dst_Dim, 1>>>>
21convert_vector(std::vector<Eigen::Matrix<Src_Scalar, Src_Dim, 1>, Allocator<Eigen::Matrix<Src_Scalar, Src_Dim, 1>>>&& data) {
22 return std::move(data);
23}
24
25template <typename Dst_Scalar, int Dst_Dim, typename Src_Scalar, int Src_Dim, template <class> class Allocator>
26std::enable_if_t<
27 std::is_same<Dst_Scalar, Src_Scalar>::value && Dst_Dim == Src_Dim,
28 std::vector<Eigen::Matrix<Dst_Scalar, Dst_Dim, 1>, Allocator<Eigen::Matrix<Dst_Scalar, Dst_Dim, 1>>>>
29convert_vector(const std::vector<Eigen::Matrix<Src_Scalar, Src_Dim, 1>, Allocator<Eigen::Matrix<Src_Scalar, Src_Dim, 1>>>& data) {
30 return data;
31}
32
33template <typename Dst_Scalar, int Dst_Dim, typename Src_Scalar, int Src_Dim, template <class> class Allocator>
34std::enable_if_t<
35 !std::is_same<Dst_Scalar, Src_Scalar>::value || Dst_Dim != Src_Dim,
36 std::vector<Eigen::Matrix<Dst_Scalar, Dst_Dim, 1>, Allocator<Eigen::Matrix<Dst_Scalar, Dst_Dim, 1>>>>
37convert_vector(const std::vector<Eigen::Matrix<Src_Scalar, Src_Dim, 1>, Allocator<Eigen::Matrix<Src_Scalar, Src_Dim, 1>>>& data) {
38 std::vector<Eigen::Matrix<Dst_Scalar, Dst_Dim, 1>, Allocator<Eigen::Matrix<Dst_Scalar, Dst_Dim, 1>>> converted(data.size());
39 std::transform(data.begin(), data.end(), converted.begin(), [](const Eigen::Matrix<Src_Scalar, Src_Dim, 1>& x) {
40 return x.template cast<Dst_Scalar>().template head<Dst_Dim>();
41 });
42 return converted;
43}
44
45template <typename Dst_Scalar, int Dst_Rows, int Dst_Cols, typename Src_Scalar, int Src_Rows, int Src_Cols, template <class> class Allocator = std::allocator>
46std::enable_if_t<
47 std::is_same<Dst_Scalar, Src_Scalar>::value, //
48 std::vector<Eigen::Matrix<Dst_Scalar, Dst_Rows, Dst_Cols>, Allocator<Eigen::Matrix<Dst_Scalar, Dst_Rows, Dst_Cols>>>>
49convert_to_vector(const Eigen::Matrix<Src_Scalar, Src_Rows, Src_Cols>* points, int num_points) {
50 if (points == nullptr) {
51 return std::vector<Eigen::Matrix<Dst_Scalar, Dst_Rows, Dst_Cols>, Allocator<Eigen::Matrix<Dst_Scalar, Dst_Rows, Dst_Cols>>>(num_points);
52 }
53
54 if constexpr (Dst_Rows < Src_Rows && Dst_Cols == 1 && Src_Cols == 1) {
55 std::vector<Eigen::Matrix<Dst_Scalar, Dst_Rows, Dst_Cols>, Allocator<Eigen::Matrix<Dst_Scalar, Dst_Rows, Dst_Cols>>> converted(num_points);
56 Eigen::Map<Eigen::Matrix<Dst_Scalar, Dst_Rows, -1>> dst_map(converted[0].data(), Dst_Rows, num_points);
57 Eigen::Map<const Eigen::Matrix<Src_Scalar, Src_Rows, -1>> src_map(points[0].data(), Src_Rows, num_points);
59 return converted;
60
61 } else {
62 constexpr int Rows = std::min(Dst_Rows, Src_Rows);
63 constexpr int Cols = std::min(Dst_Cols, Src_Cols);
64
65 std::vector<Eigen::Matrix<Dst_Scalar, Dst_Rows, Dst_Cols>, Allocator<Eigen::Matrix<Dst_Scalar, Dst_Rows, Dst_Cols>>> converted(num_points);
66 for (int i = 0; i < num_points; i++) {
67 converted[i].template block<Rows, Cols>(0, 0) = points[i].template cast<Dst_Scalar>().template block<Rows, Cols>(0, 0);
68 }
69
70 return converted;
71 }
72}
73
74template <typename Dst_Scalar, int Dst_Rows, int Dst_Cols, typename Src_Scalar, int Src_Rows, int Src_Cols, template <class> class Allocator = std::allocator>
75std::enable_if_t<
76 !std::is_same<Dst_Scalar, Src_Scalar>::value, //
77 std::vector<Eigen::Matrix<Dst_Scalar, Dst_Rows, Dst_Cols>, Allocator<Eigen::Matrix<Dst_Scalar, Dst_Rows, Dst_Cols>>>>
78convert_to_vector(const Eigen::Matrix<Src_Scalar, Src_Rows, Src_Cols>* points, int num_points) {
79 if (points == nullptr) {
80 return std::vector<Eigen::Matrix<Dst_Scalar, Dst_Rows, Dst_Cols>, Allocator<Eigen::Matrix<Dst_Scalar, Dst_Rows, Dst_Cols>>>(num_points);
81 }
82
83 std::vector<Eigen::Matrix<Dst_Scalar, Src_Rows, Src_Cols>, Allocator<Eigen::Matrix<Dst_Scalar, Src_Rows, Src_Cols>>> converted(num_points);
84 Eigen::Map<Eigen::Matrix<Dst_Scalar, -1, 1>> dst_map(converted[0].data(), converted.size() * Src_Rows * Src_Cols);
85 Eigen::Map<const Eigen::Matrix<Src_Scalar, -1, 1>> src_map(points[0].data(), num_points * Src_Rows * Src_Cols);
86 dst_map = src_map.template cast<Dst_Scalar>();
87
88 if constexpr (Dst_Rows == Src_Rows && Dst_Cols == Src_Cols) {
89 return converted;
90 } else {
92 }
93}
94
95} // namespace glk
96
97#endif
Definition async_buffer_copy.hpp:6
std::vector< Dst > convert_scalars(const Src *data, int num_data)
Definition type_conversion.hpp:11
std::enable_if_t< std::is_same< Dst_Scalar, Src_Scalar >::value, std::vector< Eigen::Matrix< Dst_Scalar, Dst_Rows, Dst_Cols >, Allocator< Eigen::Matrix< Dst_Scalar, Dst_Rows, Dst_Cols > > > > convert_to_vector(const Eigen::Matrix< Src_Scalar, Src_Rows, Src_Cols > *points, int num_points)
Definition type_conversion.hpp:49
std::enable_if_t< needs_aligned_allocator< T >::value, std::shared_ptr< T > > make_shared(Args &&... args)
Definition make_shared.hpp:20
std::enable_if_t< std::is_same< Dst_Scalar, Src_Scalar >::value &&Dst_Dim==Src_Dim, std::vector< Eigen::Matrix< Dst_Scalar, Dst_Dim, 1 >, Allocator< Eigen::Matrix< Dst_Scalar, Dst_Dim, 1 > > > > convert_vector(std::vector< Eigen::Matrix< Src_Scalar, Src_Dim, 1 >, Allocator< Eigen::Matrix< Src_Scalar, Src_Dim, 1 > > > &&data)
Definition type_conversion.hpp:21