* Deriving typedef from pcl type * Explicit boost shared_ptr for function parameters * Use boost::shared_ptr instead of PCL::Ptr * Implementing boost-std compatibility * Using the compatibility layer
This commit is contained in:
@@ -70,11 +70,11 @@ namespace pcl_ros
|
||||
typedef pcl::KdTree<pcl::PointXYZ>::Ptr KdTreePtr;
|
||||
|
||||
typedef pcl::PointCloud<pcl::PointXYZ> PointCloudIn;
|
||||
typedef PointCloudIn::Ptr PointCloudInPtr;
|
||||
typedef PointCloudIn::ConstPtr PointCloudInConstPtr;
|
||||
typedef boost::shared_ptr<PointCloudIn> PointCloudInPtr;
|
||||
typedef boost::shared_ptr<const PointCloudIn> PointCloudInConstPtr;
|
||||
|
||||
typedef boost::shared_ptr <std::vector<int> > IndicesPtr;
|
||||
typedef boost::shared_ptr <const std::vector<int> > IndicesConstPtr;
|
||||
typedef pcl::IndicesPtr IndicesPtr;
|
||||
typedef pcl::IndicesConstPtr IndicesConstPtr;
|
||||
|
||||
/** \brief Empty constructor. */
|
||||
Feature () : /*input_(), indices_(), surface_(), */tree_(), k_(0), search_radius_(0),
|
||||
@@ -153,7 +153,7 @@ namespace pcl_ros
|
||||
indices.header.stamp = pcl_conversions::fromPCL(input->header).stamp;
|
||||
PointCloudIn cloud;
|
||||
cloud.header.stamp = input->header.stamp;
|
||||
nf_pc_.add (cloud.makeShared ());
|
||||
nf_pc_.add (ros_ptr(cloud.makeShared ()));
|
||||
nf_pi_.add (boost::make_shared<PointIndices> (indices));
|
||||
}
|
||||
|
||||
@@ -191,8 +191,8 @@ namespace pcl_ros
|
||||
typedef sensor_msgs::PointCloud2 PointCloud2;
|
||||
|
||||
typedef pcl::PointCloud<pcl::Normal> PointCloudN;
|
||||
typedef PointCloudN::Ptr PointCloudNPtr;
|
||||
typedef PointCloudN::ConstPtr PointCloudNConstPtr;
|
||||
typedef boost::shared_ptr<PointCloudN> PointCloudNPtr;
|
||||
typedef boost::shared_ptr<const PointCloudN> PointCloudNConstPtr;
|
||||
|
||||
FeatureFromNormals () : normals_() {};
|
||||
|
||||
|
||||
@@ -59,8 +59,8 @@ namespace pcl_ros
|
||||
public:
|
||||
typedef sensor_msgs::PointCloud2 PointCloud2;
|
||||
|
||||
typedef boost::shared_ptr <std::vector<int> > IndicesPtr;
|
||||
typedef boost::shared_ptr <const std::vector<int> > IndicesConstPtr;
|
||||
typedef pcl::IndicesPtr IndicesPtr;
|
||||
typedef pcl::IndicesConstPtr IndicesConstPtr;
|
||||
|
||||
Filter () {}
|
||||
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
// PCL includes
|
||||
#include <pcl_msgs/PointIndices.h>
|
||||
#include <pcl_msgs/ModelCoefficients.h>
|
||||
#include <pcl/pcl_base.h>
|
||||
#include <pcl/point_types.h>
|
||||
#include <pcl_conversions/pcl_conversions.h>
|
||||
#include "pcl_ros/point_cloud.h"
|
||||
@@ -75,8 +76,8 @@ namespace pcl_ros
|
||||
typedef sensor_msgs::PointCloud2 PointCloud2;
|
||||
|
||||
typedef pcl::PointCloud<pcl::PointXYZ> PointCloud;
|
||||
typedef PointCloud::Ptr PointCloudPtr;
|
||||
typedef PointCloud::ConstPtr PointCloudConstPtr;
|
||||
typedef boost::shared_ptr<PointCloud> PointCloudPtr;
|
||||
typedef boost::shared_ptr<const PointCloud> PointCloudConstPtr;
|
||||
|
||||
typedef pcl_msgs::PointIndices PointIndices;
|
||||
typedef PointIndices::Ptr PointIndicesPtr;
|
||||
@@ -86,8 +87,8 @@ namespace pcl_ros
|
||||
typedef ModelCoefficients::Ptr ModelCoefficientsPtr;
|
||||
typedef ModelCoefficients::ConstPtr ModelCoefficientsConstPtr;
|
||||
|
||||
typedef boost::shared_ptr <std::vector<int> > IndicesPtr;
|
||||
typedef boost::shared_ptr <const std::vector<int> > IndicesConstPtr;
|
||||
typedef pcl::IndicesPtr IndicesPtr;
|
||||
typedef pcl::IndicesConstPtr IndicesConstPtr;
|
||||
|
||||
/** \brief Empty constructor. */
|
||||
PCLNodelet () : use_indices_ (false), latched_indices_ (false),
|
||||
|
||||
@@ -294,4 +294,125 @@ namespace ros
|
||||
|
||||
} // namespace ros
|
||||
|
||||
// test if testing machinery can be implemented
|
||||
#if defined(__cpp_rvalue_references) && defined(__cpp_constexpr)
|
||||
#define ROS_POINTER_COMPATIBILITY_IMPLEMENTED 1
|
||||
#else
|
||||
#define ROS_POINTER_COMPATIBILITY_IMPLEMENTED 0
|
||||
#endif
|
||||
|
||||
#if ROS_POINTER_COMPATIBILITY_IMPLEMENTED
|
||||
#include <type_traits> // for std::is_same
|
||||
#include <memory> // for std::shared_ptr
|
||||
|
||||
#include <pcl/pcl_config.h>
|
||||
#if PCL_VERSION_COMPARE(>=, 1, 11, 0)
|
||||
#include <pcl/memory.h>
|
||||
#elif PCL_VERSION_COMPARE(>=, 1, 10, 0)
|
||||
#include <pcl/make_shared.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
namespace pcl
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
#if ROS_POINTER_COMPATIBILITY_IMPLEMENTED
|
||||
#if PCL_VERSION_COMPARE(>=, 1, 10, 0)
|
||||
template <class T>
|
||||
constexpr static bool pcl_uses_boost = std::is_same<boost::shared_ptr<T>,
|
||||
pcl::shared_ptr<T>>::value;
|
||||
#else
|
||||
template <class T>
|
||||
constexpr static bool pcl_uses_boost = true;
|
||||
#endif
|
||||
|
||||
template<class SharedPointer> struct Holder
|
||||
{
|
||||
SharedPointer p;
|
||||
|
||||
Holder(const SharedPointer &p) : p(p) {}
|
||||
Holder(const Holder &other) : p(other.p) {}
|
||||
Holder(Holder &&other) : p(std::move(other.p)) {}
|
||||
|
||||
void operator () (...) { p.reset(); }
|
||||
};
|
||||
|
||||
template<class T>
|
||||
inline std::shared_ptr<T> to_std_ptr(const boost::shared_ptr<T> &p)
|
||||
{
|
||||
typedef Holder<std::shared_ptr<T>> H;
|
||||
if(H *h = boost::get_deleter<H>(p))
|
||||
{
|
||||
return h->p;
|
||||
}
|
||||
else
|
||||
{
|
||||
return std::shared_ptr<T>(p.get(), Holder<boost::shared_ptr<T>>(p));
|
||||
}
|
||||
}
|
||||
|
||||
template<class T>
|
||||
inline boost::shared_ptr<T> to_boost_ptr(const std::shared_ptr<T> &p)
|
||||
{
|
||||
typedef Holder<boost::shared_ptr<T>> H;
|
||||
if(H * h = std::get_deleter<H>(p))
|
||||
{
|
||||
return h->p;
|
||||
}
|
||||
else
|
||||
{
|
||||
return boost::shared_ptr<T>(p.get(), Holder<std::shared_ptr<T>>(p));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
} // namespace pcl::detail
|
||||
|
||||
// add functions to convert to smart pointer used by ROS
|
||||
template <class T>
|
||||
inline boost::shared_ptr<T> ros_ptr(const boost::shared_ptr<T> &p)
|
||||
{
|
||||
return p;
|
||||
}
|
||||
|
||||
#if ROS_POINTER_COMPATIBILITY_IMPLEMENTED
|
||||
template <class T>
|
||||
inline boost::shared_ptr<T> ros_ptr(const std::shared_ptr<T> &p)
|
||||
{
|
||||
return detail::to_boost_ptr(p);
|
||||
}
|
||||
|
||||
// add functions to convert to smart pointer used by PCL, based on PCL's own pointer
|
||||
template <class T, class = typename std::enable_if<!detail::pcl_uses_boost<T>>::type>
|
||||
inline std::shared_ptr<T> pcl_ptr(const std::shared_ptr<T> &p)
|
||||
{
|
||||
return p;
|
||||
}
|
||||
|
||||
template <class T, class = typename std::enable_if<!detail::pcl_uses_boost<T>>::type>
|
||||
inline std::shared_ptr<T> pcl_ptr(const boost::shared_ptr<T> &p)
|
||||
{
|
||||
return detail::to_std_ptr(p);
|
||||
}
|
||||
|
||||
template <class T, class = typename std::enable_if<detail::pcl_uses_boost<T>>::type>
|
||||
inline boost::shared_ptr<T> pcl_ptr(const std::shared_ptr<T> &p)
|
||||
{
|
||||
return detail::to_boost_ptr(p);
|
||||
}
|
||||
|
||||
template <class T, class = typename std::enable_if<detail::pcl_uses_boost<T>>::type>
|
||||
inline boost::shared_ptr<T> pcl_ptr(const boost::shared_ptr<T> &p)
|
||||
{
|
||||
return p;
|
||||
}
|
||||
#else
|
||||
template <class T>
|
||||
inline boost::shared_ptr<T> pcl_ptr(const boost::shared_ptr<T> &p)
|
||||
{
|
||||
return p;
|
||||
}
|
||||
#endif
|
||||
} // namespace pcl
|
||||
|
||||
#endif
|
||||
|
||||
@@ -64,8 +64,8 @@ namespace pcl_ros
|
||||
class ExtractPolygonalPrismData : public PCLNodelet
|
||||
{
|
||||
typedef pcl::PointCloud<pcl::PointXYZ> PointCloud;
|
||||
typedef PointCloud::Ptr PointCloudPtr;
|
||||
typedef PointCloud::ConstPtr PointCloudConstPtr;
|
||||
typedef boost::shared_ptr<PointCloud> PointCloudPtr;
|
||||
typedef boost::shared_ptr<const PointCloud> PointCloudConstPtr;
|
||||
|
||||
protected:
|
||||
/** \brief The output PointIndices publisher. */
|
||||
|
||||
@@ -61,8 +61,8 @@ namespace pcl_ros
|
||||
class SACSegmentation : public PCLNodelet
|
||||
{
|
||||
typedef pcl::PointCloud<pcl::PointXYZ> PointCloud;
|
||||
typedef PointCloud::Ptr PointCloudPtr;
|
||||
typedef PointCloud::ConstPtr PointCloudConstPtr;
|
||||
typedef boost::shared_ptr<PointCloud> PointCloudPtr;
|
||||
typedef boost::shared_ptr<const PointCloud> PointCloudConstPtr;
|
||||
|
||||
public:
|
||||
/** \brief Constructor. */
|
||||
@@ -181,12 +181,12 @@ namespace pcl_ros
|
||||
class SACSegmentationFromNormals: public SACSegmentation
|
||||
{
|
||||
typedef pcl::PointCloud<pcl::PointXYZ> PointCloud;
|
||||
typedef PointCloud::Ptr PointCloudPtr;
|
||||
typedef PointCloud::ConstPtr PointCloudConstPtr;
|
||||
typedef boost::shared_ptr<PointCloud> PointCloudPtr;
|
||||
typedef boost::shared_ptr<const PointCloud> PointCloudConstPtr;
|
||||
|
||||
typedef pcl::PointCloud<pcl::Normal> PointCloudN;
|
||||
typedef PointCloudN::Ptr PointCloudNPtr;
|
||||
typedef PointCloudN::ConstPtr PointCloudNConstPtr;
|
||||
typedef boost::shared_ptr<PointCloudN> PointCloudNPtr;
|
||||
typedef boost::shared_ptr<const PointCloudN> PointCloudNConstPtr;
|
||||
|
||||
public:
|
||||
/** \brief Set the input TF frame the data should be transformed into before processing, if input.header.frame_id is different.
|
||||
|
||||
@@ -60,8 +60,8 @@ namespace pcl_ros
|
||||
class SegmentDifferences : public PCLNodelet
|
||||
{
|
||||
typedef pcl::PointCloud<pcl::PointXYZ> PointCloud;
|
||||
typedef PointCloud::Ptr PointCloudPtr;
|
||||
typedef PointCloud::ConstPtr PointCloudConstPtr;
|
||||
typedef boost::shared_ptr<PointCloud> PointCloudPtr;
|
||||
typedef boost::shared_ptr<const PointCloud> PointCloudConstPtr;
|
||||
|
||||
public:
|
||||
/** \brief Empty constructor. */
|
||||
|
||||
@@ -56,8 +56,8 @@ namespace pcl_ros
|
||||
class ConvexHull2D : public PCLNodelet
|
||||
{
|
||||
typedef pcl::PointCloud<pcl::PointXYZ> PointCloud;
|
||||
typedef PointCloud::Ptr PointCloudPtr;
|
||||
typedef PointCloud::ConstPtr PointCloudConstPtr;
|
||||
typedef boost::shared_ptr<PointCloud> PointCloudPtr;
|
||||
typedef boost::shared_ptr<const PointCloud> PointCloudConstPtr;
|
||||
|
||||
private:
|
||||
/** \brief Nodelet initialization routine. */
|
||||
|
||||
@@ -62,8 +62,8 @@ namespace pcl_ros
|
||||
typedef pcl::PointNormal NormalOut;
|
||||
|
||||
typedef pcl::PointCloud<PointIn> PointCloudIn;
|
||||
typedef PointCloudIn::Ptr PointCloudInPtr;
|
||||
typedef PointCloudIn::ConstPtr PointCloudInConstPtr;
|
||||
typedef boost::shared_ptr<PointCloudIn> PointCloudInPtr;
|
||||
typedef boost::shared_ptr<const PointCloudIn> PointCloudInConstPtr;
|
||||
typedef pcl::PointCloud<NormalOut> NormalCloudOut;
|
||||
|
||||
typedef pcl::KdTree<PointIn> KdTree;
|
||||
|
||||
Reference in New Issue
Block a user