44 #pragma GCC system_header 48 #pragma warning (push, 2) 50 #pragma warning (disable: 4244) 55 #include <pcl/point_struct_traits.h> 56 #include <boost/mpl/assert.hpp> 57 #include <boost/preprocessor/seq/for_each.hpp> 58 #include <boost/preprocessor/seq/transform.hpp> 59 #include <boost/preprocessor/tuple/elem.hpp> 60 #include <boost/preprocessor/cat.hpp> 64 #include <type_traits> 67 #define POINT_CLOUD_REGISTER_POINT_STRUCT(name, fseq) \ 68 POINT_CLOUD_REGISTER_POINT_STRUCT_I(name, \ 69 BOOST_PP_CAT(POINT_CLOUD_REGISTER_POINT_STRUCT_X fseq, 0)) 72 #define POINT_CLOUD_REGISTER_POINT_WRAPPER(wrapper, pod) \ 73 BOOST_MPL_ASSERT_MSG(sizeof(wrapper) == sizeof(pod), POINT_WRAPPER_AND_POD_TYPES_HAVE_DIFFERENT_SIZES, (wrapper&, pod&)); \ 76 template<> struct POD<wrapper> { using type = pod; }; \ 83 #define POINT_CLOUD_REGISTER_POINT_STRUCT_X(type, name, tag) \ 84 ((type, name, tag)) POINT_CLOUD_REGISTER_POINT_STRUCT_Y 85 #define POINT_CLOUD_REGISTER_POINT_STRUCT_Y(type, name, tag) \ 86 ((type, name, tag)) POINT_CLOUD_REGISTER_POINT_STRUCT_X 87 #define POINT_CLOUD_REGISTER_POINT_STRUCT_X0 88 #define POINT_CLOUD_REGISTER_POINT_STRUCT_Y0 94 template<
typename T>
inline 95 std::enable_if_t<!std::is_array<T>::value>
101 template<
typename T>
inline 102 std::enable_if_t<std::is_array<T>::value>
103 plus (std::remove_const_t<T> &l,
const T &r)
105 using type = std::remove_all_extents_t<T>;
106 static const std::uint32_t count =
sizeof (T) /
sizeof (type);
111 template<
typename T1,
typename T2>
inline 112 std::enable_if_t<!std::is_array<T1>::value>
118 template<
typename T1,
typename T2>
inline 119 std::enable_if_t<std::is_array<T1>::value>
122 using type = std::remove_all_extents_t<T1>;
123 static const std::uint32_t count =
sizeof (T1) /
sizeof (type);
128 template<
typename T>
inline 129 std::enable_if_t<!std::is_array<T>::value>
135 template<
typename T>
inline 136 std::enable_if_t<std::is_array<T>::value>
137 minus (std::remove_const_t<T> &l,
const T &r)
139 using type = std::remove_all_extents_t<T>;
140 static const std::uint32_t count =
sizeof (T) /
sizeof (type);
145 template<
typename T1,
typename T2>
inline 146 std::enable_if_t<!std::is_array<T1>::value>
152 template<
typename T1,
typename T2>
inline 153 std::enable_if_t<std::is_array<T1>::value>
156 using type = std::remove_all_extents_t<T1>;
157 static const std::uint32_t count =
sizeof (T1) /
sizeof (type);
162 template<
typename T1,
typename T2>
inline 163 std::enable_if_t<!std::is_array<T1>::value>
169 template<
typename T1,
typename T2>
inline 170 std::enable_if_t<std::is_array<T1>::value>
173 using type = std::remove_all_extents_t<T1>;
174 static const std::uint32_t count =
sizeof (T1) /
sizeof (type);
179 template<
typename T1,
typename T2>
inline 180 std::enable_if_t<!std::is_array<T1>::value>
186 template<
typename T1,
typename T2>
inline 187 std::enable_if_t<std::is_array<T1>::value>
190 using type = std::remove_all_extents_t<T1>;
191 static const std::uint32_t count =
sizeof (T1) /
sizeof (type);
199 #define PCL_PLUSEQ_POINT_TAG(r, data, elem) \ 200 pcl::traits::plus (lhs.BOOST_PP_TUPLE_ELEM(3, 1, elem), \ 201 rhs.BOOST_PP_TUPLE_ELEM(3, 1, elem)); 204 #define PCL_PLUSEQSC_POINT_TAG(r, data, elem) \ 205 pcl::traits::plusscalar (p.BOOST_PP_TUPLE_ELEM(3, 1, elem), \ 210 #define PCL_MINUSEQ_POINT_TAG(r, data, elem) \ 211 pcl::traits::minus (lhs.BOOST_PP_TUPLE_ELEM(3, 1, elem), \ 212 rhs.BOOST_PP_TUPLE_ELEM(3, 1, elem)); 215 #define PCL_MINUSEQSC_POINT_TAG(r, data, elem) \ 216 pcl::traits::minusscalar (p.BOOST_PP_TUPLE_ELEM(3, 1, elem), \ 221 #define PCL_MULEQSC_POINT_TAG(r, data, elem) \ 222 pcl::traits::mulscalar (p.BOOST_PP_TUPLE_ELEM(3, 1, elem), \ 226 #define PCL_DIVEQSC_POINT_TAG(r, data, elem) \ 227 pcl::traits::divscalar (p.BOOST_PP_TUPLE_ELEM(3, 1, elem), \ 234 #define POINT_CLOUD_REGISTER_POINT_STRUCT_I(name, seq) \ 239 BOOST_PP_SEQ_FOR_EACH(POINT_CLOUD_REGISTER_FIELD_TAG, name, seq) \ 243 BOOST_PP_SEQ_FOR_EACH(POINT_CLOUD_REGISTER_FIELD_NAME, name, seq) \ 244 BOOST_PP_SEQ_FOR_EACH(POINT_CLOUD_REGISTER_FIELD_OFFSET, name, seq) \ 245 BOOST_PP_SEQ_FOR_EACH(POINT_CLOUD_REGISTER_FIELD_DATATYPE, name, seq) \ 246 POINT_CLOUD_REGISTER_POINT_FIELD_LIST(name, POINT_CLOUD_EXTRACT_TAGS(seq)) \ 251 operator+= (name& lhs, const name& rhs) \ 253 BOOST_PP_SEQ_FOR_EACH(PCL_PLUSEQ_POINT_TAG, _, seq) \ 257 operator+= (name& p, const float& scalar) \ 259 BOOST_PP_SEQ_FOR_EACH(PCL_PLUSEQSC_POINT_TAG, _, seq) \ 262 inline const name operator+ (const name& lhs, const name& rhs) \ 263 { name result = lhs; result += rhs; return (result); } \ 264 inline const name operator+ (const float& scalar, const name& p) \ 265 { name result = p; result += scalar; return (result); } \ 266 inline const name operator+ (const name& p, const float& scalar) \ 267 { name result = p; result += scalar; return (result); } \ 269 operator-= (name& lhs, const name& rhs) \ 271 BOOST_PP_SEQ_FOR_EACH(PCL_MINUSEQ_POINT_TAG, _, seq) \ 275 operator-= (name& p, const float& scalar) \ 277 BOOST_PP_SEQ_FOR_EACH(PCL_MINUSEQSC_POINT_TAG, _, seq) \ 280 inline const name operator- (const name& lhs, const name& rhs) \ 281 { name result = lhs; result -= rhs; return (result); } \ 282 inline const name operator- (const float& scalar, const name& p) \ 283 { name result = p; result -= scalar; return (result); } \ 284 inline const name operator- (const name& p, const float& scalar) \ 285 { name result = p; result -= scalar; return (result); } \ 287 operator*= (name& p, const float& scalar) \ 289 BOOST_PP_SEQ_FOR_EACH(PCL_MULEQSC_POINT_TAG, _, seq) \ 292 inline const name operator* (const float& scalar, const name& p) \ 293 { name result = p; result *= scalar; return (result); } \ 294 inline const name operator* (const name& p, const float& scalar) \ 295 { name result = p; result *= scalar; return (result); } \ 297 operator/= (name& p, const float& scalar) \ 299 BOOST_PP_SEQ_FOR_EACH(PCL_DIVEQSC_POINT_TAG, _, seq) \ 302 inline const name operator/ (const float& scalar, const name& p) \ 303 { name result = p; result /= scalar; return (result); } \ 304 inline const name operator/ (const name& p, const float& scalar) \ 305 { name result = p; result /= scalar; return (result); } \ 310 #define POINT_CLOUD_REGISTER_FIELD_TAG(r, name, elem) \ 311 struct BOOST_PP_TUPLE_ELEM(3, 2, elem); \ 314 #define POINT_CLOUD_TAG_OP(s, data, elem) pcl::fields::BOOST_PP_TUPLE_ELEM(3, 2, elem) 316 #define POINT_CLOUD_EXTRACT_TAGS(seq) BOOST_PP_SEQ_TRANSFORM(POINT_CLOUD_TAG_OP, _, seq) 319 #pragma warning (pop)
std::enable_if_t<!std::is_array< T >::value > plus(T &l, const T &r)
std::enable_if_t<!std::is_array< T1 >::value > mulscalar(T1 &p, const T2 &scalar)
std::enable_if_t<!std::is_array< T1 >::value > plusscalar(T1 &p, const T2 &scalar)
std::enable_if_t<!std::is_array< T >::value > minus(T &l, const T &r)
std::enable_if_t<!std::is_array< T1 >::value > minusscalar(T1 &p, const T2 &scalar)
std::enable_if_t<!std::is_array< T1 >::value > divscalar(T1 &p, const T2 &scalar)