gtsam_points
Loading...
Searching...
No Matches
frame_traits.hpp
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2021 Kenji Koide (k.koide@aist.go.jp)
3
4#pragma once
5
6#include <iostream>
7// #include <type_traits>
8#include <boost/poly_collection/detail/is_invocable.hpp>
9
10#include <Eigen/Core>
11
12namespace gtsam_points {
13
14namespace frame {
15
16template <typename T>
17struct traits {};
18
19// int size(const T& t)
20template <typename T, typename = void>
21struct size_defined : std::false_type {};
22
23template <typename T>
24struct size_defined<T, std::enable_if_t<boost::poly_collection::detail::is_invocable<decltype(&traits<T>::size), const T&>::value>> : std::true_type {
25};
26
27template <typename T>
28std::enable_if_t<size_defined<T>::value, int> size(const T& t) {
29 return traits<T>::size(t);
30}
31
32template <typename T>
33std::enable_if_t<!size_defined<T>::value, int> size(const T& t) {
34 std::cerr << "warning: calling frame::size() for unsupported class" << std::endl;
35 return 0;
36}
37
38// bool has_times(const T& t)
39template <typename T, typename = void>
40struct has_times_defined : std::false_type {};
41
42template <typename T>
43struct has_times_defined<T, std::enable_if_t<boost::poly_collection::detail::is_invocable<decltype(&traits<T>::has_times), const T&>::value>>
44: std::true_type {};
45
46template <typename T>
47std::enable_if_t<has_times_defined<T>::value, bool> has_times(const T& t) {
48 return traits<T>::has_times(t);
49}
50
51template <typename T>
52std::enable_if_t<!has_times_defined<T>::value, bool> has_times(const T& t) {
53 return false;
54}
55
56// bool has_points(const T& t)
57template <typename T, typename = void>
58struct has_points_defined : std::false_type {};
59
60template <typename T>
61struct has_points_defined<T, std::enable_if_t<boost::poly_collection::detail::is_invocable<decltype(&traits<T>::has_points), const T&>::value>>
62: std::true_type {};
63
64template <typename T>
65std::enable_if_t<has_points_defined<T>::value, bool> has_points(const T& t) {
66 return traits<T>::has_points(t);
67}
68
69template <typename T>
70std::enable_if_t<!has_points_defined<T>::value, bool> has_points(const T& t) {
71 return false;
72}
73
74// bool has_normals(const T& t)
75template <typename T, typename = void>
76struct has_normals_defined : std::false_type {};
77
78template <typename T>
79struct has_normals_defined<T, std::enable_if_t<boost::poly_collection::detail::is_invocable<decltype(&traits<T>::has_normals), const T&>::value>>
80: std::true_type {};
81
82template <typename T>
83std::enable_if_t<has_normals_defined<T>::value, bool> has_normals(const T& t) {
84 return traits<T>::has_normals(t);
85}
86
87template <typename T>
88std::enable_if_t<!has_normals_defined<T>::value, bool> has_normals(const T& t) {
89 return false;
90}
91
92// bool has_covs(const T& t)
93template <typename T, typename = void>
94struct has_covs_defined : std::false_type {};
95
96template <typename T>
97struct has_covs_defined<T, std::enable_if_t<boost::poly_collection::detail::is_invocable<decltype(&traits<T>::has_covs), const T&>::value>>
98: std::true_type {};
99
100template <typename T>
101std::enable_if_t<has_covs_defined<T>::value, bool> has_covs(const T& t) {
102 return traits<T>::has_covs(t);
103}
104
105template <typename T>
106std::enable_if_t<!has_covs_defined<T>::value, bool> has_covs(const T& t) {
107 return false;
108}
109
110// bool has_intensities(const T& t)
111template <typename T, typename = void>
112struct has_intensities_defined : std::false_type {};
113
114template <typename T>
116 T,
117 std::enable_if_t<boost::poly_collection::detail::is_invocable<decltype(&traits<T>::has_intensities), const T&>::value>> : std::true_type {};
118
119template <typename T>
120std::enable_if_t<has_intensities_defined<T>::value, bool> has_intensities(const T& t) {
122}
123
124template <typename T>
125std::enable_if_t<!has_intensities_defined<T>::value, bool> has_intensities(const T& t) {
126 return false;
127}
128
129// Point accessors
130template <typename T>
131double time(const T& t, size_t i) {
132 return traits<T>::time(t, i);
133}
134
135template <typename T>
136decltype(auto) point(const T& t, size_t i) {
137 return traits<T>::point(t, i);
138}
139
140// Normal
141template <typename T, typename = void>
142struct normal_defined : std::false_type {};
143
144template <typename T>
145struct normal_defined<T, std::enable_if_t<boost::poly_collection::detail::is_invocable<decltype(&traits<T>::normal), const T&, size_t>::value>>
146: std::true_type {};
147
148template <typename T, typename std::enable_if_t<normal_defined<T>::value>* = nullptr>
149decltype(auto) normal(const T& t, size_t i) {
150 return traits<T>::normal(t, i);
151}
152
153template <typename T, typename std::enable_if_t<!normal_defined<T>::value>* = nullptr>
154Eigen::Vector4d normal(const T& t, size_t i) {
155 std::cerr << "error: undefined point attribute access (normal)!!" << std::endl;
156 abort();
157 return Eigen::Vector4d(0, 0, 0, 0);
158}
159
160template <typename T>
161decltype(auto) cov(const T& t, size_t i) {
162 return traits<T>::cov(t, i);
163}
164
165template <typename T>
166decltype(auto) intensity(const T& t, size_t i) {
167 return traits<T>::intensity(t, i);
168}
169
170template <typename T>
171decltype(auto) intensity_gradient(const T& t, size_t i) {
172 return traits<T>::intensity_gradient(t, i);
173}
174
175template <typename T>
176auto time_gpu(const T& t, size_t i) {
177 return traits<T>::time_gpu(t, i);
178}
179
180template <typename T>
181auto point_gpu(const T& t, size_t i) {
182 return traits<T>::point_gpu(t, i);
183}
184
185template <typename T>
186auto normal_gpu(const T& t, size_t i) {
187 return traits<T>::normal_gpu(t, i);
188}
189
190template <typename T>
191auto cov_gpu(const T& t, size_t i) {
192 return traits<T>::cov_gpu(t, i);
193}
194
195template <typename T>
196auto intensity_gpu(const T& t, size_t i) {
197 return traits<T>::intensity_gpu(t, i);
198}
199
200} // namespace frame
201
202} // namespace gtsam_points
Definition frame_traits.hpp:94
Definition frame_traits.hpp:112
Definition frame_traits.hpp:76
Definition frame_traits.hpp:58
Definition frame_traits.hpp:40
Definition frame_traits.hpp:142
Definition frame_traits.hpp:21
Definition frame_traits.hpp:17