| 1623 | } |
| 1624 | |
| 1625 | RouterResultCode IndexRouter::RedressRoute(vector<Segment> const & segments, base::Cancellable const & cancellable, |
| 1626 | IndexGraphStarter & starter, Route & route) |
| 1627 | { |
| 1628 | CHECK(!segments.empty(), ()); |
| 1629 | IndexGraphStarter::CheckValidRoute(segments); |
| 1630 | |
| 1631 | size_t const segsCount = segments.size(); |
| 1632 | vector<geometry::PointWithAltitude> junctions; |
| 1633 | junctions.reserve(segsCount + 1); |
| 1634 | |
| 1635 | for (size_t i = 0; i <= segsCount; ++i) |
| 1636 | junctions.emplace_back(starter.GetRouteJunction(segments, i).ToPointWithAltitude()); |
| 1637 | |
| 1638 | IndexRoadGraph roadGraph(starter, segments, junctions, m_dataSource); |
| 1639 | starter.GetGraph().SetMode(WorldGraphMode::NoLeaps); |
| 1640 | |
| 1641 | vector<double> times; |
| 1642 | times.reserve(segments.size()); |
| 1643 | |
| 1644 | // Time at first route point - weight of first segment. |
| 1645 | double time = starter.CalculateETAWithoutPenalty(segments.front()); |
| 1646 | times.emplace_back(time); |
| 1647 | |
| 1648 | for (size_t i = 1; i < segments.size(); ++i) |
| 1649 | { |
| 1650 | time += starter.CalculateETA(segments[i - 1], segments[i]); |
| 1651 | times.emplace_back(time); |
| 1652 | } |
| 1653 | |
| 1654 | m_directionsEngine->SetVehicleType(m_vehicleType); |
| 1655 | ReconstructRoute(*m_directionsEngine, roadGraph, cancellable, junctions, times, route); |
| 1656 | |
| 1657 | if (cancellable.IsCancelled()) |
| 1658 | return RouterResultCode::Cancelled; |
| 1659 | |
| 1660 | if (!route.IsValid()) |
| 1661 | { |
| 1662 | LOG(LERROR, ("RedressRoute failed, segmenst count =", segments.size())); |
| 1663 | return RouterResultCode::RouteNotFoundRedressRouteError; |
| 1664 | } |
| 1665 | |
| 1666 | auto & worldGraph = starter.GetGraph(); |
| 1667 | |
| 1668 | /// @todo I suspect that we can avoid calculating segments inside ReconstructRoute |
| 1669 | /// and use original |segments| (IndexRoadGraph::GetRouteSegments). |
| 1670 | #ifdef DEBUG |
| 1671 | { |
| 1672 | auto const isPassThroughAllowed = [&worldGraph](Segment const & s) |
| 1673 | { return worldGraph.IsPassThroughAllowed(s.GetMwmId(), s.GetFeatureId()); }; |
| 1674 | |
| 1675 | auto const & rSegments = route.GetRouteSegments(); |
| 1676 | ASSERT_EQUAL(segsCount, rSegments.size(), ()); |
| 1677 | for (size_t i = 0; i < segsCount; ++i) |
| 1678 | { |
| 1679 | if (segments[i].IsRealSegment()) |
| 1680 | { |
| 1681 | ASSERT_EQUAL(segments[i], rSegments[i].GetSegment(), ()); |
| 1682 |
nothing calls this directly
no test coverage detected