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)