diff --git a/routing/route.cpp b/routing/route.cpp index 9f2c750832..45ea02abe1 100644 --- a/routing/route.cpp +++ b/routing/route.cpp @@ -470,13 +470,13 @@ void Route::AppendRoute(Route const & route) // This implementation is valid for one subroute which is equal to the route. size_t Route::GetSubrouteCount() const { return IsValid() ? 1 : 0; } -void Route::GetSubrouteInfo(size_t segmentIdx, vector & info) const +void Route::GetSubrouteInfo(size_t segmentIdx, std::vector & segments) const { CHECK_LESS(segmentIdx, GetSubrouteCount(), ()); CHECK(IsValid(), ()); - info.clear(); + segments.clear(); - vector const & points = m_poly.GetPolyline().GetPoints(); + auto const & points = m_poly.GetPolyline().GetPoints(); size_t const polySz = m_poly.GetPolyline().GetSize(); CHECK(!m_turns.empty(), ()); @@ -503,7 +503,8 @@ void Route::GetSubrouteInfo(size_t segmentIdx, vector & info size_t timeIdx = (m_times[0].first ? 1 : 0); double distFromBeginningMeters = 0.0; double distFromBeginningMerc = 0.0; - info.reserve(polySz - 1); + segments.reserve(polySz - 1); + for (size_t i = 1; i < points.size(); ++i) { TurnItem turn; @@ -520,15 +521,20 @@ void Route::GetSubrouteInfo(size_t segmentIdx, vector & info distFromBeginningMeters += MercatorBounds::DistanceOnEarth(points[i - 1], points[i]); distFromBeginningMerc += points[i - 1].Length(points[i]); - info.emplace_back( - Segment(), turn, - Junction(points[i], m_altitudes.empty() ? feature::kInvalidAltitude : m_altitudes[i]), - string(), distFromBeginningMeters, - distFromBeginningMerc, m_times[timeIdx - 1].second, - m_traffic.empty() ? SpeedGroup::Unknown : m_traffic[i - 1]); + segments.emplace_back(Segment(), turn, GetJunction(i), string(), distFromBeginningMeters, + distFromBeginningMerc, m_times[timeIdx - 1].second, + m_traffic.empty() ? SpeedGroup::Unknown : m_traffic[i - 1]); } } +void Route::GetSubrouteAttrs(size_t segmentIdx, SubrouteAttrs & attrs) const +{ + CHECK_LESS(segmentIdx, GetSubrouteCount(), ()); + CHECK(IsValid(), ()); + + attrs = SubrouteAttrs(GetJunction(0), GetJunction(m_poly.GetPolyline().GetSize() - 1)); +} + Route::SubrouteSettings const Route::GetSubrouteSettings(size_t segmentIdx) const { CHECK_LESS(segmentIdx, GetSubrouteCount(), ()); @@ -541,6 +547,18 @@ void Route::SetSubrouteUid(size_t segmentIdx, SubrouteUid subrouteUid) m_subrouteUid = subrouteUid; } +Junction Route::GetJunction(size_t pointIdx) const +{ + CHECK(IsValid(), ()); + CHECK_LESS(pointIdx, m_poly.GetPolyline().GetSize(), ()); + if (!m_altitudes.empty()) + CHECK_EQUAL(m_altitudes.size(), m_poly.GetPolyline().GetSize(), ()); + + auto const & points = m_poly.GetPolyline().GetPoints(); + return Junction(points[pointIdx], + m_altitudes.empty() ? feature::kInvalidAltitude : m_altitudes[pointIdx]); +} + string DebugPrint(Route const & r) { return DebugPrint(r.m_poly.GetPolyline()); diff --git a/routing/route.hpp b/routing/route.hpp index edc7b36c31..82745051d9 100644 --- a/routing/route.hpp +++ b/routing/route.hpp @@ -19,6 +19,7 @@ #include #include +#include namespace location { @@ -74,6 +75,22 @@ public: traffic::SpeedGroup const m_traffic = traffic::SpeedGroup::Unknown; }; + class SubrouteAttrs final + { + public: + SubrouteAttrs(Junction const & start, Junction const & finish) + : m_start(start), m_finish(finish) + { + } + + Junction const & GetStart() const { return m_start; } + Junction const & GetFinish() const { return m_finish; } + + private: + Junction m_start; + Junction m_finish; + }; + /// \brief For every subroute some attributes are kept the following stucture. struct SubrouteSettings final { @@ -203,7 +220,9 @@ public: /// intermediate points. /// Note. SegmentInfo::m_segment is filled with default Segment instance. /// Note. SegmentInfo::m_streetName is filled with an empty string. - void GetSubrouteInfo(size_t segmentIdx, vector & info) const; + void GetSubrouteInfo(size_t segmentIdx, std::vector & segments) const; + + void GetSubrouteAttrs(size_t segmentIdx, SubrouteAttrs & info) const; /// \returns Subroute settings by |segmentIdx|. // @TODO(bykoianko) This method should return SubrouteSettings by reference. Now it returns by value @@ -225,6 +244,8 @@ private: TStreets::const_iterator GetCurrentStreetNameIterAfter(FollowedPolyline::Iter iter) const; void AppendTraffic(Route const & route); + Junction GetJunction(size_t pointIdx) const; + string m_router; RoutingSettings m_routingSettings; string m_name; @@ -245,5 +266,4 @@ private: // Subroute SubrouteUid m_subrouteUid = kInvalidSubrouteId; }; - } // namespace routing