From 6358a8f3c876b3a43c1c7189dd3890eef5895ddf Mon Sep 17 00:00:00 2001 From: Lev Dragunov Date: Thu, 21 Jan 2016 13:43:45 +0300 Subject: [PATCH] Review fixes. --- .../osrm-backend/plugins/MapsMePlugin.hpp | 104 +++++++++++------- 1 file changed, 62 insertions(+), 42 deletions(-) diff --git a/3party/osrm/osrm-backend/plugins/MapsMePlugin.hpp b/3party/osrm/osrm-backend/plugins/MapsMePlugin.hpp index 5bfacc713f..4cb6e5d05b 100644 --- a/3party/osrm/osrm-backend/plugins/MapsMePlugin.hpp +++ b/3party/osrm/osrm-backend/plugins/MapsMePlugin.hpp @@ -29,7 +29,61 @@ #include #include -double constexpr kMaxDistanceToFindMeters = 1000.0; +using TMapRepr = pair; + +class UsedMwmChecker +{ +public: + static size_t constexpr kInvalidIndex = numeric_limits::max(); + + UsedMwmChecker() : m_lastUsedMwm(kInvalidIndex) {} + + void AddPoint(size_t mwmIndex, m2::PointD const & pt) + { + if (mwmIndex == kInvalidIndex) + return; + if (mwmIndex != m_lastUsedMwm) + { + CommitUsedPoints(); + m_lastUsedMwm = mwmIndex; + } + m_lastMwmPoints.push_back(pt); + } + + vector const & GetUsedMwms() + { + // Get point from the last mwm. + CommitUsedPoints(); + + std::sort(m_usedMwms.begin(), m_usedMwms.end(), [] + (TMapRepr const & a, TMapRepr const & b) + { + return a.first < b.first; + }); + auto const it = std::unique(m_usedMwms.begin(), m_usedMwms.end(), [] + (TMapRepr const & a, TMapRepr const & b) + { + return a.first == b.first; + }); + m_usedMwms.erase(it, m_usedMwms.end()); + return m_usedMwms; + } + +private: + void CommitUsedPoints() + { + if (!m_lastMwmPoints.empty() && m_lastUsedMwm != kInvalidIndex) + { + size_t delta = m_lastMwmPoints.size() / 2; + m_usedMwms.emplace_back(m_lastUsedMwm, m_lastMwmPoints[delta]); + } + m_lastMwmPoints.clear(); + } + + vector m_usedMwms; + size_t m_lastUsedMwm; + vector m_lastMwmPoints; +}; template class MapsMePlugin final : public BasePlugin { @@ -107,6 +161,8 @@ public: int HandleRequest(const RouteParameters &route_parameters, osrm::json::Object &reply) override final { + double constexpr kMaxDistanceToFindMeters = 1000.0; + //We process only two points case if (route_parameters.coordinates.size() != 2) return 400; @@ -123,7 +179,8 @@ public: std::vector> phantom_node_vector; //FixedPointCoordinate &coordinate = route_parameters.coordinates[i]; if (m_facade->IncrementalFindPhantomNodeForCoordinateWithMaxDistance(route_parameters.coordinates[i], - phantom_node_vector, kMaxDistanceToFindMeters, 0, 2)) + phantom_node_vector, kMaxDistanceToFindMeters, + 0 /*min_number_of_phantom_nodes*/, 2 /*max_number_of_phantom_nodes*/)) { BOOST_ASSERT(!phantom_node_vector.empty()); // Don't know why, but distance may be higher that maxDistance. @@ -194,9 +251,7 @@ public: return 400; } // Get mwm names - vector> usedMwms; - size_t lastUsedMwm = numeric_limits::max(); - vector mwmPoints; + UsedMwmChecker usedChecker; for (auto i : osrm::irange(0, raw_route.unpacked_path_segments.size())) { @@ -211,47 +266,12 @@ public: m2::PointD pt = MercatorBounds::FromLatLon(seg.lat1, seg.lon1); GetByPoint doGet(m_regions, pt); ForEachCountry(pt, doGet); - - auto const & index = doGet.m_res; - if (index == std::numeric_limits::max()) - continue; - - if (index != lastUsedMwm) - { - if (!mwmPoints.empty()) - { - // Get the middlest point (max far from borders). - size_t delta = std::distance(mwmPoints.begin(), mwmPoints.end()) / 2; - usedMwms.emplace_back(lastUsedMwm, mwmPoints[delta]); - mwmPoints.clear(); - } - lastUsedMwm = index; - } - mwmPoints.push_back(pt); + usedChecker.AddPoint(doGet.m_res, pt); } } - // Get point from last mwm. - if (!mwmPoints.empty()) - { - size_t delta = std::distance(mwmPoints.begin(), mwmPoints.end()) / 2; - usedMwms.emplace_back(lastUsedMwm, mwmPoints[delta]); - mwmPoints.clear(); - } - - std::sort(usedMwms.begin(), usedMwms.end(), [] - (pair const & a, pair const & b) - { - return a.first < b.first; - }); - auto const it = std::unique(usedMwms.begin(), usedMwms.end(), [] - (pair const & a, pair const & b) - { - return a.first == b.first; - }); - usedMwms.erase(it, usedMwms.end()); osrm::json::Array json_array; - for (auto & mwm : usedMwms) + for (auto & mwm : usedChecker.GetUsedMwms()) { osrm::json::Array pointArray; pointArray.values.push_back(mwm.second.x);