| 435 | } |
| 436 | |
| 437 | RouteWeight IndexGraph::GetPenalties(EdgeEstimator::Purpose purpose, Segment const & u, Segment const & v, |
| 438 | optional<RouteWeight> const & prevWeight) const |
| 439 | { |
| 440 | auto const & fromPenaltyData = GetRoadPenaltyData(u); |
| 441 | auto const & toPenaltyData = GetRoadPenaltyData(v); |
| 442 | // Route crosses border of pass-through/non-pass-through area if |u| and |v| have different |
| 443 | // pass through restrictions. |
| 444 | int8_t const passThroughPenalty = fromPenaltyData.m_passThroughAllowed == toPenaltyData.m_passThroughAllowed ? 0 : 1; |
| 445 | |
| 446 | int8_t accessPenalty = 0; |
| 447 | int8_t accessConditionalPenalties = 0; |
| 448 | |
| 449 | if (u.GetFeatureId() != v.GetFeatureId()) |
| 450 | { |
| 451 | // We do not distinguish between RoadAccess::Type::Private and RoadAccess::Type::Destination for |
| 452 | // now. |
| 453 | auto const [fromAccess, fromConfidence] = prevWeight ? m_roadAccess.GetAccess(u.GetFeatureId(), *prevWeight) |
| 454 | : m_roadAccess.GetAccessWithoutConditional(u.GetFeatureId()); |
| 455 | |
| 456 | auto const [toAccess, toConfidence] = prevWeight ? m_roadAccess.GetAccess(v.GetFeatureId(), *prevWeight) |
| 457 | : m_roadAccess.GetAccessWithoutConditional(v.GetFeatureId()); |
| 458 | |
| 459 | if (fromConfidence == RoadAccess::Confidence::Sure && toConfidence == RoadAccess::Confidence::Sure) |
| 460 | { |
| 461 | bool const fromAccessAllowed = fromAccess == RoadAccess::Type::Yes; |
| 462 | bool const toAccessAllowed = toAccess == RoadAccess::Type::Yes; |
| 463 | // Route crosses border of access=yes/access={private, destination} area if |u| and |v| have |
| 464 | // different access restrictions. |
| 465 | accessPenalty = fromAccessAllowed == toAccessAllowed ? 0 : 1; |
| 466 | } |
| 467 | else if (toConfidence == RoadAccess::Confidence::Maybe) |
| 468 | { |
| 469 | accessConditionalPenalties = 1; |
| 470 | } |
| 471 | } |
| 472 | |
| 473 | // RoadPoint between u and v is front of u. |
| 474 | auto const rp = u.GetRoadPoint(true /* front */); |
| 475 | auto const [rpAccessType, rpConfidence] = |
| 476 | prevWeight ? m_roadAccess.GetAccess(rp, *prevWeight) : m_roadAccess.GetAccessWithoutConditional(rp); |
| 477 | // Get penalty from new penalty system if MWM supports it |
| 478 | auto penalty = m_roadPenalty.GetPenalty(rp); |
| 479 | uint16_t penaltyTime = 0; |
| 480 | if (penalty) |
| 481 | penaltyTime = penalty->m_timeSeconds; |
| 482 | |
| 483 | switch (rpConfidence) |
| 484 | { |
| 485 | case RoadAccess::Confidence::Sure: |
| 486 | { |
| 487 | if (rpAccessType != RoadAccess::Type::Yes) |
| 488 | accessPenalty = 1; |
| 489 | break; |
| 490 | } |
| 491 | case RoadAccess::Confidence::Maybe: |
| 492 | { |
| 493 | accessConditionalPenalties = 1; |
| 494 | break; |
nothing calls this directly
no test coverage detected