#ifndef OSRM_ENGINE_ROUTING_ALGORITHM_HPP #define OSRM_ENGINE_ROUTING_ALGORITHM_HPP #include "engine/algorithm.hpp" #include "engine/internal_route_result.hpp" #include "engine/phantom_node.hpp" #include "engine/routing_algorithms/alternative_path.hpp" #include "engine/routing_algorithms/direct_shortest_path.hpp" #include "engine/routing_algorithms/many_to_many.hpp" #include "engine/routing_algorithms/map_matching.hpp" #include "engine/routing_algorithms/shortest_path.hpp" #include "engine/routing_algorithms/tile_turns.hpp" namespace osrm { namespace engine { class RoutingAlgorithmsInterface { public: virtual InternalRouteResult AlternativePathSearch(const PhantomNodes &phantom_node_pair) const = 0; virtual InternalRouteResult ShortestPathSearch(const std::vector &phantom_node_pair, const boost::optional continue_straight_at_waypoint) const = 0; virtual InternalRouteResult DirectShortestPathSearch(const PhantomNodes &phantom_node_pair) const = 0; virtual std::vector ManyToManySearch(const std::vector &phantom_nodes, const std::vector &source_indices, const std::vector &target_indices) const = 0; virtual routing_algorithms::SubMatchingList MapMatching(const routing_algorithms::CandidateLists &candidates_list, const std::vector &trace_coordinates, const std::vector &trace_timestamps, const std::vector> &trace_gps_precision) const = 0; virtual std::vector GetTileTurns(const std::vector &edges, const std::vector &sorted_edge_indexes) const = 0; virtual bool HasAlternativePathSearch() const = 0; virtual bool HasShortestPathSearch() const = 0; virtual bool HasDirectShortestPathSearch() const = 0; virtual bool HasMapMatching() const = 0; virtual bool HasManyToManySearch() const = 0; virtual bool HasGetTileTurns() const = 0; }; // Short-lived object passed to each plugin in request to wrap routing algorithms template class RoutingAlgorithms final : public RoutingAlgorithmsInterface { public: RoutingAlgorithms(SearchEngineData &heaps, const datafacade::ContiguousInternalMemoryDataFacade &facade) : heaps(heaps), facade(facade) { } virtual ~RoutingAlgorithms() = default; InternalRouteResult AlternativePathSearch(const PhantomNodes &phantom_node_pair) const final override; InternalRouteResult ShortestPathSearch( const std::vector &phantom_node_pair, const boost::optional continue_straight_at_waypoint) const final override; InternalRouteResult DirectShortestPathSearch(const PhantomNodes &phantom_nodes) const final override; std::vector ManyToManySearch(const std::vector &phantom_nodes, const std::vector &source_indices, const std::vector &target_indices) const final override; routing_algorithms::SubMatchingList MapMatching( const routing_algorithms::CandidateLists &candidates_list, const std::vector &trace_coordinates, const std::vector &trace_timestamps, const std::vector> &trace_gps_precision) const final override; std::vector GetTileTurns(const std::vector &edges, const std::vector &sorted_edge_indexes) const final override; bool HasAlternativePathSearch() const final override { return algorithm_trais::HasAlternativePathSearch::value; } bool HasShortestPathSearch() const final override { return algorithm_trais::HasShortestPathSearch::value; } bool HasDirectShortestPathSearch() const final override { return algorithm_trais::HasDirectShortestPathSearch::value; } bool HasMapMatching() const final override { return algorithm_trais::HasMapMatching::value; } bool HasManyToManySearch() const final override { return algorithm_trais::HasManyToManySearch::value; } bool HasGetTileTurns() const final override { return algorithm_trais::HasGetTileTurns::value; } private: SearchEngineData &heaps; // Owned by shared-ptr passed to the query const datafacade::ContiguousInternalMemoryDataFacade &facade; }; template InternalRouteResult RoutingAlgorithms::AlternativePathSearch(const PhantomNodes &phantom_node_pair) const { return routing_algorithms::alternativePathSearch(heaps, facade, phantom_node_pair); } template InternalRouteResult RoutingAlgorithms::ShortestPathSearch( const std::vector &phantom_node_pair, const boost::optional continue_straight_at_waypoint) const { return routing_algorithms::shortestPathSearch( heaps, facade, phantom_node_pair, continue_straight_at_waypoint); } template InternalRouteResult RoutingAlgorithms::DirectShortestPathSearch(const PhantomNodes &phantom_nodes) const { return routing_algorithms::directShortestPathSearch(heaps, facade, phantom_nodes); } template std::vector RoutingAlgorithms::ManyToManySearch( const std::vector &phantom_nodes, const std::vector &source_indices, const std::vector &target_indices) const { return routing_algorithms::manyToManySearch( heaps, facade, phantom_nodes, source_indices, target_indices); } template inline routing_algorithms::SubMatchingList RoutingAlgorithms::MapMatching( const routing_algorithms::CandidateLists &candidates_list, const std::vector &trace_coordinates, const std::vector &trace_timestamps, const std::vector> &trace_gps_precision) const { return routing_algorithms::mapMatching( heaps, facade, candidates_list, trace_coordinates, trace_timestamps, trace_gps_precision); } template inline std::vector RoutingAlgorithms::GetTileTurns( const std::vector &edges, const std::vector &sorted_edge_indexes) const { return routing_algorithms::getTileTurns(facade, edges, sorted_edge_indexes); } // MLD overrides for not implemented template <> InternalRouteResult inline RoutingAlgorithms::AlternativePathSearch( const PhantomNodes &) const { throw util::exception("AlternativePathSearch is not implemented"); } template <> inline InternalRouteResult RoutingAlgorithms::ShortestPathSearch(const std::vector &, const boost::optional) const { throw util::exception("ShortestPathSearch is not implemented"); } template <> inline std::vector RoutingAlgorithms::ManyToManySearch(const std::vector &, const std::vector &, const std::vector &) const { throw util::exception("ManyToManySearch is not implemented"); } template <> inline routing_algorithms::SubMatchingList RoutingAlgorithms::MapMatching(const routing_algorithms::CandidateLists &, const std::vector &, const std::vector &, const std::vector> &) const { throw util::exception("MapMatching is not implemented"); } template <> inline std::vector RoutingAlgorithms::GetTileTurns( const std::vector &, const std::vector &) const { throw util::exception("GetTileTurns is not implemented"); } } } #endif