From 8205c34abeaafd1fe00c74c65c4790d673379eee Mon Sep 17 00:00:00 2001 From: Patrick Niklaus Date: Sun, 16 Oct 2016 22:51:42 +0200 Subject: [PATCH] Fix duplicated code in tile plugin --- src/engine/plugins/tile.cpp | 119 ++++++++++-------------------------- 1 file changed, 33 insertions(+), 86 deletions(-) diff --git a/src/engine/plugins/tile.cpp b/src/engine/plugins/tile.cpp index e79a015dc..8a892bb2d 100644 --- a/src/engine/plugins/tile.cpp +++ b/src/engine/plugins/tile.cpp @@ -601,50 +601,24 @@ Status TilePlugin::HandleRequest(const std::shared_ptr forward_weight_vector, reverse_weight_vector; - std::vector forward_datasource_vector, reverse_datasource_vector; for (const auto &edge : edges) { - int forward_weight = 0, reverse_weight = 0; - std::uint8_t forward_datasource = 0; - std::uint8_t reverse_datasource = 0; - // TODO this approach of writing at least an empty vector for any segment is probably stupid - // (inefficient) - forward_weight_vector = - facade->GetUncompressedForwardWeights(edge.packed_geometry_id); - reverse_weight_vector = - facade->GetUncompressedReverseWeights(edge.packed_geometry_id); - - forward_weight = forward_weight_vector[edge.fwd_segment_position]; - - BOOST_ASSERT(edge.fwd_segment_position < reverse_weight_vector.size()); - reverse_weight = - reverse_weight_vector[reverse_weight_vector.size() - edge.fwd_segment_position - 1]; - - forward_datasource_vector.clear(); - forward_datasource_vector = facade->GetUncompressedForwardDatasources(edge.packed_geometry_id); - forward_datasource = forward_datasource_vector[edge.fwd_segment_position]; - - reverse_datasource_vector.clear(); - reverse_datasource_vector = + const auto forward_datasource_vector = facade->GetUncompressedForwardDatasources(edge.packed_geometry_id); + const auto reverse_datasource_vector = facade->GetUncompressedReverseDatasources(edge.packed_geometry_id); - reverse_datasource = reverse_datasource_vector[reverse_datasource_vector.size() - + + BOOST_ASSERT(edge.fwd_segment_position < forward_datasource_vector.size()); + const auto forward_datasource = forward_datasource_vector[edge.fwd_segment_position]; + BOOST_ASSERT(edge.fwd_segment_position < reverse_datasource_vector.size()); + const auto reverse_datasource = reverse_datasource_vector[reverse_datasource_vector.size() - edge.fwd_segment_position - 1]; - use_line_value(reverse_weight); // Keep track of the highest datasource seen so that we don't write unnecessary // data to the layer attribute values max_datasource_id = std::max(max_datasource_id, forward_datasource); max_datasource_id = std::max(max_datasource_id, reverse_datasource); - - std::string name = facade->GetNameForID(edge.name_id); - if (name_offsets.find(name) == name_offsets.end()) - { - names.push_back(name); - name_offsets[name] = names.size() - 1; - } } // Convert tile coordinates into mercator coordinates @@ -673,59 +647,38 @@ Status TilePlugin::HandleRequest(const std::shared_ptr forward_weight_vector; - std::vector forward_datasource_vector; - std::vector reverse_datasource_vector; for (const auto &edge : edges) { // Get coordinates for start/end nodes of segment (NodeIDs u and v) const auto a = facade->GetCoordinateOfNode(edge.u); const auto b = facade->GetCoordinateOfNode(edge.v); // Calculate the length in meters - const double length = - osrm::util::coordinate_calculation::haversineDistance(a, b); + const double length = osrm::util::coordinate_calculation::haversineDistance(a, b); - int forward_weight = 0; - int reverse_weight = 0; + const auto forward_weight_vector = facade->GetUncompressedForwardWeights(edge.packed_geometry_id); + const auto reverse_weight_vector = facade->GetUncompressedReverseWeights(edge.packed_geometry_id); + const auto forward_datasource_vector = facade->GetUncompressedForwardDatasources(edge.packed_geometry_id); + const auto reverse_datasource_vector = facade->GetUncompressedReverseDatasources(edge.packed_geometry_id); + const auto forward_weight = forward_weight_vector[edge.fwd_segment_position]; + const auto reverse_weight = reverse_weight_vector[reverse_weight_vector.size() - edge.fwd_segment_position - 1]; + const auto forward_datasource = forward_datasource_vector[edge.fwd_segment_position]; + const auto reverse_datasource = reverse_datasource_vector[reverse_datasource_vector.size() - edge.fwd_segment_position - 1]; - std::uint8_t forward_datasource = 0; - std::uint8_t reverse_datasource = 0; - forward_weight_vector.clear(); - forward_weight_vector = - facade->GetUncompressedForwardWeights(edge.packed_geometry_id); - forward_weight = forward_weight_vector[edge.fwd_segment_position]; - - forward_datasource_vector.clear(); - forward_datasource_vector = - facade->GetUncompressedForwardDatasources(edge.packed_geometry_id); - forward_datasource = forward_datasource_vector[edge.fwd_segment_position]; - - reverse_weight_vector.clear(); - reverse_weight_vector = - facade->GetUncompressedReverseWeights(edge.packed_geometry_id); + use_line_value(reverse_weight); + use_line_value(forward_weight); std::string name = facade->GetNameForID(edge.name_id); - - forward_weight_vector = facade->GetUncompressedForwardWeights(edge.packed_geometry_id); - forward_weight = forward_weight_vector[edge.fwd_segment_position]; - - forward_datasource_vector = facade->GetUncompressedForwardDatasources(edge.packed_geometry_id); - forward_datasource = forward_datasource_vector[edge.fwd_segment_position]; - - reverse_weight_vector = facade->GetUncompressedReverseWeights(edge.packed_geometry_id); - - reverse_weight = reverse_weight_vector[reverse_weight_vector.size() - - edge.fwd_segment_position - 1]; - - reverse_datasource_vector = facade->GetUncompressedReverseDatasources(edge.packed_geometry_id); - reverse_datasource = - reverse_datasource_vector[reverse_datasource_vector.size() - - edge.fwd_segment_position - 1]; - - // Keep track of the highest datasource seen so that we don't write unnecessary - // data to the layer attribute values - max_datasource_id = std::max(max_datasource_id, forward_datasource); - max_datasource_id = std::max(max_datasource_id, reverse_datasource); + const auto name_offset = [&name, &names, &name_offsets]() { + auto iter = name_offsets.find(name); + if (iter == name_offsets.end()) + { + auto offset = names.size() - 1; + name_offsets[name] = offset; + return offset; + } + return iter->second; + }(); + names.push_back(std::move(name)); const auto encode_tile_line = [&line_layer_writer, &edge, @@ -735,7 +688,7 @@ Status TilePlugin::HandleRequest(const std::shared_ptrGetUncompressedReverseDatasources(edge.packed_geometry_id); - reverse_datasource = - reverse_datasource_vector[reverse_datasource_vector.size() - - edge.fwd_segment_position - 1]; } }