diff --git a/generator/road_access_generator.cpp b/generator/road_access_generator.cpp index 24608c29f6..5f019e4930 100644 --- a/generator/road_access_generator.cpp +++ b/generator/road_access_generator.cpp @@ -6,10 +6,6 @@ #include "routing/road_access.hpp" #include "routing/road_access_serialization.hpp" -#include "routing_common/bicycle_model.hpp" -#include "routing_common/car_model.hpp" -#include "routing_common/pedestrian_model.hpp" - #include "indexer/classificator.hpp" #include "indexer/feature.hpp" #include "indexer/feature_data.hpp" @@ -56,18 +52,6 @@ TagMapping const kBicycleTagMapping = { {OsmElement::Tag("bicycle", "no"), RoadAccess::Type::No}, }; -bool IsOneWay(VehicleType vehicleType, FeatureType const & ft) -{ - switch (vehicleType) - { - case VehicleType::Car: return CarModel().AllLimitsInstance().IsOneWay(ft); - case VehicleType::Pedestrian: return PedestrianModel().AllLimitsInstance().IsOneWay(ft); - case VehicleType::Bicycle: return BicycleModel().AllLimitsInstance().IsOneWay(ft); - case VehicleType::Count: return false; - } - return false; -} - bool ParseRoadAccess(string const & roadAccessPath, map const & osmIdToFeatureId, FeaturesVector const & featuresVector, RoadAccessCollector::RoadAccessByVehicleType & roadAccessByVehicleType) @@ -133,28 +117,10 @@ bool ParseRoadAccess(string const & roadAccessPath, map const continue; uint32_t const featureId = it->second; - FeatureType ft; - featuresVector.GetByIndex(featureId, ft); - ft.ParseGeometry(FeatureType::BEST_GEOMETRY); - // An area created from a way. - if (ft.GetPointsCount() == 0) - continue; - - uint32_t const numSegments = static_cast(ft.GetPointsCount() - 1); - - // Set this road access type for the entire feature. - for (uint32_t segmentIdx = 0; segmentIdx < numSegments; ++segmentIdx) - { - addSegment(Segment(kFakeNumMwmId, featureId, segmentIdx, true /* isForward */), vehicleType, - roadAccessType, osmId); - - if (IsOneWay(vehicleType, ft)) - continue; - - addSegment(Segment(kFakeNumMwmId, featureId, segmentIdx, false /* isForward */), vehicleType, - roadAccessType, osmId); - } + addSegment(Segment(kFakeNumMwmId, featureId, 0 /* wildcard segment idx */, + true /* wildcard isForward */), + vehicleType, roadAccessType, osmId); } for (size_t i = 0; i < static_cast(VehicleType::Count); ++i) diff --git a/routing/road_access.cpp b/routing/road_access.cpp index f36a73c795..3286438dcf 100644 --- a/routing/road_access.cpp +++ b/routing/road_access.cpp @@ -19,10 +19,22 @@ RoadAccess::Type const RoadAccess::GetSegmentType(Segment const & segment) const { // todo(@m) This may or may not be too slow. Consider profiling this and using // a Bloom filter or anything else that is faster than std::map. - Segment key(kFakeNumMwmId, segment.GetFeatureId(), segment.GetSegmentIdx(), segment.IsForward()); - auto const it = m_segmentTypes.find(key); - if (it != m_segmentTypes.end()) - return it->second; + + { + Segment key(kFakeNumMwmId, segment.GetFeatureId(), 0 /* wildcard segment idx */, + true /* wildcard isForward */); + auto const it = m_segmentTypes.find(key); + if (it != m_segmentTypes.end()) + return it->second; + } + + { + Segment key(kFakeNumMwmId, segment.GetFeatureId(), segment.GetSegmentIdx() + 1, + segment.IsForward()); + auto const it = m_segmentTypes.find(key); + if (it != m_segmentTypes.end()) + return it->second; + } return RoadAccess::Type::Yes; } diff --git a/routing/road_access.hpp b/routing/road_access.hpp index 32699ae40c..f6c1d8dff8 100644 --- a/routing/road_access.hpp +++ b/routing/road_access.hpp @@ -59,6 +59,10 @@ public: private: // todo(@m) Segment's NumMwmId is not used here. Decouple it from // segment and use only (fid, idx, forward) in the map. + // + // If segmentIdx of a key in this map is 0, it means the + // entire feature has the corresponding access type. + // Otherwise, the information is about the segment with number (segmentIdx-1). std::map m_segmentTypes; };