diff --git a/cartographer/mapping/id.h b/cartographer/mapping/id.h index aa73590..347a243 100644 --- a/cartographer/mapping/id.h +++ b/cartographer/mapping/id.h @@ -21,10 +21,12 @@ #include #include #include +#include #include #include #include +#include "cartographer/common/make_unique.h" #include "cartographer/common/port.h" #include "glog/logging.h" @@ -129,7 +131,7 @@ class MapById { using iterator_category = std::bidirectional_iterator_tag; using value_type = IdDataReference; using difference_type = int64; - using pointer = const IdDataReference*; + using pointer = std::unique_ptr; using reference = const IdDataReference&; explicit ConstIterator(const MapById& map_by_id, const int trajectory_id) @@ -149,6 +151,10 @@ class MapById { current_data_->second}; } + std::unique_ptr operator->() const { + return common::make_unique(this->operator*()); + } + ConstIterator& operator++() { CHECK(current_trajectory_ != end_trajectory_); ++current_data_; diff --git a/cartographer/mapping/id_test.cc b/cartographer/mapping/id_test.cc index 46d448e..7573c7d 100644 --- a/cartographer/mapping/id_test.cc +++ b/cartographer/mapping/id_test.cc @@ -41,7 +41,7 @@ TEST(IdTest, MapByIdIterator) { map_by_id.Append(42, 3); map_by_id.Append(0, 0); map_by_id.Append(0, 1); - EXPECT_EQ(2, (*map_by_id.BeginOfTrajectory(7)).data); + EXPECT_EQ(2, map_by_id.BeginOfTrajectory(7)->data); EXPECT_TRUE(std::next(map_by_id.BeginOfTrajectory(7)) == map_by_id.EndOfTrajectory(7)); std::deque> expected_id_data = { diff --git a/cartographer/mapping_2d/sparse_pose_graph.cc b/cartographer/mapping_2d/sparse_pose_graph.cc index 64a5286..69b2a8e 100644 --- a/cartographer/mapping_2d/sparse_pose_graph.cc +++ b/cartographer/mapping_2d/sparse_pose_graph.cc @@ -72,7 +72,7 @@ std::vector SparsePoseGraph::GrowSubmapTransformsAsNeeded( CHECK_EQ(2, insertion_submaps.size()); const auto end_it = submap_data.EndOfTrajectory(trajectory_id); CHECK(submap_data.BeginOfTrajectory(trajectory_id) != end_it); - const mapping::SubmapId last_submap_id = (*std::prev(end_it)).id; + const mapping::SubmapId last_submap_id = std::prev(end_it)->id; if (submap_data_.at(last_submap_id).submap == insertion_submaps.front()) { // In this case, 'last_submap_id' is the ID of 'insertions_submaps.front()' // and 'insertions_submaps.back()' is new. @@ -596,7 +596,7 @@ transform::Rigid3d SparsePoseGraph::ComputeLocalToGlobalTransform( if (begin_it == end_it) { return transform::Rigid3d::Identity(); } - const mapping::SubmapId last_optimized_submap_id = (*std::prev(end_it)).id; + const mapping::SubmapId last_optimized_submap_id = std::prev(end_it)->id; // Accessing 'local_pose' in Submap is okay, since the member is const. return transform::Embed3D( submap_transforms.at(last_optimized_submap_id).pose) *