#pragma once #include "routing/cross_mwm_graph.hpp" #include "routing/edge_estimator.hpp" #include "routing/geometry.hpp" #include "routing/index_graph.hpp" #include "routing/index_graph_loader.hpp" #include "routing/joint_segment.hpp" #include "routing/road_graph.hpp" #include "routing/route.hpp" #include "routing/segment.hpp" #include "routing/transit_info.hpp" #include "routing/world_graph.hpp" #include "routing_common/num_mwm_id.hpp" #include "geometry/point2d.hpp" #include #include namespace routing { class SingleVehicleWorldGraph final : public WorldGraph { public: SingleVehicleWorldGraph(std::unique_ptr crossMwmGraph, std::unique_ptr loader, std::shared_ptr estimator); // WorldGraph overrides: ~SingleVehicleWorldGraph() override = default; void GetEdgeList(Segment const & segment, bool isOutgoing, std::vector & edges) override; void GetEdgeList(Segment const & parent, bool isOutgoing, std::vector & jointEdges, std::vector & parentWeights) override; bool CheckLength(RouteWeight const &, double) const override { return true; } Junction const & GetJunction(Segment const & segment, bool front) override; m2::PointD const & GetPoint(Segment const & segment, bool front) override; bool IsOneWay(NumMwmId mwmId, uint32_t featureId) override; bool IsPassThroughAllowed(NumMwmId mwmId, uint32_t featureId) override; void ClearCachedGraphs() override { m_loader->Clear(); } void SetMode(WorldGraphMode mode) override { m_mode = mode; } WorldGraphMode GetMode() const override { return m_mode; } void GetOutgoingEdgesList(Segment const & segment, std::vector & edges) override; void GetIngoingEdgesList(Segment const & segment, std::vector & edges) override; RouteWeight HeuristicCostEstimate(Segment const & from, Segment const & to) override; RouteWeight HeuristicCostEstimate(m2::PointD const & from, m2::PointD const & to) override; RouteWeight HeuristicCostEstimate(Segment const & from, m2::PointD const & to) override; RouteWeight CalcSegmentWeight(Segment const & segment) override; RouteWeight CalcLeapWeight(m2::PointD const & from, m2::PointD const & to) const override; RouteWeight CalcOffroadWeight(m2::PointD const & from, m2::PointD const & to) const override; double CalcSegmentETA(Segment const & segment) override; std::vector const & GetTransitions(NumMwmId numMwmId, bool isEnter) override; /// \returns true if feature, associated with segment satisfies users conditions. bool IsRoutingOptionsGood(Segment const & segment) override; RoutingOptions GetRoutingOptions(Segment const & segment) override; void SetRoutingOptions(RoutingOptions routingOptions) override { m_avoidRoutingOptions = routingOptions; } std::unique_ptr GetTransitInfo(Segment const & segment) override; std::vector GetSpeedCamInfo(Segment const & segment) override; // This method should be used for tests only IndexGraph & GetIndexGraphForTests(NumMwmId numMwmId) { return m_loader->GetIndexGraph(numMwmId); } IndexGraph & GetIndexGraph(NumMwmId numMwmId) override { return m_loader->GetIndexGraph(numMwmId); } private: // Retrieves the same |jointEdges|, but into others mwms. // If they are cross mwm edges, of course. void CheckAndProcessTransitFeatures(Segment const & parent, std::vector & jointEdges, std::vector & parentWeights, bool isOutgoing); // WorldGraph overrides: void GetTwinsInner(Segment const & s, bool isOutgoing, std::vector & twins) override; RoadGeometry const & GetRoadGeometry(NumMwmId mwmId, uint32_t featureId); std::unique_ptr m_crossMwmGraph; std::unique_ptr m_loader; std::shared_ptr m_estimator; RoutingOptions m_avoidRoutingOptions = RoutingOptions(); WorldGraphMode m_mode = WorldGraphMode::NoLeaps; }; } // namespace routing