Go to the documentation of this file.00001
00002 #include <boost/foreach.hpp>
00003 #include <sensor_msgs/PointCloud2.h>
00004 #include <sensor_msgs/PointField.h>
00005
00006 namespace point_cloud_color {
00007
00014 template <bool SAFE> class PointCloud2Iterator {
00015 public:
00016 PointCloud2Iterator(sensor_msgs::PointCloud2::Ptr pcl, std::vector<std::string> fieldNames);
00017 inline bool isFieldAvailable(uint32_t fieldIndex) {
00018 return fieldsAvailable[fieldIndex];
00019 }
00020 template <class T> inline bool isFieldCompatible<T>(uint32_t fieldIndex) {
00021 return sizeof(T) == fieldDataSizes[fieldIndex];
00022 }
00023 template <> inline bool isFieldCompatible<float>(uint32_t fieldIndex) {
00024 return fieldDataTypes[fieldIndex] == sensor_msgs::PointField::FLOAT32;
00025 }
00026 template <bool SAFE, class T> T getField<T>(uint32_t pointIndex, uint32_t fieldIndex);
00027 template <class T> void setField<T>(uint32_t pointIndex, uint32_t fieldIndex, T value);
00028 private:
00029 inline void checkFieldAvailable(uint32_t fieldIndex) {
00030 if (SAFE && !isFieldAvailable(fieldIndex)) {
00031 throw std::runtime_error("Field not available.");
00032 }
00033 }
00034 template <class T> inline void checkFieldCompatible<T>(uint32_t fieldIndex) {
00035 if (SAFE && isFieldCompatible<T>(fieldIndex)) {
00036 throw std::runtime_error("Field not compatible.");
00037 }
00038 }
00039 sensor_msgs::PointCloud2::Ptr pcl;
00040 std::vector<std::string> fieldNames;
00041 std::vector<bool> fieldsAvailable;
00042 std::vector<uint32_t> fieldOffsets;
00043 std::vector<uint8_t> fieldDataTypes;
00044 std::vector<size_t> fieldDataSizes;
00045 };
00046
00047 }