8#include <boost/poly_collection/detail/is_invocable.hpp>
12namespace gtsam_points {
20template <
typename T,
typename =
void>
24struct size_defined<T, std::enable_if_t<boost::poly_collection::detail::is_invocable<decltype(&traits<T>::size), const T&>::value>> : std::true_type {
28std::enable_if_t<size_defined<T>::value,
int> size(
const T& 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;
39template <
typename T,
typename =
void>
43struct has_times_defined<T, std::enable_if_t<boost::poly_collection::detail::is_invocable<decltype(&traits<T>::has_times), const T&>::value>>
47std::enable_if_t<has_times_defined<T>::value,
bool> has_times(
const T& t) {
52std::enable_if_t<!has_times_defined<T>::value,
bool> has_times(
const T& t) {
57template <
typename T,
typename =
void>
61struct has_points_defined<T, std::enable_if_t<boost::poly_collection::detail::is_invocable<decltype(&traits<T>::has_points), const T&>::value>>
65std::enable_if_t<has_points_defined<T>::value,
bool> has_points(
const T& t) {
70std::enable_if_t<!has_points_defined<T>::value,
bool> has_points(
const T& t) {
75template <
typename T,
typename =
void>
79struct has_normals_defined<T, std::enable_if_t<boost::poly_collection::detail::is_invocable<decltype(&traits<T>::has_normals), const T&>::value>>
83std::enable_if_t<has_normals_defined<T>::value,
bool> has_normals(
const T& t) {
88std::enable_if_t<!has_normals_defined<T>::value,
bool> has_normals(
const T& t) {
93template <
typename T,
typename =
void>
97struct has_covs_defined<T, std::enable_if_t<boost::poly_collection::detail::is_invocable<decltype(&traits<T>::has_covs), const T&>::value>>
101std::enable_if_t<has_covs_defined<T>::value,
bool> has_covs(
const T& t) {
106std::enable_if_t<!has_covs_defined<T>::value,
bool> has_covs(
const T& t) {
111template <
typename T,
typename =
void>
117 std::enable_if_t<boost::poly_collection::detail::is_invocable<decltype(&traits<T>::has_intensities), const T&>::value>> : std::true_type {};
120std::enable_if_t<has_intensities_defined<T>::value,
bool> has_intensities(
const T& t) {
125std::enable_if_t<!has_intensities_defined<T>::value,
bool> has_intensities(
const T& t) {
131double time(
const T& t,
size_t i) {
132 return traits<T>::time(t, i);
136decltype(
auto) point(
const T& t,
size_t i) {
137 return traits<T>::point(t, i);
141template <
typename T,
typename =
void>
145struct normal_defined<T, std::enable_if_t<boost::poly_collection::detail::is_invocable<decltype(&traits<T>::normal), const T&, size_t>::value>>
148template <typename T, typename std::enable_if_t<normal_defined<T>::value>* =
nullptr>
149decltype(
auto) normal(
const T& t,
size_t i) {
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;
157 return Eigen::Vector4d(0, 0, 0, 0);
161decltype(
auto) cov(
const T& t,
size_t i) {
162 return traits<T>::cov(t, i);
166decltype(
auto) intensity(
const T& t,
size_t i) {
167 return traits<T>::intensity(t, i);
171decltype(
auto) intensity_gradient(
const T& t,
size_t i) {
172 return traits<T>::intensity_gradient(t, i);
176auto time_gpu(
const T& t,
size_t i) {
177 return traits<T>::time_gpu(t, i);
181auto point_gpu(
const T& t,
size_t i) {
182 return traits<T>::point_gpu(t, i);
186auto normal_gpu(
const T& t,
size_t i) {
187 return traits<T>::normal_gpu(t, i);
191auto cov_gpu(
const T& t,
size_t i) {
192 return traits<T>::cov_gpu(t, i);
196auto intensity_gpu(
const T& t,
size_t i) {
197 return traits<T>::intensity_gpu(t, i);
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