From 5f6ad7b279ee75bdfa5df6aa97f3e44b79056084 Mon Sep 17 00:00:00 2001 From: Alejandro Hernandez Cordero Date: Thu, 9 Jul 2026 12:27:22 +0200 Subject: [PATCH 1/2] Removed define protected private hack Signed-off-by: Alejandro Hernandez Cordero --- draco_point_cloud_transport/src/cloud.cpp | 29 ++++++++++------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/draco_point_cloud_transport/src/cloud.cpp b/draco_point_cloud_transport/src/cloud.cpp index 65d9dab..e5f904b 100644 --- a/draco_point_cloud_transport/src/cloud.cpp +++ b/draco_point_cloud_transport/src/cloud.cpp @@ -29,17 +29,11 @@ * POSSIBILITY OF SUCH DAMAGE. */ -// HACK: we need to access PointCloud2IteratorBase::data_char_ which is private #include #include #include #include -#define private protected -#include -#undef private - - #include namespace cras @@ -54,24 +48,22 @@ bool hasField(const ::cras::Cloud & cloud, const std::string & fieldName) sensor_msgs::msg::PointField & getField(::cras::Cloud & cloud, const std::string & fieldName) { - for (auto & field : cloud.fields) { - if (field.name == fieldName) { - return field; - } + const auto it = std::ranges::find(cloud.fields, fieldName, &sensor_msgs::msg::PointField::name); + if (it == cloud.fields.end()) { + throw std::runtime_error(std::string("Field ") + fieldName + " does not exist."); } - throw std::runtime_error(std::string("Field ") + fieldName + " does not exist."); + return *it; } const sensor_msgs::msg::PointField & getField( const ::cras::Cloud & cloud, const std::string & fieldName) { - for (const auto & field : cloud.fields) { - if (field.name == fieldName) { - return field; - } + const auto it = std::ranges::find(cloud.fields, fieldName, &sensor_msgs::msg::PointField::name); + if (it == cloud.fields.end()) { + throw std::runtime_error(std::string("Field ") + fieldName + " does not exist."); } - throw std::runtime_error(std::string("Field ") + fieldName + " does not exist."); + return *it; } size_t sizeOfPointField(const ::sensor_msgs::msg::PointField & field) @@ -132,7 +124,10 @@ GenericCloudIteratorBase::GenericCloudIteratorBase( template class V> U * GenericCloudIteratorBase::rawData() const { - return this->data_char_; + // The current element's address is exactly the raw byte position the base + // iterator tracks internally (data_ is kept in sync with its private + // data_char_), so we avoid reaching into that private member. + return reinterpret_cast(&this->operator*()); } template From a88b478a49d496d2243dd291add397e1fe3afb02 Mon Sep 17 00:00:00 2001 From: Alejandro Hernandez Cordero Date: Thu, 9 Jul 2026 12:37:55 +0200 Subject: [PATCH 2/2] Redesigned zlib Datablock to use std::vector Signed-off-by: Alejandro Hernandez Cordero --- zlib_point_cloud_transport/src/zlib_cpp.cpp | 26 +++++++------------ zlib_point_cloud_transport/src/zlib_cpp.hpp | 15 +++++++++-- .../src/zlib_publisher.cpp | 6 ++--- .../src/zlib_subscriber.cpp | 6 ++--- .../test/test_zlib_roundtrip.cpp | 6 ++--- 5 files changed, 32 insertions(+), 27 deletions(-) diff --git a/zlib_point_cloud_transport/src/zlib_cpp.cpp b/zlib_point_cloud_transport/src/zlib_cpp.cpp index 542ffdc..65b22d4 100644 --- a/zlib_point_cloud_transport/src/zlib_cpp.cpp +++ b/zlib_point_cloud_transport/src/zlib_cpp.cpp @@ -41,29 +41,23 @@ const int MAX_CHUNK_SIZE = 1024; const int WINDOW_BITS = 15; -/// Allocate memory to DataBlock and assign to a shared_ptr object. +/// Allocate a DataBlock owning `size` bytes in a single allocation. std::shared_ptr AllocateData(std::size_t size) { - std::shared_ptr data(new DataBlock, [](DataBlock * p) { - delete[] p->ptr; - delete p; - }); - data->ptr = new uint8_t[size]; - data->size = size; - return data; + return std::make_shared(size); } std::shared_ptr ExpandDataList(const std::list> & data_list) { std::size_t total_size = 0; for (const std::shared_ptr & this_data : data_list) { - total_size += this_data->size; + total_size += this_data->size(); } std::shared_ptr out_data = AllocateData(total_size); - uint8_t * this_ptr = out_data->ptr; + uint8_t * this_ptr = out_data->ptr(); for (const std::shared_ptr & this_data : data_list) { - memcpy(this_ptr, this_data->ptr, this_data->size); - this_ptr += this_data->size; + memcpy(this_ptr, this_data->ptr(), this_data->size()); + this_ptr += this_data->size(); } return out_data; } @@ -110,7 +104,7 @@ std::list> Comp::Process( std::size_t out_size = MAX_CHUNK_SIZE - zs_.avail_out; std::shared_ptr out_data = AllocateData(out_size); // Copy and add to output data list. - memcpy(out_data->ptr, out_buffer, out_size); + memcpy(out_data->ptr(), out_buffer, out_size); out_data_list.push_back(std::move(out_data)); } while (zs_.avail_out == 0); // Done. @@ -134,8 +128,8 @@ std::list> Decomp::Process( std::list> out_data_list; uint8_t out_buffer[MAX_CHUNK_SIZE]; // Incoming buffer. - zs_.avail_in = static_cast(compressed_data->size); - zs_.next_in = compressed_data->ptr; + zs_.avail_in = static_cast(compressed_data->size()); + zs_.next_in = compressed_data->ptr(); int ret; do { // Prepare outcoming buffer and size. @@ -156,7 +150,7 @@ std::list> Decomp::Process( std::size_t out_size = MAX_CHUNK_SIZE - zs_.avail_out; // Allocate outcome buffer. std::shared_ptr out_data = AllocateData(out_size); - memcpy(out_data->ptr, out_buffer, out_size); + memcpy(out_data->ptr(), out_buffer, out_size); out_data_list.push_back(std::move(out_data)); } while (zs_.avail_out == 0); return std::move(out_data_list); diff --git a/zlib_point_cloud_transport/src/zlib_cpp.hpp b/zlib_point_cloud_transport/src/zlib_cpp.hpp index f2f6526..597506b 100644 --- a/zlib_point_cloud_transport/src/zlib_cpp.hpp +++ b/zlib_point_cloud_transport/src/zlib_cpp.hpp @@ -37,14 +37,25 @@ #include #include #include +#include namespace zlib { struct DataBlock { - uint8_t * ptr; - std::size_t size; + //! Owned byte buffer; freed automatically with the DataBlock. + std::vector data; + + explicit DataBlock(std::size_t size) + : data(size) {} + + //! Pointer to the owned byte buffer. + [[nodiscard]] uint8_t * ptr() noexcept {return data.data();} + [[nodiscard]] const uint8_t * ptr() const noexcept {return data.data();} + + //! Number of bytes in the buffer. + [[nodiscard]] std::size_t size() const noexcept {return data.size();} }; std::shared_ptr AllocateData(std::size_t size); diff --git a/zlib_point_cloud_transport/src/zlib_publisher.cpp b/zlib_point_cloud_transport/src/zlib_publisher.cpp index c6669df..84d24bb 100644 --- a/zlib_point_cloud_transport/src/zlib_publisher.cpp +++ b/zlib_point_cloud_transport/src/zlib_publisher.cpp @@ -90,15 +90,15 @@ ZlibPublisher::TypedEncodeResult ZlibPublisher::encodeTyped( size_t total_size = 0; for (const auto & data : g_compressed_data) { - total_size += data->size; + total_size += data->size(); } compressed.compressed_data.resize(total_size); size_t index = 0; for (const auto & data : g_compressed_data) { - memcpy(&compressed.compressed_data[index], data->ptr, data->size); - index += data->size; + memcpy(&compressed.compressed_data[index], data->ptr(), data->size()); + index += data->size(); } compressed.width = raw.width; diff --git a/zlib_point_cloud_transport/src/zlib_subscriber.cpp b/zlib_point_cloud_transport/src/zlib_subscriber.cpp index b12b4b3..2b0f42d 100644 --- a/zlib_point_cloud_transport/src/zlib_subscriber.cpp +++ b/zlib_point_cloud_transport/src/zlib_subscriber.cpp @@ -54,15 +54,15 @@ ZlibSubscriber::DecodeResult ZlibSubscriber::decodeTyped( zlib::Decomp decomp; std::shared_ptr data = zlib::AllocateData(msg.compressed_data.size()); - memcpy(data->ptr, &msg.compressed_data[0], msg.compressed_data.size()); + memcpy(data->ptr(), &msg.compressed_data[0], msg.compressed_data.size()); std::list> out_data_list; out_data_list = decomp.Process(data); std::shared_ptr data2 = zlib::ExpandDataList(out_data_list); - result->data.resize(data2->size); - memcpy(&result->data[0], data2->ptr, data2->size); + result->data.resize(data2->size()); + memcpy(&result->data[0], data2->ptr(), data2->size()); result->width = msg.width; result->height = msg.height; diff --git a/zlib_point_cloud_transport/test/test_zlib_roundtrip.cpp b/zlib_point_cloud_transport/test/test_zlib_roundtrip.cpp index 00d27f0..9a3d645 100644 --- a/zlib_point_cloud_transport/test/test_zlib_roundtrip.cpp +++ b/zlib_point_cloud_transport/test/test_zlib_roundtrip.cpp @@ -58,7 +58,7 @@ std::vector compress(const std::vector & in) const auto chunks = comp.Process(in.data(), in.size(), true); std::vector out; for (const auto & chunk : chunks) { - out.insert(out.end(), chunk->ptr, chunk->ptr + chunk->size); + out.insert(out.end(), chunk->ptr(), chunk->ptr() + chunk->size()); } return out; } @@ -68,10 +68,10 @@ std::vector decompress(const std::vector & in) { zlib::Decomp decomp; auto block = zlib::AllocateData(in.size()); - std::memcpy(block->ptr, in.data(), in.size()); + std::memcpy(block->ptr(), in.data(), in.size()); const auto chunks = decomp.Process(block); const auto expanded = zlib::ExpandDataList(chunks); - return std::vector(expanded->ptr, expanded->ptr + expanded->size); + return std::vector(expanded->ptr(), expanded->ptr() + expanded->size()); } } // namespace