diff --git a/Algorithms/PolylineCompressor.cpp b/Algorithms/PolylineCompressor.cpp index cc8ec9f3f..6faac02e5 100644 --- a/Algorithms/PolylineCompressor.cpp +++ b/Algorithms/PolylineCompressor.cpp @@ -28,6 +28,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "PolylineCompressor.h" #include "../Util/StringUtil.h" +//TODO: return vector of start indices for each leg + void PolylineCompressor::encodeVectorSignedNumber(std::vector &numbers, std::string &output) const { diff --git a/Algorithms/StronglyConnectedComponents.h b/Algorithms/StronglyConnectedComponents.h index 1d4f3b953..6f7e3aa3e 100644 --- a/Algorithms/StronglyConnectedComponents.h +++ b/Algorithms/StronglyConnectedComponents.h @@ -339,14 +339,17 @@ class TarjanSCC << " many components, marking small components"; // TODO/C++11: prime candidate for lambda function - unsigned size_one_counter = 0; - for (unsigned i = 0, end = component_size_vector.size(); i < end; ++i) - { - if (1 == component_size_vector[i]) - { - ++size_one_counter; - } - } + // unsigned size_one_counter = 0; + // for (unsigned i = 0, end = component_size_vector.size(); i < end; ++i) + // { + // if (1 == component_size_vector[i]) + // { + // ++size_one_counter; + // } + // } + unsigned size_one_counter = std::count_if(component_size_vector.begin(), + component_size_vector.end(), + [] (unsigned value) { return 1 == value;}); SimpleLogger().Write() << "identified " << size_one_counter << " SCCs of size 1"; diff --git a/Descriptors/DescriptionFactory.cpp b/Descriptors/DescriptionFactory.cpp index 0d95ddeda..1ca122b24 100644 --- a/Descriptors/DescriptionFactory.cpp +++ b/Descriptors/DescriptionFactory.cpp @@ -29,8 +29,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. DescriptionFactory::DescriptionFactory() : entireLength(0) {} -DescriptionFactory::~DescriptionFactory() {} - void DescriptionFactory::SetStartSegment(const PhantomNode &source) { start_phantom = source; @@ -50,15 +48,14 @@ void DescriptionFactory::AppendSegment(const FixedPointCoordinate &coordinate, if ((1 == path_description.size()) && (path_description.back().location == coordinate)) { path_description.back().name_id = path_point.name_id; + return; } - else - { - path_description.emplace_back(coordinate, - path_point.name_id, - path_point.segment_duration, - 0, - path_point.turn_instruction); - } + + path_description.emplace_back(coordinate, + path_point.name_id, + path_point.segment_duration, + 0, + path_point.turn_instruction); } JSON::Value DescriptionFactory::AppendEncodedPolylineString(const bool return_encoded) diff --git a/Descriptors/DescriptionFactory.h b/Descriptors/DescriptionFactory.h index 6562d0c07..c5581c1c9 100644 --- a/Descriptors/DescriptionFactory.h +++ b/Descriptors/DescriptionFactory.h @@ -76,7 +76,6 @@ class DescriptionFactory // I know, declaring this public is considered bad. I'm lazy std::vector path_description; DescriptionFactory(); - virtual ~DescriptionFactory(); JSON::Value AppendUnencodedPolylineString() const; void AppendSegment(const FixedPointCoordinate &coordinate, const PathData &data); void BuildRouteSummary(const double distance, const unsigned time); @@ -176,14 +175,14 @@ class DescriptionFactory target_phantom.name_id = (path_description.end() - 2)->name_id; } } - if (std::numeric_limits::epsilon() > path_description[0].length) + if (std::numeric_limits::epsilon() > path_description.front().length) { if (path_description.size() > 2) { path_description.erase(path_description.begin()); - path_description[0].turn_instruction = TurnInstruction::HeadOn; - path_description[0].necessary = true; - start_phantom.name_id = path_description[0].name_id; + path_description.front().turn_instruction = TurnInstruction::HeadOn; + path_description.front().necessary = true; + start_phantom.name_id = path_description.front().name_id; } } diff --git a/Extractor/ExtractionContainers.cpp b/Extractor/ExtractionContainers.cpp index 1b321a89c..438b6d16e 100644 --- a/Extractor/ExtractionContainers.cpp +++ b/Extractor/ExtractionContainers.cpp @@ -217,14 +217,15 @@ void ExtractionContainers::PrepareData(const std::string &output_file_name, restrictions_out_stream.open(restrictions_file_name.c_str(), std::ios::binary); restrictions_out_stream.write((char *)&uuid, sizeof(UUID)); restrictions_out_stream.write((char *)&number_of_useable_restrictions, sizeof(unsigned)); - for (restrictions_iterator = restrictions_list.begin(); - restrictions_iterator != restrictions_list.end(); - ++restrictions_iterator) + // for (restrictions_iterator = restrictions_list.begin(); + // restrictions_iterator != restrictions_list.end(); + // ++restrictions_iterator) + for(const auto & restriction_container : restrictions_list) { - if (std::numeric_limits::max() != restrictions_iterator->restriction.fromNode && - std::numeric_limits::max() != restrictions_iterator->restriction.toNode) + if (std::numeric_limits::max() != restriction_container.restriction.fromNode && + std::numeric_limits::max() != restriction_container.restriction.toNode) { - restrictions_out_stream.write((char *)&(restrictions_iterator->restriction), + restrictions_out_stream.write((char *)&(restriction_container.restriction), sizeof(TurnRestriction)); } } diff --git a/Extractor/ExtractorCallbacks.cpp b/Extractor/ExtractorCallbacks.cpp index 8a019fb57..4acc19a4f 100644 --- a/Extractor/ExtractorCallbacks.cpp +++ b/Extractor/ExtractorCallbacks.cpp @@ -63,102 +63,104 @@ bool ExtractorCallbacks::ProcessRestriction(const InputRestrictionContainer &res /** warning: caller needs to take care of synchronization! */ void ExtractorCallbacks::ProcessWay(ExtractionWay &parsed_way) { - if ((0 < parsed_way.speed) || (0 < parsed_way.duration)) + if ((0 >= parsed_way.speed) && (0 >= parsed_way.duration)) { // Only true if the way is specified by the speed profile - if (std::numeric_limits::max() == parsed_way.id) - { - SimpleLogger().Write(logDEBUG) << "found bogus way with id: " << parsed_way.id - << " of size " << parsed_way.path.size(); - return; - } + return; + } - if (0 < parsed_way.duration) - { - // TODO: iterate all way segments and set duration corresponding to the length of each - // segment - parsed_way.speed = parsed_way.duration / (parsed_way.path.size() - 1); - } + if (std::numeric_limits::max() == parsed_way.id) + { + SimpleLogger().Write(logDEBUG) << "found bogus way with id: " << parsed_way.id + << " of size " << parsed_way.path.size(); + return; + } - if (std::numeric_limits::epsilon() >= std::abs(-1. - parsed_way.speed)) - { - SimpleLogger().Write(logDEBUG) << "found way with bogus speed, id: " << parsed_way.id; - return; - } + if (0 < parsed_way.duration) + { + // TODO: iterate all way segments and set duration corresponding to the length of each + // segment + parsed_way.speed = parsed_way.duration / (parsed_way.path.size() - 1); + } - // Get the unique identifier for the street name - const auto &string_map_iterator = string_map.find(parsed_way.name); - if (string_map.end() == string_map_iterator) - { - parsed_way.nameID = external_memory.name_list.size(); - external_memory.name_list.push_back(parsed_way.name); - string_map.insert(std::make_pair(parsed_way.name, parsed_way.nameID)); - } - else - { - parsed_way.nameID = string_map_iterator->second; - } + if (std::numeric_limits::epsilon() >= std::abs(-1. - parsed_way.speed)) + { + SimpleLogger().Write(logDEBUG) << "found way with bogus speed, id: " << parsed_way.id; + return; + } - if (ExtractionWay::opposite == parsed_way.direction) + // Get the unique identifier for the street name + const auto &string_map_iterator = string_map.find(parsed_way.name); + if (string_map.end() == string_map_iterator) + { + parsed_way.nameID = external_memory.name_list.size(); + external_memory.name_list.push_back(parsed_way.name); + string_map.insert(std::make_pair(parsed_way.name, parsed_way.nameID)); + } + else + { + parsed_way.nameID = string_map_iterator->second; + } + + if (ExtractionWay::opposite == parsed_way.direction) + { + std::reverse(parsed_way.path.begin(), parsed_way.path.end()); + parsed_way.direction = ExtractionWay::oneway; + } + + const bool split_bidirectional_edge = + (parsed_way.backward_speed > 0) && (parsed_way.speed != parsed_way.backward_speed); + + for (unsigned n = 0; n < parsed_way.path.size() - 1; ++n) + { + external_memory.all_edges_list.push_back(InternalExtractorEdge( + parsed_way.path[n], + parsed_way.path[n + 1], + parsed_way.type, + (split_bidirectional_edge ? ExtractionWay::oneway : parsed_way.direction), + parsed_way.speed, + parsed_way.nameID, + parsed_way.roundabout, + parsed_way.ignoreInGrid, + (0 < parsed_way.duration), + parsed_way.isAccessRestricted, + false, + split_bidirectional_edge)); + external_memory.used_node_id_list.push_back(parsed_way.path[n]); + } + external_memory.used_node_id_list.push_back(parsed_way.path.back()); + + // The following information is needed to identify start and end segments of restrictions + external_memory.way_start_end_id_list.push_back( + WayIDStartAndEndEdge(parsed_way.id, + parsed_way.path[0], + parsed_way.path[1], + parsed_way.path[parsed_way.path.size() - 2], + parsed_way.path.back())); + + if (split_bidirectional_edge) + { // Only true if the way should be split + std::reverse(parsed_way.path.begin(), parsed_way.path.end()); + for (std::vector::size_type n = 0; n < parsed_way.path.size() - 1; ++n) { - std::reverse(parsed_way.path.begin(), parsed_way.path.end()); - parsed_way.direction = ExtractionWay::oneway; + external_memory.all_edges_list.push_back( + InternalExtractorEdge(parsed_way.path[n], + parsed_way.path[n + 1], + parsed_way.type, + ExtractionWay::oneway, + parsed_way.backward_speed, + parsed_way.nameID, + parsed_way.roundabout, + parsed_way.ignoreInGrid, + (0 < parsed_way.duration), + parsed_way.isAccessRestricted, + (ExtractionWay::oneway == parsed_way.direction), + split_bidirectional_edge)); } - - const bool split_bidirectional_edge = - (parsed_way.backward_speed > 0) && (parsed_way.speed != parsed_way.backward_speed); - - for (unsigned n = 0; n < parsed_way.path.size() - 1; ++n) - { - external_memory.all_edges_list.push_back(InternalExtractorEdge( - parsed_way.path[n], - parsed_way.path[n + 1], - parsed_way.type, - (split_bidirectional_edge ? ExtractionWay::oneway : parsed_way.direction), - parsed_way.speed, - parsed_way.nameID, - parsed_way.roundabout, - parsed_way.ignoreInGrid, - (0 < parsed_way.duration), - parsed_way.isAccessRestricted, - false, - split_bidirectional_edge)); - external_memory.used_node_id_list.push_back(parsed_way.path[n]); - } - external_memory.used_node_id_list.push_back(parsed_way.path.back()); - - // The following information is needed to identify start and end segments of restrictions external_memory.way_start_end_id_list.push_back( WayIDStartAndEndEdge(parsed_way.id, parsed_way.path[0], parsed_way.path[1], parsed_way.path[parsed_way.path.size() - 2], parsed_way.path.back())); - - if (split_bidirectional_edge) - { // Only true if the way should be split - std::reverse(parsed_way.path.begin(), parsed_way.path.end()); - for (std::vector::size_type n = 0; n < parsed_way.path.size() - 1; ++n) - { - external_memory.all_edges_list.push_back( - InternalExtractorEdge(parsed_way.path[n], - parsed_way.path[n + 1], - parsed_way.type, - ExtractionWay::oneway, - parsed_way.backward_speed, - parsed_way.nameID, - parsed_way.roundabout, - parsed_way.ignoreInGrid, - (0 < parsed_way.duration), - parsed_way.isAccessRestricted, - (ExtractionWay::oneway == parsed_way.direction), - split_bidirectional_edge)); - } - external_memory.way_start_end_id_list.push_back( - WayIDStartAndEndEdge(parsed_way.id, - parsed_way.path[0], - parsed_way.path[1], - parsed_way.path[parsed_way.path.size() - 2], - parsed_way.path.back())); - } } } diff --git a/Plugins/LocatePlugin.h b/Plugins/LocatePlugin.h index a5e89c684..518259d70 100644 --- a/Plugins/LocatePlugin.h +++ b/Plugins/LocatePlugin.h @@ -44,13 +44,8 @@ template class LocatePlugin : public BasePlugin void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply) { // check number of parameters - if (route_parameters.coordinates.empty()) - { - reply = http::Reply::StockReply(http::Reply::badRequest); - return; - } - // check if queried location is sane - if (!route_parameters.coordinates.front().isValid()) + if (route_parameters.coordinates.empty() || + !route_parameters.coordinates.front().isValid()) { reply = http::Reply::StockReply(http::Reply::badRequest); return; diff --git a/Plugins/NearestPlugin.h b/Plugins/NearestPlugin.h index 8dafc2208..0b556671c 100644 --- a/Plugins/NearestPlugin.h +++ b/Plugins/NearestPlugin.h @@ -51,13 +51,8 @@ template class NearestPlugin : public BasePlugin void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply) { // check number of parameters - if (route_parameters.coordinates.empty()) - { - reply = http::Reply::StockReply(http::Reply::badRequest); - return; - } - // check if queried location is sane - if (!route_parameters.coordinates.front().isValid()) + if (route_parameters.coordinates.empty() || + !route_parameters.coordinates.front().isValid()) { reply = http::Reply::StockReply(http::Reply::badRequest); return; diff --git a/Plugins/ViaRoutePlugin.h b/Plugins/ViaRoutePlugin.h index 89bbb2e44..8f0c2c1fe 100644 --- a/Plugins/ViaRoutePlugin.h +++ b/Plugins/ViaRoutePlugin.h @@ -1,188 +1,182 @@ -/* - -Copyright (c) 2013, Project OSRM, Dennis Luxen, others -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef VIA_ROUTE_PLUGIN_H -#define VIA_ROUTE_PLUGIN_H - -#include "BasePlugin.h" - -#include "../Algorithms/ObjectToBase64.h" - -#include "../DataStructures/QueryEdge.h" -#include "../DataStructures/SearchEngine.h" -#include "../Descriptors/BaseDescriptor.h" -#include "../Descriptors/GPXDescriptor.h" -#include "../Descriptors/JSONDescriptor.h" -#include "../Util/SimpleLogger.h" -#include "../Util/StringUtil.h" -#include "../Util/TimingUtil.h" - -#include - -#include -#include -#include -#include -#include - -template class ViaRoutePlugin : public BasePlugin -{ - private: - std::unordered_map descriptor_table; - std::shared_ptr> search_engine_ptr; - - public: - explicit ViaRoutePlugin(DataFacadeT *facade) : descriptor_string("viaroute"), facade(facade) - { - search_engine_ptr = std::make_shared>(facade); - - descriptor_table.emplace("json", 0); - descriptor_table.emplace("gpx", 1); - // descriptor_table.emplace("geojson", 2); - } - - virtual ~ViaRoutePlugin() {} - - const std::string GetDescriptor() const { return descriptor_string; } - - void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply) - { - // check number of parameters - if (2 > route_parameters.coordinates.size()) - { - reply = http::Reply::StockReply(http::Reply::badRequest); - return; - } - - RawRouteData raw_route; - raw_route.check_sum = facade->GetCheckSum(); - - if (std::any_of(begin(route_parameters.coordinates), - end(route_parameters.coordinates), - [&](FixedPointCoordinate coordinate) - { return !coordinate.isValid(); })) - { - reply = http::Reply::StockReply(http::Reply::badRequest); - return; - } - - for (const FixedPointCoordinate &coordinate : route_parameters.coordinates) - { - raw_route.raw_via_node_coordinates.emplace_back(coordinate); - } - - std::vector phantom_node_vector(raw_route.raw_via_node_coordinates.size()); - const bool checksum_OK = (route_parameters.check_sum == raw_route.check_sum); - - for (unsigned i = 0; i < raw_route.raw_via_node_coordinates.size(); ++i) - { - if (checksum_OK && i < route_parameters.hints.size() && - !route_parameters.hints[i].empty()) - { - DecodeObjectFromBase64(route_parameters.hints[i], phantom_node_vector[i]); - if (phantom_node_vector[i].isValid(facade->GetNumberOfNodes())) - { - continue; - } - } - facade->FindPhantomNodeForCoordinate(raw_route.raw_via_node_coordinates[i], - phantom_node_vector[i], - route_parameters.zoom_level); - } - - PhantomNodes current_phantom_node_pair; - for (unsigned i = 0; i < phantom_node_vector.size() - 1; ++i) - { - current_phantom_node_pair.source_phantom = phantom_node_vector[i]; - current_phantom_node_pair.target_phantom = phantom_node_vector[i + 1]; - raw_route.segment_end_coordinates.emplace_back(current_phantom_node_pair); - } - - const bool is_alternate_requested = route_parameters.alternate_route; - const bool is_only_one_segment = (1 == raw_route.segment_end_coordinates.size()); - TIMER_START(routing); - if (is_alternate_requested && is_only_one_segment) - { - search_engine_ptr->alternative_path(raw_route.segment_end_coordinates.front(), - raw_route); - } - else - { - search_engine_ptr->shortest_path(raw_route.segment_end_coordinates, raw_route); - } - TIMER_STOP(routing); - SimpleLogger().Write() << "routing took " << TIMER_MSEC(routing) << "ms"; - - if (INVALID_EDGE_WEIGHT == raw_route.shortest_path_length) - { - SimpleLogger().Write(logDEBUG) << "Error occurred, single path not found"; - } - reply.status = http::Reply::ok; - - DescriptorConfig descriptor_config; - - auto iter = descriptor_table.find(route_parameters.output_format); - unsigned descriptor_type = (iter != descriptor_table.end() ? iter->second : 0); - - descriptor_config.zoom_level = route_parameters.zoom_level; - descriptor_config.instructions = route_parameters.print_instructions; - descriptor_config.geometry = route_parameters.geometry; - descriptor_config.encode_geometry = route_parameters.compression; - - std::shared_ptr> descriptor; - switch (descriptor_type) - { - // case 0: - // descriptor = std::make_shared>(); - // break; - case 1: - descriptor = std::make_shared>(facade); - break; - // case 2: - // descriptor = std::make_shared>(); - // break; - default: - descriptor = std::make_shared>(facade); - break; - } - - PhantomNodes phantom_nodes; - phantom_nodes.source_phantom = raw_route.segment_end_coordinates.front().source_phantom; - phantom_nodes.target_phantom = raw_route.segment_end_coordinates.back().target_phantom; - descriptor->SetConfig(descriptor_config); - TIMER_START(descriptor); - descriptor->Run(raw_route, phantom_nodes, reply); - TIMER_STOP(descriptor); - SimpleLogger().Write() << "descriptor took " << TIMER_MSEC(descriptor) << "ms"; - } - - private: - std::string descriptor_string; - DataFacadeT *facade; -}; - -#endif // VIA_ROUTE_PLUGIN_H +/* + +Copyright (c) 2013, Project OSRM, Dennis Luxen, others +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef VIA_ROUTE_PLUGIN_H +#define VIA_ROUTE_PLUGIN_H + +#include "BasePlugin.h" + +#include "../Algorithms/ObjectToBase64.h" + +#include "../DataStructures/QueryEdge.h" +#include "../DataStructures/SearchEngine.h" +#include "../Descriptors/BaseDescriptor.h" +#include "../Descriptors/GPXDescriptor.h" +#include "../Descriptors/JSONDescriptor.h" +#include "../Util/SimpleLogger.h" +#include "../Util/StringUtil.h" +#include "../Util/TimingUtil.h" + +#include + +#include +#include +#include +#include +#include + +template class ViaRoutePlugin : public BasePlugin +{ + private: + std::unordered_map descriptor_table; + std::shared_ptr> search_engine_ptr; + + public: + explicit ViaRoutePlugin(DataFacadeT *facade) : descriptor_string("viaroute"), facade(facade) + { + search_engine_ptr = std::make_shared>(facade); + + descriptor_table.emplace("json", 0); + descriptor_table.emplace("gpx", 1); + // descriptor_table.emplace("geojson", 2); + } + + virtual ~ViaRoutePlugin() {} + + const std::string GetDescriptor() const { return descriptor_string; } + + void HandleRequest(const RouteParameters &route_parameters, http::Reply &reply) + { + // check number of parameters + if (2 > route_parameters.coordinates.size() || + std::any_of(begin(route_parameters.coordinates), + end(route_parameters.coordinates), + [&](FixedPointCoordinate coordinate) + { return !coordinate.isValid(); })) + { + reply = http::Reply::StockReply(http::Reply::badRequest); + return; + } + + RawRouteData raw_route; + raw_route.check_sum = facade->GetCheckSum(); + for (const FixedPointCoordinate &coordinate : route_parameters.coordinates) + { + raw_route.raw_via_node_coordinates.emplace_back(coordinate); + } + + std::vector phantom_node_vector(raw_route.raw_via_node_coordinates.size()); + const bool checksum_OK = (route_parameters.check_sum == raw_route.check_sum); + + for (unsigned i = 0; i < raw_route.raw_via_node_coordinates.size(); ++i) + { + if (checksum_OK && i < route_parameters.hints.size() && + !route_parameters.hints[i].empty()) + { + DecodeObjectFromBase64(route_parameters.hints[i], phantom_node_vector[i]); + if (phantom_node_vector[i].isValid(facade->GetNumberOfNodes())) + { + continue; + } + } + facade->FindPhantomNodeForCoordinate(raw_route.raw_via_node_coordinates[i], + phantom_node_vector[i], + route_parameters.zoom_level); + } + + PhantomNodes current_phantom_node_pair; + for (unsigned i = 0; i < phantom_node_vector.size() - 1; ++i) + { + current_phantom_node_pair.source_phantom = phantom_node_vector[i]; + current_phantom_node_pair.target_phantom = phantom_node_vector[i + 1]; + raw_route.segment_end_coordinates.emplace_back(current_phantom_node_pair); + } + + const bool is_alternate_requested = route_parameters.alternate_route; + const bool is_only_one_segment = (1 == raw_route.segment_end_coordinates.size()); + TIMER_START(routing); + if (is_alternate_requested && is_only_one_segment) + { + search_engine_ptr->alternative_path(raw_route.segment_end_coordinates.front(), + raw_route); + } + else + { + search_engine_ptr->shortest_path(raw_route.segment_end_coordinates, raw_route); + } + TIMER_STOP(routing); + SimpleLogger().Write() << "routing took " << TIMER_MSEC(routing) << "ms"; + + if (INVALID_EDGE_WEIGHT == raw_route.shortest_path_length) + { + SimpleLogger().Write(logDEBUG) << "Error occurred, single path not found"; + } + reply.status = http::Reply::ok; + + DescriptorConfig descriptor_config; + + auto iter = descriptor_table.find(route_parameters.output_format); + unsigned descriptor_type = (iter != descriptor_table.end() ? iter->second : 0); + + descriptor_config.zoom_level = route_parameters.zoom_level; + descriptor_config.instructions = route_parameters.print_instructions; + descriptor_config.geometry = route_parameters.geometry; + descriptor_config.encode_geometry = route_parameters.compression; + + std::shared_ptr> descriptor; + switch (descriptor_type) + { + // case 0: + // descriptor = std::make_shared>(); + // break; + case 1: + descriptor = std::make_shared>(facade); + break; + // case 2: + // descriptor = std::make_shared>(); + // break; + default: + descriptor = std::make_shared>(facade); + break; + } + + PhantomNodes phantom_nodes; + phantom_nodes.source_phantom = raw_route.segment_end_coordinates.front().source_phantom; + phantom_nodes.target_phantom = raw_route.segment_end_coordinates.back().target_phantom; + descriptor->SetConfig(descriptor_config); + TIMER_START(descriptor); + descriptor->Run(raw_route, phantom_nodes, reply); + TIMER_STOP(descriptor); + SimpleLogger().Write() << "descriptor took " << TIMER_MSEC(descriptor) << "ms"; + } + + private: + std::string descriptor_string; + DataFacadeT *facade; +}; + +#endif // VIA_ROUTE_PLUGIN_H diff --git a/RoutingAlgorithms/ShortestPathRouting.h b/RoutingAlgorithms/ShortestPathRouting.h index 819e39d89..f51d64235 100644 --- a/RoutingAlgorithms/ShortestPathRouting.h +++ b/RoutingAlgorithms/ShortestPathRouting.h @@ -51,14 +51,15 @@ template class ShortestPathRouting : public BasicRoutingInte void operator()(const std::vector &phantom_nodes_vector, RawRouteData &raw_route_data) const { - for (const PhantomNodes &phantom_node_pair : phantom_nodes_vector) + if(std::any_of(begin(phantom_nodes_vector), + end(phantom_nodes_vector), + [](PhantomNodes phantom_node_pair) + { return phantom_node_pair.AtLeastOnePhantomNodeIsInvalid(); })) { - if (phantom_node_pair.AtLeastOnePhantomNodeIsInvalid()) - { - BOOST_ASSERT(false); - return; - } + BOOST_ASSERT(false); + return; } + int distance1 = 0; int distance2 = 0; bool search_from_1st_node = true; diff --git a/Server/RequestParser.cpp b/Server/RequestParser.cpp index fd26608b6..b95c299b8 100644 --- a/Server/RequestParser.cpp +++ b/Server/RequestParser.cpp @@ -262,10 +262,10 @@ RequestParser::consume(Request &req, char input, http::CompressionType *compress return boost::indeterminate; } return false; - case expecting_newline_3: + default: // expecting_newline_3: return (input == '\n'); - default: - return false; + // default: + // return false; } } diff --git a/prepare.cpp b/prepare.cpp index f57d3e1de..267e22e5b 100644 --- a/prepare.cpp +++ b/prepare.cpp @@ -438,6 +438,7 @@ int main(int argc, char *argv[]) // every target needs to be valid BOOST_ASSERT(current_edge.target < max_used_node_id); +#ifndef NDEBUG if (current_edge.data.distance <= 0) { SimpleLogger().Write(logWARNING) @@ -450,6 +451,7 @@ int main(int argc, char *argv[]) << node_array.size() - 1; return 1; } +#endif hsgr_output_stream.write((char *)¤t_edge, sizeof(StaticGraph::EdgeArrayEntry)); ++number_of_used_edges;